Przejdź do głównej treści
Change page

Kody operacji dla EVM

Przegląd

To jest zaktualizowana wersja strony referencyjnej EVM dostępnej pod adresem wolflo/evm-opcodes (opens in a new tab). Czerpie również z żółtej księgi (opens in a new tab), Jello Paper (opens in a new tab) oraz implementacji geth (opens in a new tab). Ma to być przystępne źródło informacji, ale nie jest ono szczególnie rygorystyczne. Jeśli chcesz mieć pewność co do poprawności i znać każdy przypadek brzegowy, zaleca się skorzystanie z Jello Paper lub implementacji klienta.

Szukasz interaktywnego źródła informacji? Sprawdź evm.codes (opens in a new tab).

W przypadku operacji o dynamicznych kosztach gazu, zobacz gas.md (opens in a new tab).

💡 Szybka wskazówka: Aby wyświetlić całe wiersze, użyj [shift] + scroll, aby przewijać w poziomie na komputerze.

StackNameGasInitial StackResulting StackMem / StorageNotes
00STOP0zatrzymanie wykonywania
01ADD3a, ba + bdodawanie (u)int256 modulo 2**256
02MUL5a, ba * bmnożenie (u)int256 modulo 2**256
03SUB3a, ba - bodejmowanie (u)int256 modulo 2**256
04DIV5a, ba // bdzielenie uint256
05SDIV5a, ba // bdzielenie int256
06MOD5a, ba % bmodulo uint256
07SMOD5a, ba % bmodulo int256
08ADDMOD8a, b, N(a + b) % Ndodawanie (u)int256 modulo N
09MULMOD8a, b, N(a * b) % Nmnożenie (u)int256 modulo N
0AEXPA1 (opens in a new tab)a, ba ** bpotęgowanie uint256 modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)rozszerzenie znaku (opens in a new tab) x z (b+1) bajtów do 32 bajtów
0C-0Fnieprawidłowy
10LT3a, ba < buint256 mniejsze niż
11GT3a, ba > buint256 większe niż
12SLT3a, ba < bint256 mniejsze niż
13SGT3a, ba > bint256 większe niż
14EQ3a, ba == brówność (u)int256
15ISZERO3aa == 0(u)int256 iszero
16AND3a, ba && bbitowe AND
17OR3a, ba || bbitowe OR
18XOR3a, ba ^ bbitowe XOR
19NOT3a~abitowe NOT
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFi-ty bajt (u)int256 x, od lewej
1BSHL3shift, valval << shiftprzesunięcie w lewo
1CSHR3shift, valval >> shiftlogiczne przesunięcie w prawo
1DSAR3shift, valval >> shiftarytmetyczne przesunięcie w prawo
1E-1Fnieprawidłowy
20KECCAK256A2 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fnieprawidłowy
30ADDRESS2.address(this)adres wykonującego kontraktu
31BALANCEA5 (opens in a new tab)addraddr.balancesaldo, w wei
32ORIGIN2.tx.originadres, który zainicjował transakcję
33CALLER2.msg.senderadres nadawcy msg
34CALLVALUE2.msg.valuewartość msg, w wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]odczyt słowa z danych msg pod indeksem idx
36CALLDATASIZE2.len(msg.data)długość danych msg, w bajtach
37CALLDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]kopiowanie danych msg
38CODESIZE2.len(this.code)długość kodu wykonującego kontraktu, w bajtach
39CODECOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspricecena gazu transakcji, w wei za jednostkę gazu ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)rozmiar kodu pod adresem, w bajtach
3CEXTCODECOPYA4 (opens in a new tab)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]kopiowanie kodu z addr
3DRETURNDATASIZE2.sizerozmiar zwróconych danych z ostatniego wywołania zewnętrznego, w bajtach
3ERETURNDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]kopiowanie zwróconych danych z ostatniego wywołania zewnętrznego
3FEXTCODEHASHA5 (opens in a new tab)addrhashhash = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbaseadres proponującego obecny blok
42TIMESTAMP2.block.timestampznacznik czasu obecnego bloku
43NUMBER2.block.numbernumer obecnego bloku
44PREVRANDAO2.randomness beaconbeacon losowości
45GASLIMIT2.block.gaslimitlimit gazu obecnego bloku
46CHAINID2.chain_idodłożenie obecnego id łańcucha (opens in a new tab) na stos
47SELFBALANCE5.address(this).balancesaldo wykonującego kontraktu, w wei
48BASEFEE2.block.basefeeopłata podstawowa obecnego bloku
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeeopłata podstawowa za blob obecnego bloku (EIP-7516 (opens in a new tab))
4B-4Fnieprawidłowy
50POP2_anon.usunięcie elementu ze szczytu stosu i odrzucenie go
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]odczyt słowa z pamięci pod przesunięciem ost
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valzapis słowa do pamięci
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFzapis pojedynczego bajtu do pamięci
54SLOADA6 (opens in a new tab)keystorage[key]odczyt słowa z magazynu
55SSTOREA7 (opens in a new tab)key, val.storage[key] := valzapis słowa do magazynu
56JUMP8dst.$pc := dst oznacza, że pc jest przypisywane tylko wtedy, gdy dst jest prawidłowym celem skoku (jumpdest)
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pclicznik rozkazów (program counter)
59MSIZE2.len(mem)rozmiar pamięci w obecnym kontekście wykonywania, w bajtach
5AGAS2.gasRemaining
5BJUMPDEST1oznaczenie prawidłowego celu skokuprawidłowy cel skoku, na przykład cel skoku, który nie znajduje się wewnątrz danych push
5CTLOAD100keytstorage[key]odczyt słowa z pamięci ulotnej (transient storage) (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := valzapis słowa do pamięci ulotnej (transient storage) (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]kopiowanie pamięci z jednego obszaru do drugiego (EIP-5656 (opens in a new tab))
5FPUSH02.uint8odłożenie stałej wartości 0 na stos
60PUSH13.uint8odłożenie 1-bajtowej wartości na stos
61PUSH23.uint16odłożenie 2-bajtowej wartości na stos
62PUSH33.uint24odłożenie 3-bajtowej wartości na stos
63PUSH43.uint32odłożenie 4-bajtowej wartości na stos
64PUSH53.uint40odłożenie 5-bajtowej wartości na stos
65PUSH63.uint48odłożenie 6-bajtowej wartości na stos
66PUSH73.uint56odłożenie 7-bajtowej wartości na stos
67PUSH83.uint64odłożenie 8-bajtowej wartości na stos
68PUSH93.uint72odłożenie 9-bajtowej wartości na stos
69PUSH103.uint80odłożenie 10-bajtowej wartości na stos
6APUSH113.uint88odłożenie 11-bajtowej wartości na stos
6BPUSH123.uint96odłożenie 12-bajtowej wartości na stos
6CPUSH133.uint104odłożenie 13-bajtowej wartości na stos
6DPUSH143.uint112odłożenie 14-bajtowej wartości na stos
6EPUSH153.uint120odłożenie 15-bajtowej wartości na stos
6FPUSH163.uint128odłożenie 16-bajtowej wartości na stos
70PUSH173.uint136odłożenie 17-bajtowej wartości na stos
71PUSH183.uint144odłożenie 18-bajtowej wartości na stos
72PUSH193.uint152odłożenie 19-bajtowej wartości na stos
73PUSH203.uint160odłożenie 20-bajtowej wartości na stos
74PUSH213.uint168odłożenie 21-bajtowej wartości na stos
75PUSH223.uint176odłożenie 22-bajtowej wartości na stos
76PUSH233.uint184odłożenie 23-bajtowej wartości na stos
77PUSH243.uint192odłożenie 24-bajtowej wartości na stos
78PUSH253.uint200odłożenie 25-bajtowej wartości na stos
79PUSH263.uint208odłożenie 26-bajtowej wartości na stos
7APUSH273.uint216odłożenie 27-bajtowej wartości na stos
7BPUSH283.uint224odłożenie 28-bajtowej wartości na stos
7CPUSH293.uint232odłożenie 29-bajtowej wartości na stos
7DPUSH303.uint240odłożenie 30-bajtowej wartości na stos
7EPUSH313.uint248odłożenie 31-bajtowej wartości na stos
7FPUSH323.uint256odłożenie 32-bajtowej wartości na stos
80DUP13aa, aklonowanie 1. wartości na stosie
81DUP23_, aa, _, aklonowanie 2. wartości na stosie
82DUP33_, _, aa, _, _, aklonowanie 3. wartości na stosie
83DUP43_, _, _, aa, _, _, _, aklonowanie 4. wartości na stosie
84DUP53..., aa, ..., aklonowanie 5. wartości na stosie
85DUP63..., aa, ..., aklonowanie 6. wartości na stosie
86DUP73..., aa, ..., aklonowanie 7. wartości na stosie
87DUP83..., aa, ..., aklonowanie 8. wartości na stosie
88DUP93..., aa, ..., aklonowanie 9. wartości na stosie
89DUP103..., aa, ..., aklonowanie 10. wartości na stosie
8ADUP113..., aa, ..., aklonowanie 11. wartości na stosie
8BDUP123..., aa, ..., aklonowanie 12. wartości na stosie
8CDUP133..., aa, ..., aklonowanie 13. wartości na stosie
8DDUP143..., aa, ..., aklonowanie 14. wartości na stosie
8EDUP153..., aa, ..., aklonowanie 15. wartości na stosie
8FDUP163..., aa, ..., aklonowanie 16. wartości na stosie
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-EFnieprawidłowy
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] = returndatato samo co DELEGATECALL, ale nie propaguje oryginalnego msg.sender i msg.value
F3RETURN0* (opens in a new tab)ost, len.return 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-F9nieprawidłowy
FASTATICCALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCnieprawidłowy
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)wyznaczony nieprawidłowy kod operacji - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)addr.wysyła całe ETH do addr; jeśli zostanie wykonane w tej samej transakcji, w której utworzono kontrakt, niszczy kontrakt