Vai al contenuto principale
Change page

Opcode per l'EVM

Ultimo aggiornamento della pagina: 11 settembre 2025

Panoramica

Questa è una versione aggiornata della pagina di riferimento dell'EVM su wolflo/evm-opcodes (opens in a new tab). Tratta anche dallo Yellow Paper (opens in a new tab), dal Jello Paper (opens in a new tab) e dall'implementazione di geth (opens in a new tab). Vuole essere un riferimento accessibile, ma non è particolarmente rigoroso. Se si vuole avere la certezza della correttezza e conoscere ogni caso limite, è consigliabile utilizzare il Jello Paper o un'implementazione del client.

Cerchi un riferimento interattivo? Dai un'occhiata a evm.codes (opens in a new tab).

Per le operazioni con costi del gas dinamici, vedi gas.md (opens in a new tab).

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

StackNameGasInitial StackResulting StackMem / StorageNotes
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 (opens in a new tab)a, ba ** besponenziazione uint256 modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)estensione del segno (opens in a new tab) 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 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fnon valido
30ADDRESS2.address(this)indirizzo del contratto in esecuzione
31BALANCEA5 (opens in a new tab)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 parola dai dati del msg all'indice idx
36CALLDATASIZE2.len(msg.data)lunghezza dei dati del msg, in byte
37CALLDATACOPYA3 (opens in a new tab)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 (opens in a new tab)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 ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)dimensione del codice all'indirizzo addr, in byte
3CEXTCODECOPYA4 (opens in a new tab)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 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]copia i dati restituiti dall'ultima chiamata esterna
3FEXTCODEHASHA5 (opens in a new tab)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 del gas del blocco corrente
46CHAINID2.chain_idinserisce l'ID della catena (opens in a new tab) 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 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeecommissione di base del blob del blocco corrente (EIP-7516 (opens in a new tab))
4B-4Fnon valido
50POP2_anon.rimuove l'elemento dalla cima dello stack e lo scarta
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]legge una parola dalla memoria all'offset ost
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valscrive una parola in memoria
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFscrive un singolo byte in memoria
54SLOADA6 (opens in a new tab)keystorage[key]legge una parola dallo storage
55SSTOREA7 (opens in a new tab)key, val.storage[key] := valscrive una parola nello storage
56JUMP8dst.$pc := dst segna che pc viene assegnato solo se dst è un jumpdest valido
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pccontatore di programma
59MSIZE2.len(mem)dimensione della memoria nel contesto di esecuzione corrente, in byte
5AGAS2.gasRemaining
5BJUMPDEST1segna 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 parola dallo storage transitorio (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := valscrive una parola nello storage transitorio (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]copia la memoria da un'area all'altra (EIP-5656 (opens in a new tab))
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 (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-EFnon valido
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] = returndatauguale a DELEGATECALL, ma non propaga il msg.sender e il msg.value originali
F3RETURN0* (opens in a new tab)ost, len.restituisce 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-F9non valido
FASTATICCALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCnon valido
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)opcode non valido designato - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)addr.invia tutti gli ETH a addr; se eseguito nella stessa transazione in cui è stato creato un contratto, distrugge il contratto

Questo articolo è stato utile?