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

Коди операцій для віртуальної машини Ethereum

Останні оновлення сторінки: 11 вересня 2025 р.

Огляд

Це оновлена версія довідкової сторінки EVM за посиланням wolflo/evm-opcodes (opens in a new tab). Також використано матеріали з Yellow Paper (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 для горизонтального прокручування на комп’ютері.

СтекІм’яGasПочатковий стекРезультівний стекПамʼять / ДискПримітки
00Зупинка0зупинити виконання
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 < buint256 менше ніж
11GT3a, ba > buint256 більше ніж
12SLT3a, ba < bint256 менше ніж
13SGT3a, ba > bint256 більше ніж
14EQ3a, ba == bрівність (u)int256
15ISZERO3aa == 0(u)int256 дорівнює нулю
16AND3a, ba && bпобітове І
17OR3a, b`a \\b`
18XOR3a, ba ^ bпобітове виключне АБО
19NOT3a~aпобітове НЕ
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адреса відправника повідомлення
34CALLVALUE2.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)addrhashхеш = 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помістити поточний 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базова комісія за BLOB-об'єкти поточного блоку (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 є дійсним місцем для переходу
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pcлічильник команд
59MSIZE2.len(mem)розмір пам’яті в поточному контексті виконання, у байтах
5AGAS2.gasRemaining
5BJUMPDEST1позначити дійсне місце для переходудійсне місце для переходу, наприклад, місце для переходу не всередині даних 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
F3Повернення0* (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недійсний
FDПовернення0* (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; якщо виконується в тій самій транзакції, в якій було створено контракт, то знищує контракт

Чи була ця стаття корисною?