Appendix A: Opcodes Ethereum EVM et consommation de gaz

Bannière Amazon du livre Maîtriser Ethereum

Cette annexe est basée sur le travail de consolidation effectué par les personnes de https://github.com/trailofbits/evm-opcodes comme référence pour les opcodes Ethereum VM (EVM) et les informations d’instruction sous licence Apache License 2.0.

Table 1. Opcodes EVM et coût du gaz
Opcode Nom Description Infos supplémentaires Gaz

0x00

STOP

Arrête l’exécution

-

0

0x01

ADD

Opération d’addition

-

3

0x02

MUL

Opération de multiplication

-

5

0x03

SUB

Opération de soustraction

-

3

0x04

DIV

Opération de division d’entier

-

5

0x05

SDIV

Opération de division d’entier signé (tronqué)

-

5

0x06

MOD

Opération de reste modulo

-

5

0x07

SMOD

Opération de reste modulo signé

-

5

0x08

ADDMOD

Opération d’addition modulo

-

8

0x09

MULMOD

Opération de multiplication modulo

-

8

0x0a

EXP

Opération exponentielle

-

10***

0x0b

SIGNEXTEND

Étend la longueur de l’entier signé complément à deux

-

5

0x0c - 0x0f

Inutilisé

Inutilisé

-

0x10

LT

Comparaison inférieure à

-

3

0x11

GT

Comparaison supérieure à

-

3

0x12

SLT

Comparaison signé inférieur à

-

3

0x13

SGT

Comparaison signé supérieure à

-

3

0x14

EQ

Comparaison d’égalité

-

3

0x15

ISZERO

Opérateur NOT simple

-

3

0x16

AND

Opération AND bit à bit

-

3

0x17

OR

Opération OR bit à bit

-

3

0x18

XOR

Opération XOR bit à bit

-

3

0x19

NOT

Opération NOT au niveau du bit

-

3

0x1a

BYTE

Récupérer un seul octet du mot machine

-

3

0x1b - 0x1f

Inutilisé

Inutilisé

-

0x20

SHA3

Calculer le hachage Keccak-256

-

30

0x21 - 0x2f

Inutilisé

Inutilisé

-

0x30

ADDRESS

Obtenir l’adresse du compte en cours d’exécution

-

2

0x31

BALANCE

Obtenir le solde du compte donné

-

400

0x32

ORIGIN

Obtenir l’adresse d’origine de l’exécution

-

2

0x33

CALLER

Obtenir l’adresse de l’appelant

-

2

0x34

CALLVALUE

Obtenir la valeur déposée par l’instruction/transaction responsable de cette exécution

-

2

0x35

CALLDATALOAD

Obtenir les données d’entrée de l’environnement actuel

-

3

0x36

CALLDATASIZE

Obtenir la taille des données d’entrée dans l’environnement actuel

-

2

0x37

CALLDATACOPY

Copier les données d’entrée dans l’environnement actuel vers la mémoire

-

3

0x38

CODESIZE

Obtenir la taille du code exécuté dans l’environnement actuel

-

2

0x39

CODECOPY

Copier le code en cours d’exécution dans l’environnement actuel vers la mémoire

-

3

0x3a

GASPRICE

Obtenir le prix du gaz dans l’environnement actuel

-

2

0x3b

EXTCODESIZE

Obtenir la taille du code d’un compte

-

700

0x3c

EXTCODECOPY

Copier le code d’un compte en mémoire

-

700

0x3d

RETURNDATASIZE

Pousse la taille du tampon de données de retour sur la pile

EIP-211

2

0x3e

RETURNDATACOPY

Copie les données du tampon de données de retour vers la mémoire

EIP-211

3

0x3f

Inutilisé

-

-

0x40

BLOCKHASH

Obtenir le hachage de l’un des 256 blocs complets les plus récents

-

20

0x41

COINBASE

Obtenir l’adresse du bénéficiaire du bloc

-

2

0x42

TIMESTAMP

Obtenir l’horodatage du bloc

-

2

0x43

NUMBER

Récupérer le numéro du bloc

-

2

0x44

DIFFICULTY

Obtenir la difficulté du bloc

-

2

0x45

GASLIMIT

Obtenir la limite de gaz du bloc

-

2

0x46 - 0x4f

Inutilisé

-

-

0x50

POP

Supprime le mot machine de la pile

-

2

0x51

MLOAD

Charge le mot machine de la mémoire

-

3

0x52

