Přeskočit na hlavní obsah
Change page

Operační kódy pro EVM

Stránka naposledy aktualizována: 11. září 2025

Přehled

Toto je aktualizovaná verze referenční stránky EVM na wolflo/evm-opcodes (opens in a new tab). Čerpáno také z Yellow Paper (opens in a new tab), Jello Paper (opens in a new tab) a implementace geth (opens in a new tab). Tento dokument má být přístupnou referencí, ale není nijak zvlášť důkladný. Pokud si chcete být jisti správností a být si vědomi všech hraničních případů, doporučujeme vám používat Jello Paper nebo implementaci klienta.

Hledáte interaktivní referenci? Podívejte se na evm.codes (opens in a new tab).

Pro operace s dynamickými náklady na plyn viz gas.md (opens in a new tab).

💡 Rychlý tip: Chcete-li zobrazit celé řádky, použijte [shift] + scroll pro horizontální posouvání na počítači.

ZásobníkNázevPalivoPočáteční zásobníkVýsledný zásobníkPaměť/úložištěPoznámky
00STOP0zastavit provádění
01ADD3a, ba + bsčítání (u)int256 modulo 2**256
02MUL5a, ba * bnásobení (u)int256 modulo 2**256
03SUB3a, ba - bodčítání (u)int256 modulo 2**256
04DIV5a, ba // bdělení uint256
05SDIV5a, ba // bdělení int256
06MOD5a, ba % bmodulo uint256
07SMOD5a, ba % bmodulo int256
08ADDMOD8a, b, N(a + b) % Nsčítání (u)int256 modulo N
09MULMOD8a, b, N(a * b) % Nnásobení (u)int256 modulo N
0AEXPA1 (opens in a new tab)a, ba ** bumocňování uint256 modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)rozšíření znaménka (opens in a new tab) x z (b+1) bajtů na 32 bajtů
0C-0Fneplatné
10LT3a, ba < buint256 menší než
11GT3a, ba > buint256 větší než
12SLT3a, ba < bint256 menší než
13SGT3a, ba > bint256 větší než
14EQ3a, ba == brovnost (u)int256
15ISZERO3aa == 0(u)int256 je nula
16AND3a, ba && bbitové AND
17OR3a, b`a \\b`
18XOR3a, ba ^ bbitové XOR
19NOT3a~abitové NOT
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFi-tý bajt (u)int256 x, zleva
1BSHL3shift, valval << shiftposun vlevo
1CSHR3shift, valval >> shiftlogický posun vpravo
1DSAR3shift, valval >> shiftaritmetický posun vpravo
1E-1Fneplatné
20KECCAK256A2 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fneplatné
30ADDRESS2.address(this)adresa prováděné smlouvy
31BALANCEA5 (opens in a new tab)addraddr.balancezůstatek, ve wei
32ORIGIN2.tx.originadresa, která zahájila transakci
33CALLER2.msg.senderadresa odesílatele zprávy
34CALLVALUE2.msg.valuehodnota zprávy, ve wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]přečíst slovo z dat zprávy na indexu idx
36CALLDATASIZE2.len(msg.data)délka dat zprávy, v bajtech
37CALLDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]kopírovat data zprávy
38CODESIZE2.len(this.code)délka kódu prováděné smlouvy, v bajtech
39CODECOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]kopírovat bajtkód prováděné smlouvy
3AGASPRICE2.tx.gaspricecena plynu transakce, ve wei za jednotku plynu ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)velikost kódu na adrese, v bajtech
3CEXTCODECOPYA4 (opens in a new tab)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]kopírovat kód z addr
3DRETURNDATASIZE2.sizevelikost vrácených dat z posledního externího volání, v bajtech
3ERETURNDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]kopírovat vrácená data z posledního externího volání
3FEXTCODEHASHA5 (opens in a new tab)addrhashhaš = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbaseadresa navrhovatele aktuálního bloku
42TIMESTAMP2.block.timestampčasové razítko aktuálního bloku
43NUMBER2.block.numberčíslo aktuálního bloku
44PREVRANDAO2.randomness beaconmaják náhodnosti
45GASLIMIT2.block.gaslimitlimit transakčních poplatků aktuálního bloku
46CHAINID2.chain_idvložit aktuální ID řetězce (opens in a new tab) na zásobník
47SELFBALANCE5.address(this).balancezůstatek prováděné smlouvy, ve wei
48BASEFEE2.block.basefeezákladní poplatek aktuálního bloku
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeezákladní poplatek blobu aktuálního bloku (EIP-7516 (opens in a new tab))
4B-4Fneplatné
50POP2_anon.odebrat položku z vrcholu zásobníku a zahodit ji
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]přečíst slovo z paměti na offsetu ost
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valzapsat slovo do paměti
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFzapsat jeden bajt do paměti
54SLOADA6 (opens in a new tab)keystorage[key]přečíst slovo z úložiště
55SSTOREA7 (opens in a new tab)key, val.storage[key] := valzapsat slovo do úložiště
56JUMP8dst.$pc := dst označuje, že pc se přiřadí, pouze pokud je dst platný cíl skoku
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1`
58PC2.$pcčítač programu
59MSIZE2.len(mem)velikost paměti v aktuálním kontextu provádění, v bajtech
5AGAS2.gasRemaining
5BJUMPDEST1označit platný cíl skokuplatný cíl skoku, například cíl skoku, který není uvnitř dat pro push
5CTLOAD100keytstorage[key]přečíst slovo z dočasného úložiště (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := valzapsat slovo do dočasného úložiště (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]kopírovat paměť z jedné oblasti do druhé (EIP-5656 (opens in a new tab))
5FPUSH02.uint8vložit konstantní hodnotu 0 na zásobník
60PUSH13.uint8vložit 1bajtovou hodnotu na zásobník
61PUSH23.uint16vložit 2bajtovou hodnotu na zásobník
62PUSH33.uint24vložit 3bajtovou hodnotu na zásobník
63PUSH43.uint32vložit 4bajtovou hodnotu na zásobník
64PUSH53.uint40vložit 5bajtovou hodnotu na zásobník
65PUSH63.uint48vložit 6bajtovou hodnotu na zásobník
66PUSH73.uint56vložit 7bajtovou hodnotu na zásobník
67PUSH83.uint64vložit 8bajtovou hodnotu na zásobník
68PUSH93.uint72vložit 9bajtovou hodnotu na zásobník
69PUSH103.uint80vložit 10bajtovou hodnotu na zásobník
6APUSH113.uint88vložit 11bajtovou hodnotu na zásobník
6BPUSH123.uint96vložit 12bajtovou hodnotu na zásobník
6CPUSH133.uint104vložit 13bajtovou hodnotu na zásobník
6DPUSH143.uint112vložit 14bajtovou hodnotu na zásobník
6EPUSH153.uint120vložit 15bajtovou hodnotu na zásobník
6FPUSH163.uint128vložit 16bajtovou hodnotu na zásobník
70PUSH173.uint136vložit 17bajtovou hodnotu na zásobník
71PUSH183.uint144vložit 18bajtovou hodnotu na zásobník
72PUSH193.uint152vložit 19bajtovou hodnotu na zásobník
73PUSH203.uint160vložit 20bajtovou hodnotu na zásobník
74PUSH213.uint168vložit 21bajtovou hodnotu na zásobník
75PUSH223.uint176vložit 22bajtovou hodnotu na zásobník
76PUSH233.uint184vložit 23bajtovou hodnotu na zásobník
77PUSH243.uint192vložit 24bajtovou hodnotu na zásobník
78PUSH253.uint200vložit 25bajtovou hodnotu na zásobník
79PUSH263.uint208vložit 26bajtovou hodnotu na zásobník
7APUSH273.uint216vložit 27bajtovou hodnotu na zásobník
7BPUSH283.uint224vložit 28bajtovou hodnotu na zásobník
7CPUSH293.uint232vložit 29bajtovou hodnotu na zásobník
7DPUSH303.uint240vložit 30bajtovou hodnotu na zásobník
7EPUSH313.uint248vložit 31bajtovou hodnotu na zásobník
7FPUSH323.uint256vložit 32bajtovou hodnotu na zásobník
80DUP13aa, aklonovat 1. hodnotu na zásobníku
81DUP23_, aa, _, aklonovat 2. hodnotu na zásobníku
82DUP33_, _, aa, _, _, aklonovat 3. hodnotu na zásobníku
83DUP43_, _, _, aa, _, _, _, aklonovat 4. hodnotu na zásobníku
84DUP53..., aa, ..., aklonovat 5. hodnotu na zásobníku
85DUP63..., aa, ..., aklonovat 6. hodnotu na zásobníku
86DUP73..., aa, ..., aklonovat 7. hodnotu na zásobníku
87DUP83..., aa, ..., aklonovat 8. hodnotu na zásobníku
88DUP93..., aa, ..., aklonovat 9. hodnotu na zásobníku
89DUP103..., aa, ..., aklonovat 10. hodnotu na zásobníku
8ADUP113..., aa, ..., aklonovat 11. hodnotu na zásobníku
8BDUP123..., aa, ..., aklonovat 12. hodnotu na zásobníku
8CDUP133..., aa, ..., aklonovat 13. hodnotu na zásobníku
8DDUP143..., aa, ..., aklonovat 14. hodnotu na zásobníku
8EDUP153..., aa, ..., aklonovat 15. hodnotu na zásobníku
8FDUP163..., aa, ..., aklonovat 16. hodnotu na zásobníku
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-EFneplatné
F0CREATEA9 (opens in a new tab)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (opens in a new tab)plyn, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (opens in a new tab)plyn, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndatastejné jako DELEGATECALL, ale nešíří původní msg.sender a msg.value
F3RETURN0* (opens in a new tab)ost, len.vrátit mem[ost:ost+len-1]
F4DELEGATECALLAA (opens in a new tab)plyn, 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-F9neplatné
FASTATICCALLAA (opens in a new tab)plyn, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCneplatné
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)označený neplatný operační kód – EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)addr.pošle všechny ETH na addr; pokud je proveden ve stejné transakci, ve které byla vytvořena smlouva, smlouvu zničí

Byl tento článek užitečný?