Перейти к основному контенту
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 < buint256 меньше чем
11GT3a, ba > buint256 больше чем
12SLT3a, ba < bint256 меньше чем
13SGT3a, ba > bint256 больше чем
14EQ3a, ba == bравенство (u)int256
15ISZERO3aa == 0(u)int256 равно нулю
16AND3a, ba && bпобитовое И
17OR3a, ba || 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)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помещение текущего идентификатора цепи (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счетчик команд
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; если выполняется в той же транзакции, в которой был создан контракт, он уничтожает контракт