MSTORE

Enregistre le mot machine en mémoire

-

3*

0x53

MSTORE8

Enregistre l’octet en mémoire

-

3

0x54

SLOAD

Charge le mot du stockage

-

200

0x55

SSTORE

Enregistre le mot dans la mémoire

-

0*

0x56

JUMP

Modifie le compteur de programme

-

8

0x57

JUMPI

Modifie conditionnellement le compteur de programme

-

10

0x58

GETPC

Obtient la valeur du compteur de programme avant l’incrément

-

2

0x59

MSIZE

Obtient la taille de la mémoire active en octets

-

2

0x5a

GAS

Obtient la quantité de gaz disponible, y compris la réduction correspondante de la quantité de gaz disponible

-

2

0x5b

JUMPDEST

Marque une destination valide pour les sauts

-

1

0x5c - 0x5f

Inutilisé

-

-

0x60

PUSH1

Place un élément de 1 octet sur la pile

-

3

0x61

PUSH2

Place un élément de 2 octets sur la pile

-

3

0x62

PUSH3

Place un élément de 3 octets sur la pile

-

3

0x63

PUSH4

Place un élément de 4 octets sur la pile

-

3

0x64

PUSH5

Place un élément de 5 octets sur la pile

-

3

0x65

PUSH6

Place un élément de 6 octets sur la pile

-

3

0x66

PUSH7

Place un élément de 7 octets sur la pile

-

3

0x67

PUSH8

Place un élément de 8 octets sur la pile

-

3

0x68

PUSH9

Place un élément de 9 octets sur la pile

-

3

0x69

PUSH10

Place un élément de 10 octets sur la pile

-

3

0x6a

PUSH11

Place un élément de 11 octets sur la pile

-

3

0x6b

PUSH12

Place un élément de 12 octets sur la pile

-

3

0x6c

PUSH13

Place un élément de 13 octets sur la pile

-

3

0x6d

PUSH14

Place un élément de 14 octets sur la pile

-

3

0x6e

PUSH15

Place un élément de 15 octets sur la pile

-

3

0x6f

PUSH16

Place un élément de 16 octets sur la pile

-

3

0x70

PUSH17

Place un élément de 17 octets sur la pile

-

3

0x71

PUSH18

Place un élément de 18 octets sur la pile

-

3

0x72

PUSH19

Place un élément de 19 octets sur la pile

-

3

0x73

PUSH20

Place un élément de 20 octets sur la pile

-

3

0x74

PUSH21

Place un élément de 21 octets sur la pile

-

3

0x75

PUSH22

Place un élément de 22 octets sur la pile

-

3

0x76

PUSH23

Place un élément de 23 octets sur la pile

-

3

0x77

PUSH24

Place un élément de 24 octets sur la pile

-

3

0x78

PUSH25

Place un élément de 25 octets sur la pile

-

3

0x79

PUSH26

Place un élément de 26 octets sur la pile

-

3

0x7a

PUSH27

Place un élément de 27 octets sur la pile

-

3

0x7b

PUSH28

Place un élément de 28 octets sur la pile

-

3

0x7c

PUSH29

Place un élément de 29 octets sur la pile

-

3

0x7d

PUSH30

Place un élément de 30 octets sur la pile

-

3

0x7e

PUSH31

Place un élément de 31 octets sur la pile

-

3

0x7f

PUSH32

Place un élément de 32 octets (mot machine complet) sur la pile

-

3

0x80

DUP1

Duplique le 1er élément de la pile

-

3

0x81

DUP2

Duplique le 2ème élément de la pile

-

3

0x82

DUP3

Duplique le 3ème élément de la pile

-

3

0x83

DUP4

Duplique le 4ème élément de la pile

-

3

0x84

DUP5

Duplique le 5ème élément de la pile

-

3

0x85

DUP6

Duplique le 6ème élément de la pile

-

3

0x86

DUP7

Duplique le 7ème élément de la pile

-

3

0x87

DUP8

Duplique le 8ème élément de la pile

-

3

0x88

DUP9

Duplique le 9ème élément de la pile

-

3

0x89

DUP10

Duplique le 10ème élément de la pile

-

3

0x8a

DUP11

Duplique le 11ème élément de la pile

-

3

0x8b

DUP12

Duplique le 12ème élément de la pile

-

3

0x8c

DUP13

Duplique le 13ème élément de la pile

-

3

0x8d

DUP14

Duplique le 14ème élément de la pile

