Перейти до основного вмісту
Change page

Опкоди для EVM

Огляд

Це оновлена версія довідкової сторінки EVM на wolflo/evm-opcodes (opens in a new tab). Також використано матеріали з Жовтої книги (opens in a new tab), Jello Paper (opens in a new tab) та реалізації geth (opens in a new tab). Цей матеріал задуманий як доступний довідник, але він не є надто суворим. Якщо ви хочете бути впевненими у правильності та знати про всі крайні випадки, рекомендується використовувати Jello Paper або реалізацію клієнта.

Шукаєте інтерактивний довідник? Перегляньте evm.codes (opens in a new tab).

Для операцій із динамічною вартістю газу див. gas.md (opens in a new tab).

💡 Коротка порада: щоб переглянути рядки повністю, використовуйте [shift] + scroll для горизонтального прокручування на комп'ютері.

СтекНазваГазПочатковий стекРезультуючий стекПам'ять / СховищеПримітки
00STOP0зупинити виконання
01ADD3a, ba + bдодавання (u)int256 за модулем 2**256
02MUL5a, ba * bмноження (u)int256 за модулем 2**256
03SUB3a, ba - bвіднімання (u)int256 за модулем 2**256
04DIV5a, ba // bділення uint256
05SDIV5a, ba // bділення int256
06MOD5a, ba % bостача від ділення uint256
07SMOD5a, ba % bостача від ділення int256
08ADDMOD8a, b, N(a + b) % Nдодавання (u)int256 за модулем N
09MULMOD8a, b, N(a * b) % Nмноження (u)int256 за модулем N
0AEXPA1 (opens in a new tab)a, ba ** bпіднесення до степеня uint256 за модулем 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)розширення знака (opens in a new tab) x з (b+1) байтів до 32 байтів
0C-0Fнедійсний
10LT3a, ba < bменше ніж uint256
11GT3a, ba > bбільше ніж uint256
12SLT3a, ba < bменше ніж int256
13SGT3a, ba > bбільше ніж int256
14EQ3a, ba == bрівність (u)int256
15ISZERO3aa == 0(u)int256 дорівнює нулю
16AND3a, ba && bпобітове І (AND)
17OR3a, ba || bпобітове АБО (OR)
18XOR3a, ba ^ bпобітове виключне АБО (XOR)
19NOT3a~aпобітове НІ (NOT)
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFi-й байт (u)int256 x, зліва
1BSHL3shift, valval << shiftзсув вліво
1CSHR3shift, valval >> shiftлогічний зсув вправо
1DSAR3shift, valval >> shiftарифметичний зсув вправо
1E-1Fнедійсний
20KECCAK256A2 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fнедійсний
30ADDRESS2.address(this)адреса контракту, що виконується
31BALANCEA5 (opens in a new tab)addraddr.balanceбаланс, у Wei
32ORIGIN2.tx.originадреса, яка ініціювала транзакцію
33CALLER2.msg.senderадреса відправника повідомлення (msg.sender)
34CALLVALUE2.msg.valueзначення повідомлення (msg.value), у Wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]прочитати слово з даних повідомлення за індексом idx
36CALLDATASIZE2.len(msg.data)довжина даних повідомлення, у байтах
37CALLDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]копіювати дані повідомлення
38CODESIZE2.len(this.code)довжина коду контракту, що виконується, у байтах
39CODECOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspriceціна газу транзакції, у Wei за одиницю газу ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)розмір коду за адресою, у байтах
3CEXTCODECOPYA4 (opens in a new tab)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]копіювати код з addr
3DRETURNDATASIZE2.sizeрозмір повернутих даних з останнього зовнішнього виклику, у байтах
3ERETURNDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]копіювати повернуті дані з останнього зовнішнього виклику
3FEXTCODEHASHA5 (opens in a new tab)addrhashhash = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbaseадреса пропонувальника поточного блоку
42TIMESTAMP2.block.timestampчасова мітка поточного блоку
43NUMBER2.block.numberномер поточного блоку
44PREVRANDAO2.randomness beaconмаяк випадковості
45GASLIMIT2.block.gaslimitліміт газу поточного блоку
46CHAINID2.chain_idпомістити поточний ідентифікатор ланцюга (chain id) (opens in a new tab) у стек
47SELFBALANCE5.address(this).balanceбаланс контракту, що виконується, у Wei
48BASEFEE2.block.basefeeбазова комісія поточного блоку
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeeбазова комісія за блоб поточного блоку (EIP-7516 (opens in a new tab))
4B-4Fнедійсний
50POP2_anon.видалити елемент з вершини стека та відкинути його
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]прочитати слово з пам'яті за зміщенням ost
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valзаписати слово в пам'ять
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFзаписати один байт у пам'ять
54SLOADA6 (opens in a new tab)keystorage[key]прочитати слово зі сховища
55SSTOREA7 (opens in a new tab)key, val.storage[key] := valзаписати слово у сховище
56JUMP8dst.$pc := dst означає, що pc призначається лише тоді, коли dst є дійсним jumpdest
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pcлічильник команд (program counter)
59MSIZE2.len(mem)розмір пам'яті в поточному контексті виконання, у байтах
5AGAS2.gasRemaining
5BJUMPDEST1mark valid jump destinationдійсна ціль переходу, наприклад, ціль переходу, що не знаходиться всередині даних push
5CTLOAD100keytstorage[key]прочитати слово з тимчасового сховища (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := valзаписати слово в тимчасове сховище (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]копіювати пам'ять з однієї області в іншу (EIP-5656 (opens in a new tab))
5FPUSH02.uint8помістити константне значення 0 у стек
60PUSH13.uint8помістити 1-байтове значення у стек
61PUSH23.uint16помістити 2-байтове значення у стек
62PUSH33.uint24помістити 3-байтове значення у стек
63PUSH43.uint32помістити 4-байтове значення у стек
64PUSH53.uint40помістити 5-байтове значення у стек
65PUSH63.uint48помістити 6-байтове значення у стек
66PUSH73.uint56помістити 7-байтове значення у стек
67PUSH83.uint64помістити 8-байтове значення у стек
68PUSH93.uint72помістити 9-байтове значення у стек
69PUSH103.uint80помістити 10-байтове значення у стек
6APUSH113.uint88помістити 11-байтове значення у стек
6BPUSH123.uint96помістити 12-байтове значення у стек
6CPUSH133.uint104помістити 13-байтове значення у стек
6DPUSH143.uint112помістити 14-байтове значення у стек
6EPUSH153.uint120помістити 15-байтове значення у стек
6FPUSH163.uint128помістити 16-байтове значення у стек
70PUSH173.uint136помістити 17-байтове значення у стек
71PUSH183.uint144помістити 18-байтове значення у стек
72PUSH193.uint152помістити 19-байтове значення у стек
73PUSH203.uint160помістити 20-байтове значення у стек
74PUSH213.uint168помістити 21-байтове значення у стек
75PUSH223.uint176помістити 22-байтове значення у стек
76PUSH233.uint184помістити 23-байтове значення у стек
77PUSH243.uint192помістити 24-байтове значення у стек
78PUSH253.uint200помістити 25-байтове значення у стек
79PUSH263.uint208помістити 26-байтове значення у стек
7APUSH273.uint216помістити 27-байтове значення у стек
7BPUSH283.uint224помістити 28-байтове значення у стек
7CPUSH293.uint232помістити 29-байтове значення у стек
7DPUSH303.uint240помістити 30-байтове значення у стек
7EPUSH313.uint248помістити 31-байтове значення у стек
7FPUSH323.uint256помістити 32-байтове значення у стек
80DUP13aa, aклонувати 1-е значення у стеку
81DUP23_, aa, _, aклонувати 2-е значення у стеку
82DUP33_, _, aa, _, _, aклонувати 3-є значення у стеку
83DUP43_, _, _, aa, _, _, _, aклонувати 4-е значення у стеку
84DUP53..., aa, ..., aклонувати 5-е значення у стеку
85DUP63..., aa, ..., aклонувати 6-е значення у стеку
86DUP73..., aa, ..., aклонувати 7-е значення у стеку
87DUP83..., aa, ..., aклонувати 8-е значення у стеку
88DUP93..., aa, ..., aклонувати 9-е значення у стеку
89DUP103..., aa, ..., aклонувати 10-е значення у стеку
8ADUP113..., aa, ..., aклонувати 11-е значення у стеку
8BDUP123..., aa, ..., aклонувати 12-е значення у стеку
8CDUP133..., aa, ..., aклонувати 13-е значення у стеку
8DDUP143..., aa, ..., aклонувати 14-е значення у стеку
8EDUP153..., aa, ..., aклонувати 15-е значення у стеку
8FDUP163..., aa, ..., aклонувати 16-е значення у стеку
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-EFнедійсний
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] = returndataте саме, що й DELEGATECALL, але не передає оригінальні msg.sender та 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-F9недійсний
FASTATICCALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCнедійсний
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)призначений недійсний опкод - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)addr.надсилає весь ETH на addr; якщо виконується в тій самій транзакції, в якій було створено контракт, він знищує контракт