Passer au contenu principal
Change page

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.

BaseNomGazBaseRésultatMémoireNotes
00STOP0arrêter l'exécution
01ADD3a, ba + baddition (u)int256 modulo 2**256
02MUL5a, ba * bmultiplication (u)int256 modulo 2**256
03SUB3a, ba - bsoustraction (u)int256 modulo 2**256
04DIV5a, ba // bdivision uint256
05SDIV5a, ba // bdivision int256
06MOD5a, ba % bmodulo uint256
07SMOD5a, ba % bmodulo int256
08ADDMOD8a, b, N(a + b) % Naddition (u)int256 modulo N
09MULMOD8a, b, N(a * b) % Nmultiplication (u)int256 modulo N
0AEXPA1 (opens in a new tab)a, ba ** bexponentiation uint256 modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)extension de signe (opens in a new tab) de x de (b+1) octets à 32 octets
0C-0Finvalide
10LT3a, ba < buint256 inférieur à
11GT3a, ba > buint256 supérieur à
12SLT3a, ba < bint256 inférieur à
13SGT3a, ba > bint256 supérieur à
14EQ3a, ba == bégalité (u)int256
15ISZERO3aa == 0(u)int256 iszero
16AND3a, ba && bET bit à bit
17OR3a, b`a \\b`
18XOR3a, ba ^ bXOR bit à bit
19NOT3a~aNON bit à bit
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFle i-ème octet de (u)int256 x, en partant de la gauche
1BSHL3shift, valval << shiftdécalage à gauche
1CSHR3shift, valval >> shiftdécalage logique à droite
1DSAR3shift, valval >> shiftdécalage arithmétique à droite
1E-1Finvalide
20KECCAK256A2 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Finvalide
30ADDRESS2.address(this)adresse du contrat en cours d'exécution
31BALANCEA5 (opens in a new tab)addraddr.balancesolde, en wei
32ORIGIN2.tx.originadresse à l'origine de la transaction
33CALLER2.msg.senderadresse de l'expéditeur du message
34CALLVALUE2.msg.valuevaleur du message, en wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]lire le mot à partir des données du message à l'index idx
36CALLDATASIZE2.len(msg.data)longueur des données du message, en octets
37CALLDATACOPYA3 (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
38CODESIZE2.len(this.code)longueur du code du contrat en cours d'exécution, en octets
39CODECOPYA3 (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
3AGASPRICE2.tx.gaspriceprix du gaz de la transaction, en wei par unité de gaz ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)taille du code à l'adresse, en octets
3CEXTCODECOPYA4 (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
3DRETURNDATASIZE2.sizetaille des données renvoyées par le dernier appel externe, en octets
3ERETURNDATACOPYA3 (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
3FEXTCODEHASHA5 (opens in a new tab)addrempreinte numériquehachage = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbaseadresse du proposant du bloc actuel
42TIMESTAMP2.block.timestamphorodatage du bloc actuel
43NUMBER2.block.numbernuméro du bloc actuel
44PREVRANDAO2.randomness beaconbalise d'aléa
45GASLIMIT2.block.gaslimitlimite de gaz du bloc actuel
46CHAINID2.chain_idempiler l'ID de chaîne (opens in a new tab) actuel sur la pile
47SELFBALANCE5.address(this).balancesolde du contrat en cours d'exécution, en wei
48BASEFEE2.block.basefeefrais de base du bloc actuel
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeefrais de base des blobs du bloc actuel (EIP-7516 (opens in a new tab))
4B-4Finvalide
50POP2_anon.retirer l'élément du sommet de la pile et l'ignorer
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]lire un mot de la mémoire au décalage ost
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valécrire un mot en mémoire
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFécrire un seul octet en mémoire
54SLOADA6 (opens in a new tab)keystorage[key]lire un mot depuis le stockage
55SSTOREA7 (opens in a new tab)key, val.storage[key] := valécrire un mot dans le stockage
56JUMP8dst.$pc := dst marque que pc n'est attribué que si dst est une destination de saut valide
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1`
58PC2.$pccompteur de programme
59MSIZE2.len(mem)taille de la mémoire dans le contexte d'exécution actuel, en octets
5AGAS2.gasRemaining
5BJUMPDEST1marquer une destination de saut valideune destination de saut valide, par exemple une destination de saut qui n'est pas à l'intérieur des données push
5CTLOAD100keytstorage[key]lire un mot depuis le stockage transitoire (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := valécrire un mot dans le stockage transitoire (EIP-1153 (opens in a new tab))
5EMCOPY3+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))
5FPUSH02.uint8push the constant value 0 onto stack
60PUSH13.uint8empiler une valeur de 1 octet sur la pile
61PUSH23.uint16empiler une valeur de 2 octets sur la pile
62PUSH33.uint24empiler une valeur de 3 octets sur la pile
63PUSH43.uint32empiler une valeur de 4 octets sur la pile
64PUSH53.uint40empiler une valeur de 5 octets sur la pile
65PUSH63.uint48empiler une valeur de 6 octets sur la pile
66PUSH73.uint56empiler une valeur de 7 octets sur la pile
67PUSH83.uint64empiler une valeur de 8 octets sur la pile
68PUSH93.uint72empiler une valeur de 9 octets sur la pile
69PUSH103.uint80empiler une valeur de 10 octets sur la pile
6APUSH113.uint88empiler une valeur de 11 octets sur la pile
6BPUSH123.uint96empiler une valeur de 12 octets sur la pile
6CPUSH133.uint104empiler une valeur de 13 octets sur la pile
6DPUSH143.uint112empiler une valeur de 14 octets sur la pile
6EPUSH153.uint120empiler une valeur de 15 octets sur la pile
6FPUSH163.uint128empiler une valeur de 16 octets sur la pile
70PUSH173.uint136empiler une valeur de 17 octets sur la pile
71PUSH183.uint144empiler une valeur de 18 octets sur la pile
72PUSH193.uint152empiler une valeur de 19 octets sur la pile
73PUSH203.uint160empiler une valeur de 20 octets sur la pile
74PUSH213.uint168empiler une valeur de 21 octets sur la pile
75PUSH223.uint176empiler une valeur de 22 octets sur la pile
76PUSH233.uint184empiler une valeur de 23 octets sur la pile
77PUSH243.uint192empiler une valeur de 24 octets sur la pile
78PUSH253.uint200empiler une valeur de 25 octets sur la pile
79PUSH263.uint208empiler une valeur de 26 octets sur la pile
7APUSH273.uint216empiler une valeur de 27 octets sur la pile
7BPUSH283.uint224empiler une valeur de 28 octets sur la pile
7CPUSH293.uint232empiler une valeur de 29 octets sur la pile
7DPUSH303.uint240empiler une valeur de 30 octets sur la pile
7EPUSH313.uint248empiler une valeur de 31 octets sur la pile
7FPUSH323.uint256empiler une valeur de 32 octets sur la pile
80DUP13aa, acloner la 1ère valeur de la pile
81DUP23_, aa, _, acloner la 2e valeur de la pile
82DUP33_, _, aa, _, _, acloner la 3e valeur de la pile
83DUP43_, _, _, aa, _, _, _, acloner la 4e valeur de la pile
84DUP53..., aa, ..., acloner la 5e valeur de la pile
85DUP63..., aa, ..., acloner la 6e valeur de la pile
86DUP73..., aa, ..., acloner la 7e valeur de la pile
87DUP83..., aa, ..., acloner la 8e valeur de la pile
88DUP93..., aa, ..., acloner la 9e valeur de la pile
89DUP103..., aa, ..., acloner la 10e valeur de la pile
8ADUP113..., aa, ..., acloner la 11e valeur de la pile
8BDUP123..., aa, ..., acloner la 12e valeur de la pile
8CDUP133..., aa, ..., acloner la 13e valeur de la pile
8DDUP143..., aa, ..., acloner la 14e valeur de la pile
8EDUP153..., aa, ..., acloner la 15e valeur de la pile
8FDUP163..., aa, ..., acloner la 16e valeur de la pile
90SWAP13a, bb, a
91SWAP23a, _, bb, _, a
92SWAP33a, _, _, bb, _, _, a
93SWAP43a, _, _, _, bb, _, _, _, a
94SWAP53a, ..., bb, ..., a
95SWAP63a, ..., bb, ..., a
96SWAP73a, ..., bb, ..., a
97SWAP83a, ..., bb, ..., a
98SWAP93a, ..., bb, ..., a
99SWAP103a, ..., bb, ..., a
9ASWAP113a, ..., bb, ..., a
9BSWAP123a, ..., bb, ..., a
9CSWAP133a, ..., bb, ..., a
9DSWAP143a, ..., bb, ..., a
9ESWAP153a, ..., bb, ..., a
9FSWAP163a, ..., bb, ..., a
A0LOG0A8 (opens in a new tab)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (opens in a new tab)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (opens in a new tab)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (opens in a new tab)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (opens in a new tab)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFinvalide
F0CREATEA9 (opens in a new tab)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndataidentique à DELEGATECALL, mais ne propage pas les msg.sender et msg.value d'origine
F3RETOUR0* (opens in a new tab)ost, len.retourner mem[ost:ost+len-1]
F4DELEGATECALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (opens in a new tab)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9invalide
FASTATICCALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCinvalide
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)opcode invalide désigné - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (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.

Cet article vous a été utile ?