Codes d'opération pour l'EVM
Il s'agit d'une version mise à jour de la page de référence de l'EVM sur wolflo/evm-opcodes (s'ouvre dans un nouvel onglet). Également tirée du livre jaune (s'ouvre dans un nouvel onglet), du Jello Paper (s'ouvre dans un nouvel onglet) et de l'implémentation geth (s'ouvre dans un nouvel onglet). Ceci est conçu pour être une référence accessible, mais ce n'est pas particulièrement rigoureux. Si vous voulez être certain de l'exactitude et connaître chaque cas particulier, il est conseillé d'utiliser le Jello Paper ou une implémentation de client.
Vous cherchez une référence interactive ? Consultez evm.codes (s'ouvre dans un nouvel onglet).
Pour les opérations avec des coûts de gaz dynamiques, voir gas.md (s'ouvre dans un nouvel onglet).
💡 Astuce rapide : Pour voir les lignes entières, utilisez [shift] + défilement pour faire défiler horizontalement sur ordinateur.
| Pile | Nom | Gaz | Pile initiale | Pile résultante | Mém / Stockage | Notes |
|---|---|---|---|---|---|---|
| 00 | STOP | 0 | arrêter l'exécution | |||
| 01 | ADD | 3 | a, b | a + b | addition (u)int256 modulo 2**256 | |
| 02 | MUL | 5 | a, b | a * b | multiplication (u)int256 modulo 2**256 | |
| 03 | SUB | 3 | a, b | a - b | soustraction (u)int256 modulo 2**256 | |
| 04 | DIV | 5 | a, b | a // b | division uint256 | |
| 05 | SDIV | 5 | a, b | a // b | division int256 | |
| 06 | MOD | 5 | a, b | a % b | modulo uint256 | |
| 07 | SMOD | 5 | a, b | a % b | modulo int256 | |
| 08 | ADDMOD | 8 | a, b, N | (a + b) % N | addition (u)int256 modulo N | |
| 09 | MULMOD | 8 | a, b, N | (a * b) % N | multiplication (u)int256 modulo N | |
| 0A | EXP | A1 (s'ouvre dans un nouvel onglet) | a, b | a ** b | exponentiation uint256 modulo 2**256 | |
| 0B | SIGNEXTEND | 5 | b, x | SIGNEXTEND(x, b) | extension de signe (s'ouvre dans un nouvel onglet) de x de (b+1) octets à 32 octets | |
| 0C-0F | invalide | |||||
| 10 | LT | 3 | a, b | a < b | uint256 inférieur à | |
| 11 | GT | 3 | a, b | a > b | uint256 supérieur à | |
| 12 | SLT | 3 | a, b | a < b | int256 inférieur à | |
| 13 | SGT | 3 | a, b | a > b | int256 supérieur à | |
| 14 | EQ | 3 | a, b | a == b | égalité (u)int256 | |
| 15 | ISZERO | 3 | a | a == 0 | (u)int256 est zéro | |
| 16 | AND | 3 | a, b | a && b | ET au niveau du bit | |
| 17 | OR | 3 | a, b | a || b | OU au niveau du bit | |
| 18 | XOR | 3 | a, b | a ^ b | OU exclusif (XOR) au niveau du bit | |
| 19 | NOT | 3 | a | ~a | NON au niveau du bit | |
| 1A | BYTE | 3 | i, x | (x >> (248 - i * 8)) && 0xFF | ième octet de (u)int256 x, en partant de la gauche | |
| 1B | SHL | 3 | shift, val | val << shift | décalage vers la gauche | |
| 1C | SHR | 3 | shift, val | val >> shift | décalage logique vers la droite | |
| 1D | SAR | 3 | shift, val | val >> shift | décalage arithmétique vers la droite | |
| 1E-1F | invalide | |||||
| 20 | KECCAK256 | A2 (s'ouvre dans un nouvel onglet) | ost, len | keccak256(mem[ost:ost+len-1]) | keccak256 | |
| 21-2F | invalide | |||||
| 30 | ADDRESS | 2 | . | address(this) | adresse du contrat en cours d'exécution | |
| 31 | BALANCE | A5 (s'ouvre dans un nouvel onglet) | addr | addr.balance | solde, en Wei | |
| 32 | ORIGIN | 2 | . | tx.origin | adresse à l'origine de la transaction | |
| 33 | CALLER | 2 | . | msg.sender | adresse de l'expéditeur du message (msg sender) | |
| 34 | CALLVALUE | 2 | . | msg.value | valeur du message, en Wei | |
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | lire un mot des données du message à l'indice idx | |
| 36 | CALLDATASIZE | 2 | . | len(msg.data) | longueur des données du message, en octets | |
| 37 | CALLDATACOPY | A3 (s'ouvre dans un nouvel onglet) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copier les données du message |
| 38 | CODESIZE | 2 | . | len(this.code) | longueur du code du contrat en cours d'exécution, en octets | |
| 39 | CODECOPY | A3 (s'ouvre dans un nouvel onglet) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | |
| 3A | GASPRICE | 2 | . | tx.gasprice | prix du gaz de la transaction, en Wei par unité de gaz ** (s'ouvre dans un nouvel onglet) | |
| 3B | EXTCODESIZE | A5 (s'ouvre dans un nouvel onglet) | addr | len(addr.code) | taille du code à l'adresse, en octets | |
| 3C | EXTCODECOPY | A4 (s'ouvre dans un nouvel onglet) | addr, dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copier le code depuis addr |
| 3D | RETURNDATASIZE | 2 | . | size | taille des données renvoyées par le dernier appel externe, en octets | |
| 3E | RETURNDATACOPY | A3 (s'ouvre dans un nouvel onglet) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copier les données renvoyées par le dernier appel externe |
| 3F | EXTCODEHASH | A5 (s'ouvre dans un nouvel onglet) | addr | hash | hash = addr.exists ? keccak256(addr.code) : 0 | |
| 40 | BLOCKHASH | 20 | blockNum | blockHash(blockNum) | ||
| 41 | COINBASE | 2 | . | block.coinbase | adresse du proposant du bloc actuel | |
| 42 | TIMESTAMP | 2 | . | block.timestamp | horodatage du bloc actuel | |
| 43 | NUMBER | 2 | . | block.number | numéro du bloc actuel | |
| 44 | PREVRANDAO | 2 | . | balise de caractère aléatoire | balise de caractère aléatoire | |
| 45 | GASLIMIT | 2 | . | block.gaslimit | limite de gaz du bloc actuel | |
| 46 | CHAINID | 2 | . | chain_id | pousser l'identifiant de la chaîne (s'ouvre dans un nouvel onglet) actuelle sur la pile | |
| 47 | SELFBALANCE | 5 | . | address(this).balance | solde du contrat en cours d'exécution, en Wei | |
| 48 | BASEFEE | 2 | . | block.basefee | frais de base du bloc actuel | |
| 49 | BLOBHASH | 3 | idx | tx.blob_versioned_hashes[idx] | EIP-4844 (s'ouvre dans un nouvel onglet) | |
| 4A | BLOBBASEFEE | 2 | . | block.blobbasefee | frais de base de blob du bloc actuel (EIP-7516 (s'ouvre dans un nouvel onglet)) | |
| 4B-4F | invalide | |||||
| 50 | POP | 2 | _anon | . | retirer l'élément du haut de la pile et le supprimer | |
| 51 | MLOAD | 3* (s'ouvre dans un nouvel onglet) | ost | mem[ost:ost+32] | lire un mot de la mémoire au décalage ost | |
| 52 | MSTORE | 3* (s'ouvre dans un nouvel onglet) | ost, val | . | mem[ost:ost+32] := val | écrire un mot en mémoire |
| 53 | MSTORE8 | 3* (s'ouvre dans un nouvel onglet) | ost, val | . | mem[ost] := val && 0xFF | écrire un seul octet en mémoire |
| 54 | SLOAD | A6 (s'ouvre dans un nouvel onglet) | key | storage[key] | lire un mot du stockage | |
| 55 | SSTORE | A7 (s'ouvre dans un nouvel onglet) | key, val | . | storage[key] := val | écrire un mot dans le stockage |
| 56 | JUMP | 8 | dst | . | $pc := dst indique que pc n'est assigné que si dst est une destination de saut (jumpdest) valide | |
| 57 | JUMPI | 10 | dst, condition | . | $pc := condition ? dst : $pc + 1 | |
| 58 | PC | 2 | . | $pc | compteur de programme | |
| 59 | MSIZE | 2 | . | len(mem) | taille de la mémoire dans le contexte d'exécution actuel, en octets | |
| 5A | GAS | 2 | . | gasRemaining | ||
| 5B | JUMPDEST | 1 | marquer une destination de saut valide | une destination de saut valide, par exemple une destination de saut qui n'est pas dans les données push | ||
| 5C | TLOAD | 100 | key | tstorage[key] | lire un mot du stockage transitoire (EIP-1153 (s'ouvre dans un nouvel onglet)) | |
| 5D | TSTORE | 100 | key, val | . | tstorage[key] := val | écrire un mot dans le stockage transitoire (EIP-1153 (s'ouvre dans un nouvel onglet)) |
| 5E | MCOPY | 3+3*words+A0 (s'ouvre dans un nouvel onglet) | dstOst, ost, len | . | mem[dstOst] := mem[ost:ost+len] | copier la mémoire d'une zone à une autre (EIP-5656 (s'ouvre dans un nouvel onglet)) |
| 5F | PUSH0 | 2 | . | uint8 | pousser la valeur constante 0 sur la pile | |
| 60 | PUSH1 | 3 | . | uint8 | pousser une valeur de 1 octet sur la pile | |
| 61 | PUSH2 | 3 | . | uint16 | pousser une valeur de 2 octets sur la pile | |
| 62 | PUSH3 | 3 | . | uint24 | pousser une valeur de 3 octets sur la pile | |
| 63 | PUSH4 | 3 | . | uint32 | pousser une valeur de 4 octets sur la pile | |
| 64 | PUSH5 | 3 | . | uint40 | pousser une valeur de 5 octets sur la pile | |
| 65 | PUSH6 | 3 | . | uint48 | pousser une valeur de 6 octets sur la pile | |
| 66 | PUSH7 | 3 | . | uint56 | pousser une valeur de 7 octets sur la pile | |
| 67 | PUSH8 | 3 | . | uint64 | pousser une valeur de 8 octets sur la pile | |
| 68 | PUSH9 | 3 | . | uint72 | pousser une valeur de 9 octets sur la pile | |
| 69 | PUSH10 | 3 | . | uint80 | pousser une valeur de 10 octets sur la pile | |
| 6A | PUSH11 | 3 | . | uint88 | pousser une valeur de 11 octets sur la pile | |
| 6B | PUSH12 | 3 | . | uint96 | pousser une valeur de 12 octets sur la pile | |
| 6C | PUSH13 | 3 | . | uint104 | pousser une valeur de 13 octets sur la pile | |
| 6D | PUSH14 | 3 | . | uint112 | pousser une valeur de 14 octets sur la pile | |
| 6E | PUSH15 | 3 | . | uint120 | pousser une valeur de 15 octets sur la pile | |
| 6F | PUSH16 | 3 | . | uint128 | pousser une valeur de 16 octets sur la pile | |
| 70 | PUSH17 | 3 | . | uint136 | pousser une valeur de 17 octets sur la pile | |
| 71 | PUSH18 | 3 | . | uint144 | pousser une valeur de 18 octets sur la pile | |
| 72 | PUSH19 | 3 | . | uint152 | pousser une valeur de 19 octets sur la pile | |
| 73 | PUSH20 | 3 | . | uint160 | pousser une valeur de 20 octets sur la pile | |
| 74 | PUSH21 | 3 | . | uint168 | pousser une valeur de 21 octets sur la pile | |
| 75 | PUSH22 | 3 | . | uint176 | pousser une valeur de 22 octets sur la pile | |
| 76 | PUSH23 | 3 | . | uint184 | pousser une valeur de 23 octets sur la pile | |
| 77 | PUSH24 | 3 | . | uint192 | pousser une valeur de 24 octets sur la pile | |
| 78 | PUSH25 | 3 | . | uint200 | pousser une valeur de 25 octets sur la pile | |
| 79 | PUSH26 | 3 | . | uint208 | pousser une valeur de 26 octets sur la pile | |
| 7A | PUSH27 | 3 | . | uint216 | pousser une valeur de 27 octets sur la pile | |
| 7B | PUSH28 | 3 | . | uint224 | pousser une valeur de 28 octets sur la pile | |
| 7C | PUSH29 | 3 | . | uint232 | pousser une valeur de 29 octets sur la pile | |
| 7D | PUSH30 | 3 | . | uint240 | pousser une valeur de 30 octets sur la pile | |
| 7E | PUSH31 | 3 | . | uint248 | pousser une valeur de 31 octets sur la pile | |
| 7F | PUSH32 | 3 | . | uint256 | pousser une valeur de 32 octets sur la pile | |
| 80 | DUP1 | 3 | a | a, a | cloner la 1ère valeur sur la pile | |
| 81 | DUP2 | 3 | _, a | a, _, a | cloner la 2ème valeur sur la pile | |
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | cloner la 3ème valeur sur la pile | |
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | cloner la 4ème valeur sur la pile | |
| 84 | DUP5 | 3 | ..., a | a, ..., a | cloner la 5ème valeur sur la pile | |
| 85 | DUP6 | 3 | ..., a | a, ..., a | cloner la 6ème valeur sur la pile | |
| 86 | DUP7 | 3 | ..., a | a, ..., a | cloner la 7ème valeur sur la pile | |
| 87 | DUP8 | 3 | ..., a | a, ..., a | cloner la 8ème valeur sur la pile | |
| 88 | DUP9 | 3 | ..., a | a, ..., a | cloner la 9ème valeur sur la pile | |
| 89 | DUP10 | 3 | ..., a | a, ..., a | cloner la 10ème valeur sur la pile | |
| 8A | DUP11 | 3 | ..., a | a, ..., a | cloner la 11ème valeur sur la pile | |
| 8B | DUP12 | 3 | ..., a | a, ..., a | cloner la 12ème valeur sur la pile | |
| 8C | DUP13 | 3 | ..., a | a, ..., a | cloner la 13ème valeur sur la pile | |
| 8D | DUP14 | 3 | ..., a | a, ..., a | cloner la 14ème valeur sur la pile | |
| 8E | DUP15 | 3 | ..., a | a, ..., a | cloner la 15ème valeur sur la pile | |
| 8F | DUP16 | 3 | ..., a | a, ..., a | cloner la 16ème valeur sur la pile | |
| 90 | SWAP1 | 3 | a, b | b, a | ||
| 91 | SWAP2 | 3 | a, _, b | b, _, a | ||
| 92 | SWAP3 | 3 | a, _, _, b | b, _, _, a | ||
| 93 | SWAP4 | 3 | a, _, _, _, b | b, _, _, _, a | ||
| 94 | SWAP5 | 3 | a, ..., b | b, ..., a | ||
| 95 | SWAP6 | 3 | a, ..., b | b, ..., a | ||
| 96 | SWAP7 | 3 | a, ..., b | b, ..., a | ||
| 97 | SWAP8 | 3 | a, ..., b | b, ..., a | ||
| 98 | SWAP9 | 3 | a, ..., b | b, ..., a | ||
| 99 | SWAP10 | 3 | a, ..., b | b, ..., a | ||
| 9A | SWAP11 | 3 | a, ..., b | b, ..., a | ||
| 9B | SWAP12 | 3 | a, ..., b | b, ..., a | ||
| 9C | SWAP13 | 3 | a, ..., b | b, ..., a | ||
| 9D | SWAP14 | 3 | a, ..., b | b, ..., a | ||
| 9E | SWAP15 | 3 | a, ..., b | b, ..., a | ||
| 9F | SWAP16 | 3 | a, ..., b | b, ..., a | ||
| A0 | LOG0 | A8 (s'ouvre dans un nouvel onglet) | ost, len | . | LOG0(memory[ost:ost+len-1]) | |
| A1 | LOG1 | A8 (s'ouvre dans un nouvel onglet) | ost, len, topic0 | . | LOG1(memory[ost:ost+len-1], topic0) | |
| A2 | LOG2 | A8 (s'ouvre dans un nouvel onglet) | ost, len, topic0, topic1 | . | LOG2(memory[ost:ost+len-1], topic0, topic1) | |
| A3 | LOG3 | A8 (s'ouvre dans un nouvel onglet) | ost, len, topic0, topic1, topic2 | . | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | |
| A4 | LOG4 | A8 (s'ouvre dans un nouvel onglet) | ost, len, topic0, topic1, topic2, topic3 | . | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | |
| A5-EF | invalide | |||||
| F0 | CREATE | A9 (s'ouvre dans un nouvel onglet) | val, ost, len | addr | addr = keccak256(rlp([address(this), this.nonce])) | |
| F1 | CALL | AA (s'ouvre dans un nouvel onglet) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F2 | CALLCODE | AA (s'ouvre dans un nouvel onglet) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] = returndata | identique à DELEGATECALL, mais ne propage pas le msg.sender et la msg.value d'origine |
| F3 | RETURN | 0* (s'ouvre dans un nouvel onglet) | ost, len | . | return mem[ost:ost+len-1] | |
| F4 | DELEGATECALL | AA (s'ouvre dans un nouvel onglet) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F5 | CREATE2 | A9 (s'ouvre dans un nouvel onglet) | val, ost, len, salt | addr | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | |
| F6-F9 | invalide | |||||
| FA | STATICCALL | AA (s'ouvre dans un nouvel onglet) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| FB-FC | invalide | |||||
| FD | REVERT | 0* (s'ouvre dans un nouvel onglet) | ost, len | . | revert(mem[ost:ost+len-1]) | |
| FE | INVALID | AF (s'ouvre dans un nouvel onglet) | code d'opération invalide désigné - EIP-141 (s'ouvre dans un nouvel onglet) | |||
| FF | SELFDESTRUCT | AB (s'ouvre dans un nouvel onglet) | addr | . | envoie tous les ETH à addr ; si exécuté dans la même transaction que celle où un contrat a été créé, il détruit le contrat |