Passer au contenu principal
Change page

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.

PileNomGazPile initialePile résultanteMém / StockageNotes
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 (s'ouvre dans un nouvel onglet)a, ba ** bexponentiation uint256 modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)extension de signe (s'ouvre dans un nouvel onglet) 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 est zéro
16AND3a, ba && bET au niveau du bit
17OR3a, ba || bOU au niveau du bit
18XOR3a, ba ^ bOU exclusif (XOR) au niveau du bit
19NOT3a~aNON au niveau du bit
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFième octet de (u)int256 x, en partant de la gauche
1BSHL3shift, valval << shiftdécalage vers la gauche
1CSHR3shift, valval >> shiftdécalage logique vers la droite
1DSAR3shift, valval >> shiftdécalage arithmétique vers la droite
1E-1Finvalide
20KECCAK256A2 (s'ouvre dans un nouvel onglet)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Finvalide
30ADDRESS2.address(this)adresse du contrat en cours d'exécution
31BALANCEA5 (s'ouvre dans un nouvel onglet)addraddr.balancesolde, en Wei
32ORIGIN2.tx.originadresse à l'origine de la transaction
33CALLER2.msg.senderadresse de l'expéditeur du message (msg sender)
34CALLVALUE2.msg.valuevaleur du message, en Wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]lire un mot des données du message à l'indice idx
36CALLDATASIZE2.len(msg.data)longueur des données du message, en octets
37CALLDATACOPYA3 (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
38CODESIZE2.len(this.code)longueur du code du contrat en cours d'exécution, en octets
39CODECOPYA3 (s'ouvre dans un nouvel onglet)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspriceprix du gaz de la transaction, en Wei par unité de gaz ** (s'ouvre dans un nouvel onglet)
3BEXTCODESIZEA5 (s'ouvre dans un nouvel onglet)addrlen(addr.code)taille du code à l'adresse, en octets
3CEXTCODECOPYA4 (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
3DRETURNDATASIZE2.sizetaille des données renvoyées par le dernier appel externe, en octets
3ERETURNDATACOPYA3 (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
3FEXTCODEHASHA5 (s'ouvre dans un nouvel onglet)addrhashhash = 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.balise de caractère aléatoirebalise de caractère aléatoire
45GASLIMIT2.block.gaslimitlimite de gaz du bloc actuel
46CHAINID2.chain_idpousser l'identifiant de la chaîne (s'ouvre dans un nouvel onglet) actuelle 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 (s'ouvre dans un nouvel onglet)
4ABLOBBASEFEE2.block.blobbasefeefrais de base de blob du bloc actuel (EIP-7516 (s'ouvre dans un nouvel onglet))
4B-4Finvalide
50POP2_anon.retirer l'élément du haut de la pile et le supprimer
51MLOAD3* (s'ouvre dans un nouvel onglet)ostmem[ost:ost+32]lire un mot de la mémoire au décalage ost
52MSTORE3* (s'ouvre dans un nouvel onglet)ost, val.mem[ost:ost+32] := valécrire un mot en mémoire
53MSTORE83* (s'ouvre dans un nouvel onglet)ost, val.mem[ost] := val && 0xFFécrire un seul octet en mémoire
54SLOADA6 (s'ouvre dans un nouvel onglet)keystorage[key]lire un mot du stockage
55SSTOREA7 (s'ouvre dans un nouvel onglet)key, val.storage[key] := valécrire un mot dans le stockage
56JUMP8dst.$pc := dst indique que pc n'est assigné que si dst est une destination de saut (jumpdest) 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 dans les données push
5CTLOAD100keytstorage[key]lire un mot du stockage transitoire (EIP-1153 (s'ouvre dans un nouvel onglet))
5DTSTORE100key, val.tstorage[key] := valécrire un mot dans le stockage transitoire (EIP-1153 (s'ouvre dans un nouvel onglet))
5EMCOPY3+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))
5FPUSH02.uint8pousser la valeur constante 0 sur la pile
60PUSH13.uint8pousser une valeur de 1 octet sur la pile
61PUSH23.uint16pousser une valeur de 2 octets sur la pile
62PUSH33.uint24pousser une valeur de 3 octets sur la pile
63PUSH43.uint32pousser une valeur de 4 octets sur la pile
64PUSH53.uint40pousser une valeur de 5 octets sur la pile
65PUSH63.uint48pousser une valeur de 6 octets sur la pile
66PUSH73.uint56pousser une valeur de 7 octets sur la pile
67PUSH83.uint64pousser une valeur de 8 octets sur la pile
68PUSH93.uint72pousser une valeur de 9 octets sur la pile
69PUSH103.uint80pousser une valeur de 10 octets sur la pile
6APUSH113.uint88pousser une valeur de 11 octets sur la pile
6BPUSH123.uint96pousser une valeur de 12 octets sur la pile
6CPUSH133.uint104pousser une valeur de 13 octets sur la pile
6DPUSH143.uint112pousser une valeur de 14 octets sur la pile
6EPUSH153.uint120pousser une valeur de 15 octets sur la pile
6FPUSH163.uint128pousser une valeur de 16 octets sur la pile
70PUSH173.uint136pousser une valeur de 17 octets sur la pile
71PUSH183.uint144pousser une valeur de 18 octets sur la pile
72PUSH193.uint152pousser une valeur de 19 octets sur la pile
73PUSH203.uint160pousser une valeur de 20 octets sur la pile
74PUSH213.uint168pousser une valeur de 21 octets sur la pile
75PUSH223.uint176pousser une valeur de 22 octets sur la pile
76PUSH233.uint184pousser une valeur de 23 octets sur la pile
77PUSH243.uint192pousser une valeur de 24 octets sur la pile
78PUSH253.uint200pousser une valeur de 25 octets sur la pile
79PUSH263.uint208pousser une valeur de 26 octets sur la pile
7APUSH273.uint216pousser une valeur de 27 octets sur la pile
7BPUSH283.uint224pousser une valeur de 28 octets sur la pile
7CPUSH293.uint232pousser une valeur de 29 octets sur la pile
7DPUSH303.uint240pousser une valeur de 30 octets sur la pile
7EPUSH313.uint248pousser une valeur de 31 octets sur la pile
7FPUSH323.uint256pousser une valeur de 32 octets sur la pile
80DUP13aa, acloner la 1ère valeur sur la pile
81DUP23_, aa, _, acloner la 2ème valeur sur la pile
82DUP33_, _, aa, _, _, acloner la 3ème valeur sur la pile
83DUP43_, _, _, aa, _, _, _, acloner la 4ème valeur sur la pile
84DUP53..., aa, ..., acloner la 5ème valeur sur la pile
85DUP63..., aa, ..., acloner la 6ème valeur sur la pile
86DUP73..., aa, ..., acloner la 7ème valeur sur la pile
87DUP83..., aa, ..., acloner la 8ème valeur sur la pile
88DUP93..., aa, ..., acloner la 9ème valeur sur la pile
89DUP103..., aa, ..., acloner la 10ème valeur sur la pile
8ADUP113..., aa, ..., acloner la 11ème valeur sur la pile
8BDUP123..., aa, ..., acloner la 12ème valeur sur la pile
8CDUP133..., aa, ..., acloner la 13ème valeur sur la pile
8DDUP143..., aa, ..., acloner la 14ème valeur sur la pile
8EDUP153..., aa, ..., acloner la 15ème valeur sur la pile
8FDUP163..., aa, ..., acloner la 16ème valeur sur 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 (s'ouvre dans un nouvel onglet)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (s'ouvre dans un nouvel onglet)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (s'ouvre dans un nouvel onglet)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (s'ouvre dans un nouvel onglet)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (s'ouvre dans un nouvel onglet)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFinvalide
F0CREATEA9 (s'ouvre dans un nouvel onglet)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (s'ouvre dans un nouvel onglet)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (s'ouvre dans un nouvel onglet)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndataidentique à DELEGATECALL, mais ne propage pas le msg.sender et la msg.value d'origine
F3RETURN0* (s'ouvre dans un nouvel onglet)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (s'ouvre dans un nouvel onglet)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (s'ouvre dans un nouvel onglet)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9invalide
FASTATICCALLAA (s'ouvre dans un nouvel onglet)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCinvalide
FDREVERT0* (s'ouvre dans un nouvel onglet)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (s'ouvre dans un nouvel onglet)code d'opération invalide désigné - EIP-141 (s'ouvre dans un nouvel onglet)
FFSELFDESTRUCTAB (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