Vai al contenuto principale
Change page

Codici operativi (opcode) per l'EVM

Panoramica

Questa è una versione aggiornata della pagina di riferimento dell'EVM su wolflo/evm-opcodes (si apre in una nuova scheda). Tratta anche dallo yellow paper (si apre in una nuova scheda), dal Jello Paper (si apre in una nuova scheda) e dall'implementazione di geth (si apre in una nuova scheda). Vuole essere un riferimento accessibile, ma non è particolarmente rigoroso. Se si desidera avere la certezza della correttezza ed essere a conoscenza di ogni caso limite, è consigliabile utilizzare il Jello Paper o l'implementazione di un client.

Cerchi un riferimento interattivo? Dai un'occhiata a evm.codes (si apre in una nuova scheda).

Per le operazioni con costi del gas dinamici, consulta gas.md (si apre in una nuova scheda).

💡 Suggerimento rapido: per visualizzare le righe intere, usa [shift] + scroll per scorrere orizzontalmente su desktop.

StackNomeGasStack inizialeStack risultanteMem / StorageNote
00STOP0interrompe l'esecuzione
01ADD3a, ba + baddizione (u)int256 modulo 2**256
02MUL5a, ba * bmoltiplicazione (u)int256 modulo 2**256
03SUB3a, ba - bsottrazione (u)int256 modulo 2**256
04DIV5a, ba // bdivisione uint256
05SDIV5a, ba // bdivisione int256
06MOD5a, ba % bmodulo uint256
07SMOD5a, ba % bmodulo int256
08ADDMOD8a, b, N(a + b) % Naddizione (u)int256 modulo N
09MULMOD8a, b, N(a * b) % Nmoltiplicazione (u)int256 modulo N
0AEXPA1 (si apre in una nuova scheda)a, ba ** besponenziazione uint256 modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)estensione del segno (si apre in una nuova scheda) di x da (b+1) byte a 32 byte
0C-0Fnon valido
10LT3a, ba < bminore di uint256
11GT3a, ba > bmaggiore di uint256
12SLT3a, ba < bminore di int256
13SGT3a, ba > bmaggiore di int256
14EQ3a, ba == buguaglianza (u)int256
15ISZERO3aa == 0iszero (u)int256
16AND3a, ba && bAND bit a bit
17OR3a, ba || bOR bit a bit
18XOR3a, ba ^ bXOR bit a bit
19NOT3a~aNOT bit a bit
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFi-esimo byte di (u)int256 x, da sinistra
1BSHL3shift, valval << shiftscorrimento a sinistra
1CSHR3shift, valval >> shiftscorrimento logico a destra
1DSAR3shift, valval >> shiftscorrimento aritmetico a destra
1E-1Fnon valido
20KECCAK256A2 (si apre in una nuova scheda)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fnon valido
30ADDRESS2.address(this)indirizzo del contratto in esecuzione
31BALANCEA5 (si apre in una nuova scheda)addraddr.balancesaldo, in Wei
32ORIGIN2.tx.originindirizzo che ha originato la transazione
33CALLER2.msg.senderindirizzo del mittente del msg
34CALLVALUE2.msg.valuevalore del msg, in Wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]legge una word dai dati del msg all'indice idx
36CALLDATASIZE2.len(msg.data)lunghezza dei dati del msg, in byte
37CALLDATACOPYA3 (si apre in una nuova scheda)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]copia i dati del msg
38CODESIZE2.len(this.code)lunghezza del codice del contratto in esecuzione, in byte
39CODECOPYA3 (si apre in una nuova scheda)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspriceprezzo del gas della transazione, in Wei per unità di gas ** (si apre in una nuova scheda)
3BEXTCODESIZEA5 (si apre in una nuova scheda)addrlen(addr.code)dimensione del codice all'indirizzo addr, in byte
3CEXTCODECOPYA4 (si apre in una nuova scheda)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]copia il codice da addr
3DRETURNDATASIZE2.sizedimensione dei dati restituiti dall'ultima chiamata esterna, in byte
3ERETURNDATACOPYA3 (si apre in una nuova scheda)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]copia i dati restituiti dall'ultima chiamata esterna
3FEXTCODEHASHA5 (si apre in una nuova scheda)addrhashhash = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbaseindirizzo del proponente del blocco corrente
42TIMESTAMP2.block.timestamptimestamp del blocco corrente
43NUMBER2.block.numbernumero del blocco corrente
44PREVRANDAO2.randomness beaconbeacon di casualità
45GASLIMIT2.block.gaslimitlimite di gas del blocco corrente
46CHAINID2.chain_idinserisce l'ID della catena (si apre in una nuova scheda) corrente nello stack
47SELFBALANCE5.address(this).balancesaldo del contratto in esecuzione, in Wei
48BASEFEE2.block.basefeecommissione di base del blocco corrente
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (si apre in una nuova scheda)
4ABLOBBASEFEE2.block.blobbasefeecommissione di base del blob del blocco corrente (EIP-7516 (si apre in una nuova scheda))
4B-4Fnon valido
50POP2_anon.rimuove l'elemento dalla cima dello stack e lo scarta
51MLOAD3* (si apre in una nuova scheda)ostmem[ost:ost+32]legge una word dalla memoria all'offset ost
52MSTORE3* (si apre in una nuova scheda)ost, val.mem[ost:ost+32] := valscrive una word in memoria
53MSTORE83* (si apre in una nuova scheda)ost, val.mem[ost] := val && 0xFFscrive un singolo byte in memoria
54SLOADA6 (si apre in una nuova scheda)keystorage[key]legge una word dallo storage
55SSTOREA7 (si apre in una nuova scheda)key, val.storage[key] := valscrive una word nello storage
56JUMP8dst.$pc := dst indica che pc viene assegnato solo se dst è una destinazione di salto valida
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pcprogram counter
59MSIZE2.len(mem)dimensione della memoria nel contesto di esecuzione corrente, in byte
5AGAS2.gasRemaining
5BJUMPDEST1contrassegna una destinazione di salto validauna destinazione di salto valida, ad esempio una destinazione di salto non all'interno dei dati di push
5CTLOAD100keytstorage[key]legge una word dallo storage transitorio (EIP-1153 (si apre in una nuova scheda))
5DTSTORE100key, val.tstorage[key] := valscrive una word nello storage transitorio (EIP-1153 (si apre in una nuova scheda))
5EMCOPY3+3*words+A0 (si apre in una nuova scheda)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]copia la memoria da un'area all'altra (EIP-5656 (si apre in una nuova scheda))
5FPUSH02.uint8inserisce il valore costante 0 nello stack
60PUSH13.uint8inserisce un valore di 1 byte nello stack
61PUSH23.uint16inserisce un valore di 2 byte nello stack
62PUSH33.uint24inserisce un valore di 3 byte nello stack
63PUSH43.uint32inserisce un valore di 4 byte nello stack
64PUSH53.uint40inserisce un valore di 5 byte nello stack
65PUSH63.uint48inserisce un valore di 6 byte nello stack
66PUSH73.uint56inserisce un valore di 7 byte nello stack
67PUSH83.uint64inserisce un valore di 8 byte nello stack
68PUSH93.uint72inserisce un valore di 9 byte nello stack
69PUSH103.uint80inserisce un valore di 10 byte nello stack
6APUSH113.uint88inserisce un valore di 11 byte nello stack
6BPUSH123.uint96inserisce un valore di 12 byte nello stack
6CPUSH133.uint104inserisce un valore di 13 byte nello stack
6DPUSH143.uint112inserisce un valore di 14 byte nello stack
6EPUSH153.uint120inserisce un valore di 15 byte nello stack
6FPUSH163.uint128inserisce un valore di 16 byte nello stack
70PUSH173.uint136inserisce un valore di 17 byte nello stack
71PUSH183.uint144inserisce un valore di 18 byte nello stack
72PUSH193.uint152inserisce un valore di 19 byte nello stack
73PUSH203.uint160inserisce un valore di 20 byte nello stack
74PUSH213.uint168inserisce un valore di 21 byte nello stack
75PUSH223.uint176inserisce un valore di 22 byte nello stack
76PUSH233.uint184inserisce un valore di 23 byte nello stack
77PUSH243.uint192inserisce un valore di 24 byte nello stack
78PUSH253.uint200inserisce un valore di 25 byte nello stack
79PUSH263.uint208inserisce un valore di 26 byte nello stack
7APUSH273.uint216inserisce un valore di 27 byte nello stack
7BPUSH283.uint224inserisce un valore di 28 byte nello stack
7CPUSH293.uint232inserisce un valore di 29 byte nello stack
7DPUSH303.uint240inserisce un valore di 30 byte nello stack
7EPUSH313.uint248inserisce un valore di 31 byte nello stack
7FPUSH323.uint256inserisce un valore di 32 byte nello stack
80DUP13aa, aclona il 1° valore nello stack
81DUP23_, aa, _, aclona il 2° valore nello stack
82DUP33_, _, aa, _, _, aclona il 3° valore nello stack
83DUP43_, _, _, aa, _, _, _, aclona il 4° valore nello stack
84DUP53..., aa, ..., aclona il 5° valore nello stack
85DUP63..., aa, ..., aclona il 6° valore nello stack
86DUP73..., aa, ..., aclona il 7° valore nello stack
87DUP83..., aa, ..., aclona l'8° valore nello stack
88DUP93..., aa, ..., aclona il 9° valore nello stack
89DUP103..., aa, ..., aclona il 10° valore nello stack
8ADUP113..., aa, ..., aclona l'11° valore nello stack
8BDUP123..., aa, ..., aclona il 12° valore nello stack
8CDUP133..., aa, ..., aclona il 13° valore nello stack
8DDUP143..., aa, ..., aclona il 14° valore nello stack
8EDUP153..., aa, ..., aclona il 15° valore nello stack
8FDUP163..., aa, ..., aclona il 16° valore nello stack
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 (si apre in una nuova scheda)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (si apre in una nuova scheda)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (si apre in una nuova scheda)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (si apre in una nuova scheda)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (si apre in una nuova scheda)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFnon valido
F0CREATEA9 (si apre in una nuova scheda)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (si apre in una nuova scheda)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (si apre in una nuova scheda)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndatauguale a DELEGATECALL, ma non propaga il msg.sender e il msg.value originali
F3RETURN0* (si apre in una nuova scheda)ost, len.restituisce mem[ost:ost+len-1]
F4DELEGATECALLAA (si apre in una nuova scheda)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (si apre in una nuova scheda)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9non valido
FASTATICCALLAA (si apre in una nuova scheda)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCnon valido
FDREVERT0* (si apre in una nuova scheda)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (si apre in una nuova scheda)codice operativo (opcode) non valido designato - EIP-141 (si apre in una nuova scheda)
FFSELFDESTRUCTAB (si apre in una nuova scheda)addr.invia tutti gli ETH a addr; se eseguito nella stessa transazione in cui è stato creato un contratto, distrugge il contratto