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

Коды операций для EVM

Это обновленная версия справочной страницы EVM, доступной по адресу wolflo/evm-opcodes (открывается в новой вкладке). Также использованы материалы из желтой книги (открывается в новой вкладке), Jello Paper (открывается в новой вкладке) и реализации geth (открывается в новой вкладке). Этот материал задуман как доступный справочник, но он не претендует на абсолютную строгость. Если вы хотите быть уверены в правильности и знать о каждом крайнем случае, рекомендуется использовать Jello Paper или реализацию клиента.

Ищете интерактивный справочник? Загляните на evm.codes (открывается в новой вкладке).

Для операций с динамической стоимостью газа см. gas.md (открывается в новой вкладке).

💡 Полезный совет: чтобы просмотреть строки целиком, используйте [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 (открывается в новой вкладке)a, ba ** bвозведение в степень uint256 по модулю 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)расширение знака (открывается в новой вкладке) 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`ab`
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 (открывается в новой вкладке)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fнедействительно
30ADDRESS2.address(this)адрес выполняемого контракта
31BALANCEA5 (открывается в новой вкладке)addraddr.balanceбаланс, в Wei
32ORIGIN2.tx.originадрес, инициировавший транзакцию
33CALLER2.msg.senderадрес отправителя сообщения
34CALLVALUE2.msg.valueзначение сообщения, в Wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]чтение слова из данных сообщения по индексу idx
36CALLDATASIZE2.len(msg.data)длина данных сообщения, в байтах
37CALLDATACOPYA3 (открывается в новой вкладке)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]копирование данных сообщения
38CODESIZE2.len(this.code)длина кода выполняемого контракта, в байтах
39CODECOPYA3 (открывается в новой вкладке)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspriceцена газа транзакции, в Wei за единицу газа ** (открывается в новой вкладке)
3BEXTCODESIZEA5 (открывается в новой вкладке)addrlen(addr.code)размер кода по адресу addr, в байтах
3CEXTCODECOPYA4 (открывается в новой вкладке)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]копирование кода из addr
3DRETURNDATASIZE2.sizeразмер возвращенных данных из последнего внешнего вызова, в байтах
3ERETURNDATACOPYA3 (открывается в новой вкладке)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]копирование возвращенных данных из последнего внешнего вызова
3FEXTCODEHASHA5 (открывается в новой вкладке)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поместить текущий идентификатор цепи (открывается в новой вкладке) в стек
47SELFBALANCE5.address(this).balanceбаланс выполняемого контракта, в Wei
48BASEFEE2.block.basefeeбазовая комиссия текущего блока
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (открывается в новой вкладке)
4ABLOBBASEFEE2.block.blobbasefeeбазовая комиссия блоба текущего блока (EIP-7516 (открывается в новой вкладке))
4B-4Fнедействительно
50POP2_anon.удалить элемент с вершины стека и отбросить его
51MLOAD3* (открывается в новой вкладке)ostmem[ost:ost+32]чтение слова из памяти по смещению ost
52MSTORE3* (открывается в новой вкладке)ost, val.mem[ost:ost+32] := valзапись слова в память
53MSTORE83* (открывается в новой вкладке)ost, val.mem[ost] := val && 0xFFзапись одного байта в память
54SLOADA6 (открывается в новой вкладке)keystorage[key]чтение слова из хранилища
55SSTOREA7 (открывается в новой вкладке)key, val.storage[key] := valзапись слова в хранилище
56JUMP8dst.$pc := dst отмечает, что pc присваивается только в том случае, если dst является действительным jumpdest
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pcсчетчик команд
59MSIZE2.len(mem)размер памяти в текущем контексте выполнения, в байтах
5AGAS2.gasRemaining
5BJUMPDEST1отметить действительное место назначения переходадействительное место назначения перехода, например, место назначения перехода не внутри данных push
5CTLOAD100keytstorage[key]чтение слова из временного хранилища (EIP-1153 (открывается в новой вкладке))
5DTSTORE100key, val.tstorage[key] := valзапись слова во временное хранилище (EIP-1153 (открывается в новой вкладке))
5EMCOPY3+3*words+A0 (открывается в новой вкладке)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]копирование памяти из одной области в другую (EIP-5656 (открывается в новой вкладке))
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 (открывается в новой вкладке)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (открывается в новой вкладке)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (открывается в новой вкладке)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (открывается в новой вкладке)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (открывается в новой вкладке)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFнедействительно
F0CREATEA9 (открывается в новой вкладке)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (открывается в новой вкладке)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (открывается в новой вкладке)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndataто же, что и DELEGATECALL, но не передает исходные msg.sender и msg.value
F3RETURN0* (открывается в новой вкладке)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (открывается в новой вкладке)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (открывается в новой вкладке)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9недействительно
FASTATICCALLAA (открывается в новой вкладке)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCнедействительно
FDREVERT0* (открывается в новой вкладке)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (открывается в новой вкладке)назначенный недействительный код операции - EIP-141 (открывается в новой вкладке)
FFSELFDESTRUCTAB (открывается в новой вкладке)addr.отправляет все ETH на addr; если выполняется в той же транзакции, в которой был создан контракт, то уничтожает контракт