-

3

0x8e

DUP15

Duplique le 15ème élément de la pile

-

3

0x8f

DUP16

Duplique le 16ème élément de la pile

-

3

0x90

SWAP1

Échange les éléments de la 1ère et de la 2ème pile

-

3

0x91

SWAP2

Échange les éléments de la 1ère et de la 3ème pile

-

3

0x92

SWAP3

Échange les éléments de la 1ère et de la 4ème pile

-

3

0x93

SWAP4

Échange les éléments de la 1ère et de la 5ème pile

-

3

0x94

SWAP5

Échange les éléments de la 1ère et de la 6ème pile

-

3

0x95

SWAP6

Échange des éléments de la 1ère et de la 7ème pile

-

3

0x96

SWAP7

Échange des éléments de la 1ère et de la 8ème pile

-

3

0x97

SWAP8

Échange des éléments de la 1ère et de la 9ème pile

-

3

0x98

SWAP9

Échanger les éléments de la 1ère et de la 10ème pile

-

3

0x99

SWAP10

Échange des éléments de la 1ère et de la 11ème pile

-

3

0x9a

SWAP11

Échange des éléments de la 1ère et de la 12ème pile

-

3

0x9b

SWAP12

Échange des éléments de la 1ère et de la 13ème pile

-

3

0x9c

SWAP13

Échange des éléments de la 1ère et de la 14ème pile

-

3

0x9d

SWAP14

Échange des éléments de la 1ère et de la 15ème pile

-

3

0x9e

SWAP15

Échange des éléments de la 1ère et de la 16ème pile

-

3

0x9f

SWAP16

Échange des éléments de la 1ère et de la 17ème pile

-

3

0xa0

LOG0

Ajoute un enregistrement de journal sans sujet

-

375

0xa1

LOG1

Ajoute un enregistrement de journal avec un sujet

-

750

0xa2

LOG2

Ajoute un enregistrement de journal avec deux sujets

-

1125

0xa3

LOG3

Ajoute un enregistrement de journal avec trois sujets

-

1500

0xa4

LOG4

Ajoute un enregistrement de journal avec quatre sujets

-

1875

0xa5 - 0xaf

Inutilisé

-

-

0xb0

JUMPTO

Provisoire libevmasm a des numéros différents

EIP 615

0xb1

JUMPIF

Provisoire

EIP-615

0xb2

JUMPSUB

Provisoire

EIP-615

0xb4

JUMPSUBV

Provisoire

EIP-615

0xb5

BEGINSUB

Provisoire

EIP-615

0xb6

BEGINDATA

Provisoire

EIP-615

0xb8

RETURNSUB

Provisoire

EIP-615

0xb9

PUTLOCAL

Provisoire

EIP-615

0xba

GETLOCA

Provisoire

EIP-615

0xbb - 0xe0

Inutilisé

-

-

0xe1

SLOADBYTES

Référencé uniquement dans pyethereum

-

-

0xe2

SSTOREBYTES

Référencé uniquement dans pyethereum

-

-

0xe3

SSIZE

Référencé uniquement dans pyethereum

-

-

0xe4 - 0xef

Inutilisé

-

-

0xf0

CREATE

Créer un nouveau compte avec le code associé

-

32000

0xf1

CALL

Message-appel dans un compte

-

Compliqué

0xf2

CALLCODE

Message-call dans ce compte avec un autre code de compte

-

Compliqué

0xf3

RETURN

Arrêter l’exécution renvoyant les données de sortie

-

0

0xf4

DELEGATECALL

Message-call dans ce compte avec le code d’un autre compte, mais persistant dans ce compte avec le code d’un autre compte

-

Compliqué

0xf5

CALLBLACKBOX

-

-

40

0xf6 - 0xf9

Inutilisé

-

-

0xfa

STATICCALL

Semblable à CALL, mais ne modifie pas l’état

-

40

0xfb

CREATE2

Crée un nouveau compte et défini l’adresse de création sur sha3(sender + sha3(init code)) % 2**160

-

0xfc

TXEXECGAS

Pas dans le papier jaune FIXME

-

-

0xfd

REVERT

Arrête l’exécution et annule les changements d’état, sans consommer tout le gaz fourni et sans fournir de raison

-

0

0xfe

INVALID

Instruction invalide désignée

-

0

0xff

SELFDESTRUCT

Arrêter l’exécution et enregistrer le compte pour une suppression ultérieure

-

5000*