Codes d'opération pour l'EVM
Vue d'ensemble
Il s'agit d'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ée du livre jaune (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 se veut être une référence accessible, mais n'est pas particulièrement rigoureuse. Si vous voulez être certain de l'exactitude et connaître chaque cas particulier, il est conseillé d'utiliser le Jello Paper ou l'implémentation d'un client.
Vous cherchez 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 ordinateur.
| Pile | Nom | Gaz | Pile initiale | Pile résultante | Mém / Stockage | Notes |
|---|---|---|---|---|---|---|
| 00 | STOP | 0 | arrête 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 est zéro | |
| 16 | AND | 3 | a, b | a && b | ET binaire | |
| 17 | OR | 3 | a, b | a || b | OU binaire | |
| 18 | XOR | 3 | a, b | a ^ b | XOR binaire | |
| 19 | NOT | 3 | a | ~a | NON binaire | |
| 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 (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 tx | |
| 33 | CALLER | 2 | . | msg.sender | adresse de l'expéditeur du msg | |
| 34 | CALLVALUE | 2 | . | msg.value | valeur du msg, en Wei | |
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | lit un mot des données du msg à l'indice idx | |
| 36 | CALLDATASIZE | 2 | . | len(msg.data) | longueur des données du msg, en octets | |
| 37 | CALLDATACOPY | A3 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copie les données du msg |
| 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] | |
| 3A | GASPRICE | 2 | . | tx.gasprice | prix du gaz de la tx, 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] | copie le code depuis addr |
| 3D | RETURNDATASIZE | 2 | . | size | taille des données retourné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] | copie les données retournées par le dernier appel externe |
| 3F | EXTCODEHASH | A5 (opens in a new tab) | 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 | . | randomness beacon | balise de caractère aléatoire | |
| 45 | GASLIMIT | 2 | . | block.gaslimit | limite de gaz du bloc actuel | |
| 46 | CHAINID | 2 | . | chain_id | pousse l'identifiant de la chaîne (opens in a new tab) 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 (opens in a new tab) | |
| 4A | BLOBBASEFEE | 2 | . | block.blobbasefee | frais de base de blob du bloc actuel (EIP-7516 (opens in a new tab)) | |
| 4B-4F | invalide | |||||
| 50 | POP | 2 | _anon | . | retire l'élément du haut de la pile et l'ignore | |
| 51 | MLOAD | 3* (opens in a new tab) | ost | mem[ost:ost+32] | lit 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 | écrit un mot en mémoire |
| 53 | MSTORE8 | 3* (opens in a new tab) | ost, val | . | mem[ost] := val && 0xFF | écrit un seul octet en mémoire |
| 54 | SLOAD | A6 (opens in a new tab) | key | storage[key] | lit un mot du stockage | |
| 55 | SSTORE | A7 (opens in a new tab) | key, val | . | storage[key] := val | écrit 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 | marque une destination de saut valide | une destination de saut valide, par exemple une destination de saut qui n'est pas dans les données poussées (push data) | ||
| 5C | TLOAD | 100 | key | tstorage[key] | lit un mot du stockage transitoire (EIP-1153 (opens in a new tab)) | |
| 5D | TSTORE | 100 | key, val | . | tstorage[key] := val | écrit 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] | copie la mémoire d'une zone à une autre (EIP-5656 (opens in a new tab)) |
| 5F | PUSH0 | 2 | . | uint8 | pousse la valeur constante 0 sur la pile | |
| 60 | PUSH1 | 3 | . | uint8 | pousse une valeur de 1 octet sur la pile | |
| 61 | PUSH2 | 3 | . | uint16 | pousse une valeur de 2 octets sur la pile | |
| 62 | PUSH3 | 3 | . | uint24 | pousse une valeur de 3 octets sur la pile | |
| 63 | PUSH4 | 3 | . | uint32 | pousse une valeur de 4 octets sur la pile | |
| 64 | PUSH5 | 3 | . | uint40 | pousse une valeur de 5 octets sur la pile | |
| 65 | PUSH6 | 3 | . | uint48 | pousse une valeur de 6 octets sur la pile | |
| 66 | PUSH7 | 3 | . | uint56 | pousse une valeur de 7 octets sur la pile | |
| 67 | PUSH8 | 3 | . | uint64 | pousse une valeur de 8 octets sur la pile | |
| 68 | PUSH9 | 3 | . | uint72 | pousse une valeur de 9 octets sur la pile | |
| 69 | PUSH10 | 3 | . | uint80 | pousse une valeur de 10 octets sur la pile | |
| 6A | PUSH11 | 3 | . | uint88 | pousse une valeur de 11 octets sur la pile | |
| 6B | PUSH12 | 3 | . | uint96 | pousse une valeur de 12 octets sur la pile | |
| 6C | PUSH13 | 3 | . | uint104 | pousse une valeur de 13 octets sur la pile | |
| 6D | PUSH14 | 3 | . | uint112 | pousse une valeur de 14 octets sur la pile | |
| 6E | PUSH15 | 3 | . | uint120 | pousse une valeur de 15 octets sur la pile | |
| 6F | PUSH16 | 3 | . | uint128 | pousse une valeur de 16 octets sur la pile | |
| 70 | PUSH17 | 3 | . | uint136 | pousse une valeur de 17 octets sur la pile | |
| 71 | PUSH18 | 3 | . | uint144 | pousse une valeur de 18 octets sur la pile | |
| 72 | PUSH19 | 3 | . | uint152 | pousse une valeur de 19 octets sur la pile | |
| 73 | PUSH20 | 3 | . | uint160 | pousse une valeur de 20 octets sur la pile | |
| 74 | PUSH21 | 3 | . | uint168 | pousse une valeur de 21 octets sur la pile | |
| 75 | PUSH22 | 3 | . | uint176 | pousse une valeur de 22 octets sur la pile | |
| 76 | PUSH23 | 3 | . | uint184 | pousse une valeur de 23 octets sur la pile | |
| 77 | PUSH24 | 3 | . | uint192 | pousse une valeur de 24 octets sur la pile | |
| 78 | PUSH25 | 3 | . | uint200 | pousse une valeur de 25 octets sur la pile | |
| 79 | PUSH26 | 3 | . | uint208 | pousse une valeur de 26 octets sur la pile | |
| 7A | PUSH27 | 3 | . | uint216 | pousse une valeur de 27 octets sur la pile | |
| 7B | PUSH28 | 3 | . | uint224 | pousse une valeur de 28 octets sur la pile | |
| 7C | PUSH29 | 3 | . | uint232 | pousse une valeur de 29 octets sur la pile | |
| 7D | PUSH30 | 3 | . | uint240 | pousse une valeur de 30 octets sur la pile | |
| 7E | PUSH31 | 3 | . | uint248 | pousse une valeur de 31 octets sur la pile | |
| 7F | PUSH32 | 3 | . | uint256 | pousse une valeur de 32 octets sur la pile | |
| 80 | DUP1 | 3 | a | a, a | clone la 1ère valeur sur la pile | |
| 81 | DUP2 | 3 | _, a | a, _, a | clone la 2ème valeur sur la pile | |
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | clone la 3ème valeur sur la pile | |
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | clone la 4ème valeur sur la pile | |
| 84 | DUP5 | 3 | ..., a | a, ..., a | clone la 5ème valeur sur la pile | |
| 85 | DUP6 | 3 | ..., a | a, ..., a | clone la 6ème valeur sur la pile | |
| 86 | DUP7 | 3 | ..., a | a, ..., a | clone la 7ème valeur sur la pile | |
| 87 | DUP8 | 3 | ..., a | a, ..., a | clone la 8ème valeur sur la pile | |
| 88 | DUP9 | 3 | ..., a | a, ..., a | clone la 9ème valeur sur la pile | |
| 89 | DUP10 | 3 | ..., a | a, ..., a | clone la 10ème valeur sur la pile | |
| 8A | DUP11 | 3 | ..., a | a, ..., a | clone la 11ème valeur sur la pile | |
| 8B | DUP12 | 3 | ..., a | a, ..., a | clone la 12ème valeur sur la pile | |
| 8C | DUP13 | 3 | ..., a | a, ..., a | clone la 13ème valeur sur la pile | |
| 8D | DUP14 | 3 | ..., a | a, ..., a | clone la 14ème valeur sur la pile | |
| 8E | DUP15 | 3 | ..., a | a, ..., a | clone la 15ème valeur sur la pile | |
| 8F | DUP16 | 3 | ..., a | a, ..., a | clone 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 (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 le msg.sender et msg.value d'origine |
| F3 | RETURN | 0* (opens in a new tab) | ost, len | . | return 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) | code d'opération invalide désigné - EIP-141 (opens in a new tab) | |||
| FF | SELFDESTRUCT | AB (opens in a new tab) | addr | . | envoie tous les ETH à addr ; s'il est exécuté dans la même transaction que celle où un contrat a été créé, il détruit le contrat |