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 (otwiera się w nowej karcie). Oparta również na żółtej księdze (otwiera się w nowej karcie), Jello Paper (otwiera się w nowej karcie) oraz implementacji geth (otwiera się w nowej karcie). 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 (otwiera się w nowej karcie).

W przypadku operacji z dynamicznymi kosztami gazu, zobacz gas.md (otwiera się w nowej karcie).

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

StosNazwaGazStos początkowyStos wynikowyPamięć / MagazynUwagi
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 (otwiera się w nowej karcie)a, ba ** bpotęgowanie uint256 modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)rozszerzenie znaku (otwiera się w nowej karcie) x z (b+1) bajtów do 32 bajtów
0C-0Fnieprawidłowy
10LT3a, ba < bmniejsze niż uint256
11GT3a, ba > bwiększe niż uint256
12SLT3a, ba < bmniejsze niż int256
13SGT3a, ba > bwiększe niż int256
14EQ3a, ba == brówność (u)int256
15ISZERO3aa == 0(u)int256 równe zero
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 (otwiera się w nowej karcie)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fnieprawidłowy
30ADDRESS2.address(this)adres wykonującego kontraktu
31BALANCEA5 (otwiera się w nowej karcie)addraddr.balancesaldo, w wei
32ORIGIN2.tx.originadres, który zainicjował transakcję
33CALLER2.msg.senderadres nadawcy wiadomości
34CALLVALUE2.msg.valuewartość wiadomości, w wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]odczyt słowa z danych wiadomości pod indeksem idx
36CALLDATASIZE2.len(msg.data)długość danych wiadomości, w bajtach
37CALLDATACOPYA3 (otwiera się w nowej karcie)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]kopiowanie danych wiadomości
38CODESIZE2.len(this.code)długość kodu wykonującego kontraktu, w bajtach
39CODECOPYA3 (otwiera się w nowej karcie)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspricecena gazu transakcji, w wei za jednostkę gazu ** (otwiera się w nowej karcie)
3BEXTCODESIZEA5 (otwiera się w nowej karcie)addrlen(addr.code)rozmiar kodu pod adresem addr, w bajtach
3CEXTCODECOPYA4 (otwiera się w nowej karcie)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 (otwiera się w nowej karcie)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]kopiowanie zwróconych danych z ostatniego wywołania zewnętrznego
3FEXTCODEHASHA5 (otwiera się w nowej karcie)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.źródło losowościźródło losowości
45GASLIMIT2.block.gaslimitlimit gazu obecnego bloku
46CHAINID2.chain_idodłożenie obecnego identyfikatora łańcucha (otwiera się w nowej karcie) 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 (otwiera się w nowej karcie)
4ABLOBBASEFEE2.block.blobbasefeeopłata podstawowa za blob obecnego bloku (EIP-7516 (otwiera się w nowej karcie))
4B-4Fnieprawidłowy
50POP2_anon.usunięcie elementu ze szczytu stosu i odrzucenie go
51MLOAD3* (otwiera się w nowej karcie)ostmem[ost:ost+32]odczyt słowa z pamięci pod przesunięciem ost
52MSTORE3* (otwiera się w nowej karcie)ost, val.mem[ost:ost+32] := valzapis słowa do pamięci
53MSTORE83* (otwiera się w nowej karcie)ost, val.mem[ost] := val && 0xFFzapis pojedynczego bajtu do pamięci
54SLOADA6 (otwiera się w nowej karcie)keystorage[key]odczyt słowa z magazynu
55SSTOREA7 (otwiera się w nowej karcie)key, val.storage[key] := valzapis słowa do magazynu
56JUMP8dst.$pc := dst oznacza, że pc jest przypisywane tylko wtedy, gdy dst jest prawidłowym jumpdest
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pclicznik programu
59MSIZE2.len(mem)rozmiar pamięci w obecnym kontekście wykonywania, w bajtach
5AGAS2.gasRemaining
5BJUMPDEST1oznacza prawidłowy cel 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 (EIP-1153 (otwiera się w nowej karcie))
5DTSTORE100key, val.tstorage[key] := valzapis słowa do pamięci ulotnej (EIP-1153 (otwiera się w nowej karcie))
5EMCOPY3+3*words+A0 (otwiera się w nowej karcie)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]kopiowanie pamięci z jednego obszaru do drugiego (EIP-5656 (otwiera się w nowej karcie))
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 (otwiera się w nowej karcie)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (otwiera się w nowej karcie)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (otwiera się w nowej karcie)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (otwiera się w nowej karcie)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (otwiera się w nowej karcie)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFnieprawidłowy
F0CREATEA9 (otwiera się w nowej karcie)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (otwiera się w nowej karcie)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (otwiera się w nowej karcie)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* (otwiera się w nowej karcie)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (otwiera się w nowej karcie)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (otwiera się w nowej karcie)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9nieprawidłowy
FASTATICCALLAA (otwiera się w nowej karcie)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCnieprawidłowy
FDREVERT0* (otwiera się w nowej karcie)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (otwiera się w nowej karcie)wyznaczony nieprawidłowy kod operacji - EIP-141 (otwiera się w nowej karcie)
FFSELFDESTRUCTAB (otwiera się w nowej karcie)addr.wysyła całe ETH na adres addr; jeśli zostanie wykonane w tej samej transakcji, w której utworzono kontrakt, niszczy kontrakt