Appendix A: Opcodes Ethereum EVM et consommation de gaz
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.
Opcode | Nom | Description | Infos supplémentaires | Gaz |
---|---|---|---|---|
|
STOP |
Arrête l’exécution |
- |
0 |
|
ADD |
Opération d’addition |
- |
3 |
|
MUL |
Opération de multiplication |
- |
5 |
|
SUB |
Opération de soustraction |
- |
3 |
|
DIV |
Opération de division d’entier |
- |
5 |
|
SDIV |
Opération de division d’entier signé (tronqué) |
- |
5 |
|
MOD |
Opération de reste modulo |
- |
5 |
|
SMOD |
Opération de reste modulo signé |
- |
5 |
|
ADDMOD |
Opération d’addition modulo |
- |
8 |
|
MULMOD |
Opération de multiplication modulo |
- |
8 |
|
EXP |
Opération exponentielle |
- |
10*** |
|
SIGNEXTEND |
Étend la longueur de l’entier signé complément à deux |
- |
5 |
|
Inutilisé |
Inutilisé |
- |
|
|
LT |
Comparaison inférieure à |
- |
3 |
|
GT |
Comparaison supérieure à |
- |
3 |
|
SLT |
Comparaison signé inférieur à |
- |
3 |
|
SGT |
Comparaison signé supérieure à |
- |
3 |
|
EQ |
Comparaison d’égalité |
- |
3 |
|
ISZERO |
Opérateur NOT simple |
- |
3 |
|
AND |
Opération AND bit à bit |
- |
3 |
|
OR |
Opération OR bit à bit |
- |
3 |
|
XOR |
Opération XOR bit à bit |
- |
3 |
|
NOT |
Opération NOT au niveau du bit |
- |
3 |
|
BYTE |
Récupérer un seul octet du mot machine |
- |
3 |
|
Inutilisé |
Inutilisé |
- |
|
|
SHA3 |
Calculer le hachage Keccak-256 |
- |
30 |
|
Inutilisé |
Inutilisé |
- |
|
|
ADDRESS |
Obtenir l’adresse du compte en cours d’exécution |
- |
2 |
|
BALANCE |
Obtenir le solde du compte donné |
- |
400 |
|
ORIGIN |
Obtenir l’adresse d’origine de l’exécution |
- |
2 |
|
CALLER |
Obtenir l’adresse de l’appelant |
- |
2 |
|
CALLVALUE |
Obtenir la valeur déposée par l’instruction/transaction responsable de cette exécution |
- |
2 |
|
CALLDATALOAD |
Obtenir les données d’entrée de l’environnement actuel |
- |
3 |
|
CALLDATASIZE |
Obtenir la taille des données d’entrée dans l’environnement actuel |
- |
2 |
|
CALLDATACOPY |
Copier les données d’entrée dans l’environnement actuel vers la mémoire |
- |
3 |
|
CODESIZE |
Obtenir la taille du code exécuté dans l’environnement actuel |
- |
2 |
|
CODECOPY |
Copier le code en cours d’exécution dans l’environnement actuel vers la mémoire |
- |
3 |
|
GASPRICE |
Obtenir le prix du gaz dans l’environnement actuel |
- |
2 |
|
EXTCODESIZE |
Obtenir la taille du code d’un compte |
- |
700 |
|
EXTCODECOPY |
Copier le code d’un compte en mémoire |
- |
700 |
|
RETURNDATASIZE |
Pousse la taille du tampon de données de retour sur la pile |
2 |
|
|
RETURNDATACOPY |
Copie les données du tampon de données de retour vers la mémoire |
3 |
|
|
Inutilisé |
- |
- |
|
|
BLOCKHASH |
Obtenir le hachage de l’un des 256 blocs complets les plus récents |
- |
20 |
|
COINBASE |
Obtenir l’adresse du bénéficiaire du bloc |
- |
2 |
|
TIMESTAMP |
Obtenir l’horodatage du bloc |
- |
2 |
|
NUMBER |
Récupérer le numéro du bloc |
- |
2 |
|
DIFFICULTY |
Obtenir la difficulté du bloc |
- |
2 |
|
GASLIMIT |
Obtenir la limite de gaz du bloc |
- |
2 |
|
Inutilisé |
- |
- |
|
|
POP |
Supprime le mot machine de la pile |
- |
2 |
|
MLOAD |
Charge le mot machine de la mémoire |
- |
3 |
|
MSTORE |
Enregistre le mot machine en mémoire |
- |
3* |
|
MSTORE8 |
Enregistre l’octet en mémoire |
- |
3 |
|
SLOAD |
Charge le mot du stockage |
- |
200 |
|
SSTORE |
Enregistre le mot dans la mémoire |
- |
0* |
|
JUMP |
Modifie le compteur de programme |
- |
8 |
|
JUMPI |
Modifie conditionnellement le compteur de programme |
- |
10 |
|
GETPC |
Obtient la valeur du compteur de programme avant l’incrément |
- |
2 |
|
MSIZE |
Obtient la taille de la mémoire active en octets |
- |
2 |
|
GAS |
Obtient la quantité de gaz disponible, y compris la réduction correspondante de la quantité de gaz disponible |
- |
2 |
|
JUMPDEST |
Marque une destination valide pour les sauts |
- |
1 |
|
Inutilisé |
- |
- |
|
|
PUSH1 |
Place un élément de 1 octet sur la pile |
- |
3 |
|
PUSH2 |
Place un élément de 2 octets sur la pile |
- |
3 |
|
PUSH3 |
Place un élément de 3 octets sur la pile |
- |
3 |
|
PUSH4 |
Place un élément de 4 octets sur la pile |
- |
3 |
|
PUSH5 |
Place un élément de 5 octets sur la pile |
- |
3 |
|
PUSH6 |
Place un élément de 6 octets sur la pile |
- |
3 |
|
PUSH7 |
Place un élément de 7 octets sur la pile |
- |
3 |
|
PUSH8 |
Place un élément de 8 octets sur la pile |
- |
3 |
|
PUSH9 |
Place un élément de 9 octets sur la pile |
- |
3 |
|
PUSH10 |
Place un élément de 10 octets sur la pile |
- |
3 |
|
PUSH11 |
Place un élément de 11 octets sur la pile |
- |
3 |
|
PUSH12 |
Place un élément de 12 octets sur la pile |
- |
3 |
|
PUSH13 |
Place un élément de 13 octets sur la pile |
- |
3 |
|
PUSH14 |
Place un élément de 14 octets sur la pile |
- |
3 |
|
PUSH15 |
Place un élément de 15 octets sur la pile |
- |
3 |
|
PUSH16 |
Place un élément de 16 octets sur la pile |
- |
3 |
|
PUSH17 |
Place un élément de 17 octets sur la pile |
- |
3 |
|
PUSH18 |
Place un élément de 18 octets sur la pile |
- |
3 |
|
PUSH19 |
Place un élément de 19 octets sur la pile |
- |
3 |
|
PUSH20 |
Place un élément de 20 octets sur la pile |
- |
3 |
|
PUSH21 |
Place un élément de 21 octets sur la pile |
- |
3 |
|
PUSH22 |
Place un élément de 22 octets sur la pile |
- |
3 |
|
PUSH23 |
Place un élément de 23 octets sur la pile |
- |
3 |
|
PUSH24 |
Place un élément de 24 octets sur la pile |
- |
3 |
|
PUSH25 |
Place un élément de 25 octets sur la pile |
- |
3 |
|
PUSH26 |
Place un élément de 26 octets sur la pile |
- |
3 |
|
PUSH27 |
Place un élément de 27 octets sur la pile |
- |
3 |
|
PUSH28 |
Place un élément de 28 octets sur la pile |
- |
3 |
|
PUSH29 |
Place un élément de 29 octets sur la pile |
- |
3 |
|
PUSH30 |
Place un élément de 30 octets sur la pile |
- |
3 |
|
PUSH31 |
Place un élément de 31 octets sur la pile |
- |
3 |
|
PUSH32 |
Place un élément de 32 octets (mot machine complet) sur la pile |
- |
3 |
|
DUP1 |
Duplique le 1er élément de la pile |
- |
3 |
|
DUP2 |
Duplique le 2ème élément de la pile |
- |
3 |
|
DUP3 |
Duplique le 3ème élément de la pile |
- |
3 |
|
DUP4 |
Duplique le 4ème élément de la pile |
- |
3 |
|
DUP5 |
Duplique le 5ème élément de la pile |
- |
3 |
|
DUP6 |
Duplique le 6ème élément de la pile |
- |
3 |
|
DUP7 |
Duplique le 7ème élément de la pile |
- |
3 |
|
DUP8 |
Duplique le 8ème élément de la pile |
- |
3 |
|
DUP9 |
Duplique le 9ème élément de la pile |
- |
3 |
|
DUP10 |
Duplique le 10ème élément de la pile |
- |
3 |
|
DUP11 |
Duplique le 11ème élément de la pile |
- |
3 |
|
DUP12 |
Duplique le 12ème élément de la pile |
- |
3 |
|
DUP13 |
Duplique le 13ème élément de la pile |
- |
3 |
|
DUP14 |
Duplique le 14ème élément de la pile |
- |
3 |
|
DUP15 |
Duplique le 15ème élément de la pile |
- |
3 |
|
DUP16 |
Duplique le 16ème élément de la pile |
- |
3 |
|
SWAP1 |
Échange les éléments de la 1ère et de la 2ème pile |
- |
3 |
|
SWAP2 |
Échange les éléments de la 1ère et de la 3ème pile |
- |
3 |
|
SWAP3 |
Échange les éléments de la 1ère et de la 4ème pile |
- |
3 |
|
SWAP4 |
Échange les éléments de la 1ère et de la 5ème pile |
- |
3 |
|
SWAP5 |
Échange les éléments de la 1ère et de la 6ème pile |
- |
3 |
|
SWAP6 |
Échange des éléments de la 1ère et de la 7ème pile |
- |
3 |
|
SWAP7 |
Échange des éléments de la 1ère et de la 8ème pile |
- |
3 |
|
SWAP8 |
Échange des éléments de la 1ère et de la 9ème pile |
- |
3 |
|
SWAP9 |
Échanger les éléments de la 1ère et de la 10ème pile |
- |
3 |
|
SWAP10 |
Échange des éléments de la 1ère et de la 11ème pile |
- |
3 |
|
SWAP11 |
Échange des éléments de la 1ère et de la 12ème pile |
- |
3 |
|
SWAP12 |
Échange des éléments de la 1ère et de la 13ème pile |
- |
3 |
|
SWAP13 |
Échange des éléments de la 1ère et de la 14ème pile |
- |
3 |
|
SWAP14 |
Échange des éléments de la 1ère et de la 15ème pile |
- |
3 |
|
SWAP15 |
Échange des éléments de la 1ère et de la 16ème pile |
- |
3 |
|
SWAP16 |
Échange des éléments de la 1ère et de la 17ème pile |
- |
3 |
|
LOG0 |
Ajoute un enregistrement de journal sans sujet |
- |
375 |
|
LOG1 |
Ajoute un enregistrement de journal avec un sujet |
- |
750 |
|
LOG2 |
Ajoute un enregistrement de journal avec deux sujets |
- |
1125 |
|
LOG3 |
Ajoute un enregistrement de journal avec trois sujets |
- |
1500 |
|
LOG4 |
Ajoute un enregistrement de journal avec quatre sujets |
- |
1875 |
|
Inutilisé |
- |
- |
|
|
JUMPTO |
Provisoire libevmasm a des numéros différents |
||
|
JUMPIF |
Provisoire |
||
|
JUMPSUB |
Provisoire |
||
|
JUMPSUBV |
Provisoire |
||
|
BEGINSUB |
Provisoire |
||
|
BEGINDATA |
Provisoire |
||
|
RETURNSUB |
Provisoire |
||
|
PUTLOCAL |
Provisoire |
||
|
GETLOCA |
Provisoire |
||
|
Inutilisé |
- |
- |
|
|
SLOADBYTES |
Référencé uniquement dans pyethereum |
- |
- |
|
SSTOREBYTES |
Référencé uniquement dans pyethereum |
- |
- |
|
SSIZE |
Référencé uniquement dans pyethereum |
- |
- |
|
Inutilisé |
- |
- |
|
|
CREATE |
Créer un nouveau compte avec le code associé |
- |
32000 |
|
CALL |
Message-appel dans un compte |
- |
Compliqué |
|
CALLCODE |
Message-call dans ce compte avec un autre code de compte |
- |
Compliqué |
|
RETURN |
Arrêter l’exécution renvoyant les données de sortie |
- |
0 |
|
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é |
|
CALLBLACKBOX |
- |
- |
40 |
|
Inutilisé |
- |
- |
|
|
STATICCALL |
Semblable à |
- |
40 |
|
CREATE2 |
Crée un nouveau compte et défini l’adresse de création sur |
- |
|
|
TXEXECGAS |
Pas dans le papier jaune FIXME |
- |
- |
|
REVERT |
Arrête l’exécution et annule les changements d’état, sans consommer tout le gaz fourni et sans fournir de raison |
- |
0 |
|
INVALID |
Instruction invalide désignée |
- |
0 |
|
SELFDESTRUCT |
Arrêter l’exécution et enregistrer le compte pour une suppression ultérieure |
- |
5000* |