Перейти к основному содержанию
Change page

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

Последнее обновление страницы: 11 сентября 2025 г.

Обзор

Это обновленная версия справочной страницы по 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 или клиентскую реализацию.

Ищете интерактивный справочник? Ознакомьтесь с evm.codes (opens in a new tab).

Информацию об операциях с динамической стоимостью газа см. в gas.md (opens in a new tab).

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

СтекИмяГазИсходный стекИтоговый стекПамять/хранилищеПримечания
00Приостановка выполнения0остановка выполнения
01Добавление3a, ba + bсложение (u)int256 по модулю 2**256
02MUL5a, ba * bумножение (u)int256 по модулю 2**256
03Вычитание3a, 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недопустимо
10Меньше, чем сравниваемое3a, ba < buint256 меньше чем
11Больше, чем сравниваемое3a, ba > buint256 больше чем
12Подписано меньше, чем сравниваемое3a, ba < bint256 меньше чем
13SGT3a, ba > bint256 больше чем
14EQ3a, ba == bравенство (u)int256
15Просто НЕ оператор3aa == 0проверка на ноль (u)int256
16Побитовое И операция3a, ba && bпобитовое И
17OR3a, b`a \\b`
18XOR3a, ba ^ bпобитовое исключающее ИЛИ
19Побитовое НЕ операция3a~aпобитовое НЕ
BYTE3i, x(x >> (248 - i * 8)) && 0xFFi-й байт (u)int256 x, слева
1BSHL3shift, valval << shiftсдвиг влево
1CСместиться вправо3shift, 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)
34Получение внесенной суммы по инструкции/транзакция отвечающая за это выполнение2.уточнить суммузначение сообщения (msg), в wei
35Получить входные данные текущей среды3idxmsg.data[idx:idx+32]прочитать слово из данных сообщения (msg) по индексу idx
36Получить размер входных данных текущей среды2.len(msg.data)длина данных сообщения (msg), в байтах
37Скопировать входных данные текущей средыA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]копировать данные сообщения (msg)
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)размер кода по адресу (addr), в байтах
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)addrхэшхэш = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbaseадрес предлагающего текущий блок
42TIMESTAMP2.block.timestampвременная метка текущего блока
43NUMBER2.block.numberномер текущего блока
44PREVRANDAO2.маяк случайностимаяк случайности
45GASLIMIT2.block.gaslimitлимит газа текущего блока
46CHAINID2.chain_idпоместить текущий ID сети (opens in a new tab) в стек
47SELFBALANCE5.address(this).balanceбаланс исполняемого контракта, в wei
48BASEFEE2.block.basefeeбазовая комиссия текущего блока
49Получить хэш одного из последних завершённых 256 блоков3idxtx.blob_versioned_hashes[idx]EIP-4844 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeeбазовая комиссия за BLOB-объект текущего блока (EIP-7516 (opens in a new tab))
4B-4Fнедопустимо
50удалить слово из стека2_anon.удалить элемент с вершины стека и отбросить его
51Загрузить слово из памяти3* (opens in a new tab)ostmem[ost:ost+32]прочитать слово из памяти по смещению ost
52Сохранить слово в память3* (opens in a new tab)ost, val.mem[ost:ost+32] := valзаписать слово в память
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFзаписать один байт в память
54Загрузить слово из хранилищаA6 (opens in a new tab)keystorage[key]прочитать слово из хранилища
55Сохранить слово в хранилищеA7 (opens in a new tab)key, val.storage[key] := valзаписать слово в хранилище
56Изменить счетчик команд8dst.$pc := dst указывает, что pc присваивается, только если dst является допустимым местом назначения перехода
57Условно изменить счетчик команд10dst, condition.$pc := condition ? dst : $pc + 1`
58PC2.$pcсчетчик команд
59MSIZE2.len(mem)размер памяти в текущем контексте выполнения, в байтах
5AПолучить количество доступного газа, включая соответсвующее сокращение количества доступного газа2.gasRemaining
5BОтметить допустимое место для прыжков1отметить допустимое место назначения переходадопустимое место назначения перехода, например, место назначения перехода не внутри данных 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.вернуть 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.отменить(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; если выполняется в той же транзакции, в которой был создан контракт, уничтожает контракт

Была ли эта статья полезной?