Opcodes pour l'EVM
Dernière mise à jour de la page : 11 septembre 2025
Vue d'ensemble
Ceci est une version mise à jour de la page de référence de l'EVM sur wolflo/evm-opcodes (opens in a new tab). Également tiré du Yellow Paper (opens in a new tab), du Jello Paper (opens in a new tab) et de l'implémentation geth (opens in a new tab). Ceci est destiné à être une référence accessible, mais ce n'est pas particulièrement rigoureux. Si vous souhaitez être sûr de la précision et conscient de chaque cas limite, il est conseillé d'utiliser le Jello Paper ou une implémentation de client.
À la recherche d'une référence interactive ? Consultez evm.codes (opens in a new tab).
Pour les opérations avec des coûts de gaz dynamiques, voir gas.md (opens in a new tab).
💡 Astuce : pour voir les lignes entières, utilisez [shift] + scroll pour faire défiler horizontalement sur un ordinateur.
| Base | Nom | Gaz | Base | Résultat | Mémoire | 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 (opens in a new tab) | a, b | a ** b | exponentiation uint256 modulo 2**256 | ||
| 0B | SIGNEXTEND | 5 | b, x | SIGNEXTEND(x, b) | extension de signe (opens in a new tab) 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 iszero | ||
| 16 | AND | 3 | a, b | a && b | ET bit à bit | ||
| 17 | OR | 3 | a, b | `a \ | \ | b` | |
| 18 | XOR | 3 | a, b | a ^ b | XOR bit à bit | ||
| 19 | NOT | 3 | a | ~a | NON bit à bit | ||
| 1A | BYTE | 3 | i, x | (x >> (248 - i * 8)) && 0xFF | le i-ème octet de (u)int256 x, en partant de la gauche | ||
| 1B | SHL | 3 | shift, val | val << shift | décalage à gauche | ||
| 1C | SHR | 3 | shift, val | val >> shift | décalage logique à droite | ||
| 1D | SAR | 3 | shift, val | val >> shift | décalage arithmétique à droite | ||
| 1E-1F | invalide | ||||||
| 20 | KECCAK256 | A2 (opens in a new tab) | 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 (opens in a new tab) | 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 | ||
| 34 | CALLVALUE | 2 | . | msg.value | valeur du message, en wei | ||
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | lire le mot à partir des données du message à l'index idx | ||
| 36 | CALLDATASIZE | 2 | . | len(msg.data) | longueur des données du message, en octets | ||
| 37 | CALLDATACOPY | A3 (opens in a new tab) | 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 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | copier le bytecode du contrat en cours d'exécution | |
| 3A | GASPRICE | 2 | . | tx.gasprice | prix du gaz de la transaction, en wei par unité de gaz ** (opens in a new tab) | ||
| 3B | EXTCODESIZE | A5 (opens in a new tab) | addr | len(addr.code) | taille du code à l'adresse, en octets | ||
| 3C | EXTCODECOPY | A4 (opens in a new tab) | 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 (opens in a new tab) | 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 (opens in a new tab) | addr | empreinte numérique | hachage = 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 | . | randomness beacon | balise d'aléa | ||
| 45 | GASLIMIT | 2 | . | block.gaslimit | limite de gaz du bloc actuel | ||
| 46 | CHAINID | 2 | . | chain_id | empiler l'ID de chaîne (opens in a new tab) actuel 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 (opens in a new tab) | ||
| 4A | BLOBBASEFEE | 2 | . | block.blobbasefee | frais de base des blobs du bloc actuel (EIP-7516 (opens in a new tab)) | ||
| 4B-4F | invalide | ||||||
| 50 | POP | 2 | _anon | . | retirer l'élément du sommet de la pile et l'ignorer | ||
| 51 | MLOAD | 3* (opens in a new tab) | ost | mem[ost:ost+32] | lire un mot de la mémoire au décalage ost | ||
| 52 | MSTORE | 3* (opens in a new tab) | ost, val | . | mem[ost:ost+32] := val | écrire un mot en mémoire | |
| 53 | MSTORE8 | 3* (opens in a new tab) | ost, val | . | mem[ost] := val && 0xFF | écrire un seul octet en mémoire | |
| 54 | SLOAD | A6 (opens in a new tab) | key | storage[key] | lire un mot depuis le stockage | ||
| 55 | SSTORE | A7 (opens in a new tab) | key, val | . | storage[key] := val | écrire un mot dans le stockage | |
| 56 | JUMP | 8 | dst | . | $pc := dst marque que pc n'est attribué que si dst est une destination de saut 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 à l'intérieur des données push | |||
| 5C | TLOAD | 100 | key | tstorage[key] | lire un mot depuis le stockage transitoire (EIP-1153 (opens in a new tab)) | ||
| 5D | TSTORE | 100 | key, val | . | tstorage[key] := val | écrire un mot dans le stockage transitoire (EIP-1153 (opens in a new tab)) | |
| 5E | MCOPY | 3+3*words+A0 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst] := mem[ost:ost+len] | copier la mémoire d'une zone à une autre (EIP-5656 (opens in a new tab)) | |
| 5F | PUSH0 | 2 | . | uint8 | push the constant value 0 onto stack | ||
| 60 | PUSH1 | 3 | . | uint8 | empiler une valeur de 1 octet sur la pile | ||
| 61 | PUSH2 | 3 | . | uint16 | empiler une valeur de 2 octets sur la pile | ||
| 62 | PUSH3 | 3 | . | uint24 | empiler une valeur de 3 octets sur la pile | ||
| 63 | PUSH4 | 3 | . | uint32 | empiler une valeur de 4 octets sur la pile | ||
| 64 | PUSH5 | 3 | . | uint40 | empiler une valeur de 5 octets sur la pile | ||
| 65 | PUSH6 | 3 | . | uint48 | empiler une valeur de 6 octets sur la pile | ||
| 66 | PUSH7 | 3 | . | uint56 | empiler une valeur de 7 octets sur la pile | ||
| 67 | PUSH8 | 3 | . | uint64 | empiler une valeur de 8 octets sur la pile | ||
| 68 | PUSH9 | 3 | . | uint72 | empiler une valeur de 9 octets sur la pile | ||
| 69 | PUSH10 | 3 | . | uint80 | empiler une valeur de 10 octets sur la pile | ||
| 6A | PUSH11 | 3 | . | uint88 | empiler une valeur de 11 octets sur la pile | ||
| 6B | PUSH12 | 3 | . | uint96 | empiler une valeur de 12 octets sur la pile | ||
| 6C | PUSH13 | 3 | . | uint104 | empiler une valeur de 13 octets sur la pile | ||
| 6D | PUSH14 | 3 | . | uint112 | empiler une valeur de 14 octets sur la pile | ||
| 6E | PUSH15 | 3 | . | uint120 | empiler une valeur de 15 octets sur la pile | ||
| 6F | PUSH16 | 3 | . | uint128 | empiler une valeur de 16 octets sur la pile | ||
| 70 | PUSH17 | 3 | . | uint136 | empiler une valeur de 17 octets sur la pile | ||
| 71 | PUSH18 | 3 | . | uint144 | empiler une valeur de 18 octets sur la pile | ||
| 72 | PUSH19 | 3 | . | uint152 | empiler une valeur de 19 octets sur la pile | ||
| 73 | PUSH20 | 3 | . | uint160 | empiler une valeur de 20 octets sur la pile | ||
| 74 | PUSH21 | 3 | . | uint168 | empiler une valeur de 21 octets sur la pile | ||
| 75 | PUSH22 | 3 | . | uint176 | empiler une valeur de 22 octets sur la pile | ||
| 76 | PUSH23 | 3 | . | uint184 | empiler une valeur de 23 octets sur la pile | ||
| 77 | PUSH24 | 3 | . | uint192 | empiler une valeur de 24 octets sur la pile | ||
| 78 | PUSH25 | 3 | . | uint200 | empiler une valeur de 25 octets sur la pile | ||
| 79 | PUSH26 | 3 | . | uint208 | empiler une valeur de 26 octets sur la pile | ||
| 7A | PUSH27 | 3 | . | uint216 | empiler une valeur de 27 octets sur la pile | ||
| 7B | PUSH28 | 3 | . | uint224 | empiler une valeur de 28 octets sur la pile | ||
| 7C | PUSH29 | 3 | . | uint232 | empiler une valeur de 29 octets sur la pile | ||
| 7D | PUSH30 | 3 | . | uint240 | empiler une valeur de 30 octets sur la pile | ||
| 7E | PUSH31 | 3 | . | uint248 | empiler une valeur de 31 octets sur la pile | ||
| 7F | PUSH32 | 3 | . | uint256 | empiler une valeur de 32 octets sur la pile | ||
| 80 | DUP1 | 3 | a | a, a | cloner la 1ère valeur de la pile | ||
| 81 | DUP2 | 3 | _, a | a, _, a | cloner la 2e valeur de la pile | ||
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | cloner la 3e valeur de la pile | ||
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | cloner la 4e valeur de la pile | ||
| 84 | DUP5 | 3 | ..., a | a, ..., a | cloner la 5e valeur de la pile | ||
| 85 | DUP6 | 3 | ..., a | a, ..., a | cloner la 6e valeur de la pile | ||
| 86 | DUP7 | 3 | ..., a | a, ..., a | cloner la 7e valeur de la pile | ||
| 87 | DUP8 | 3 | ..., a | a, ..., a | cloner la 8e valeur de la pile | ||
| 88 | DUP9 | 3 | ..., a | a, ..., a | cloner la 9e valeur de la pile | ||
| 89 | DUP10 | 3 | ..., a | a, ..., a | cloner la 10e valeur de la pile | ||
| 8A | DUP11 | 3 | ..., a | a, ..., a | cloner la 11e valeur de la pile | ||
| 8B | DUP12 | 3 | ..., a | a, ..., a | cloner la 12e valeur de la pile | ||
| 8C | DUP13 | 3 | ..., a | a, ..., a | cloner la 13e valeur de la pile | ||
| 8D | DUP14 | 3 | ..., a | a, ..., a | cloner la 14e valeur de la pile | ||
| 8E | DUP15 | 3 | ..., a | a, ..., a | cloner la 15e valeur de la pile | ||
| 8F | DUP16 | 3 | ..., a | a, ..., a | cloner la 16e valeur de 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 (opens in a new tab) | ost, len | . | LOG0(memory[ost:ost+len-1]) | ||
| A1 | LOG1 | A8 (opens in a new tab) | ost, len, topic0 | . | LOG1(memory[ost:ost+len-1], topic0) | ||
| A2 | LOG2 | A8 (opens in a new tab) | ost, len, topic0, topic1 | . | LOG2(memory[ost:ost+len-1], topic0, topic1) | ||
| A3 | LOG3 | A8 (opens in a new tab) | ost, len, topic0, topic1, topic2 | . | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | ||
| A4 | LOG4 | A8 (opens in a new tab) | ost, len, topic0, topic1, topic2, topic3 | . | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | ||
| A5-EF | invalide | ||||||
| F0 | CREATE | A9 (opens in a new tab) | val, ost, len | addr | addr = keccak256(rlp([address(this), this.nonce])) | ||
| F1 | CALL | AA (opens in a new tab) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | ||
| F2 | CALLCODE | AA (opens in a new tab) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] = returndata | identique à DELEGATECALL, mais ne propage pas les msg.sender et msg.value d'origine | |
| F3 | RETOUR | 0* (opens in a new tab) | ost, len | . | retourner mem[ost:ost+len-1] | ||
| F4 | DELEGATECALL | AA (opens in a new tab) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | ||
| F5 | CREATE2 | A9 (opens in a new tab) | val, ost, len, salt | addr | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | ||
| F6-F9 | invalide | ||||||
| FA | STATICCALL | AA (opens in a new tab) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | ||
| FB-FC | invalide | ||||||
| FD | REVERT | 0* (opens in a new tab) | ost, len | . | revert(mem[ost:ost+len-1]) | ||
| FE | INVALID | AF (opens in a new tab) | opcode invalide désigné - EIP-141 (opens in a new tab) | ||||
| FF | SELFDESTRUCT | AB (opens in a new tab) | addr | . | envoie tous les ETH à addr ; si cette instruction est exécutée dans la même transaction que celle de la création d'un contrat, elle détruit ce dernier. |