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

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

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

Обзор

Это обновленная версия справочной страницы по EVM на wolflo/evm-opcodesopens in a new tab. Также использованы материалы из «Желтой книги»opens in a new tab, Jello Paperopens in a new tab и реализации gethopens in a new tab. Предполагается, что этот справочник доступен, но не очень строг. Если вы хотите быть уверены в правильности и знать о каждом крайнем случае, рекомендуется использовать Книгу Jello или клиентскую реализацию.

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

Информацию об операциях с динамической стоимостью газа см. в gas.mdopens 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
0AEXPA1opens in a new taba, 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недопустимо
20KECCAK256A2opens in a new tabost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fнедопустимо
30ADDRESS2.address(this)адрес исполняемого контракта
31BALANCEA5opens in a new tabaddraddr.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Скопировать входных данные текущей средыA3opens in a new tabdstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]копировать данные сообщения (msg)
38CODESIZE2.len(this.code)длина кода исполняемого контракта, в байтах
39CODECOPYA3opens in a new tabdstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]копировать байт-код исполняемого контракта
3AGASPRICE2.tx.gaspriceцена газа транзакции, в wei за единицу газа **opens in a new tab
3BEXTCODESIZEA5opens in a new tabaddrlen(addr.code)размер кода по адресу (addr), в байтах
3CEXTCODECOPYA4opens in a new tabaddr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]копировать код из addr
3DRETURNDATASIZE2.sizeразмер возвращенных данных из последнего внешнего вызова, в байтах
3ERETURNDATACOPYA3opens in a new tabdstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]копировать возвращенные данные из последнего внешнего вызова
3FEXTCODEHASHA5opens in a new tabaddrхэшхэш = 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-4844opens in a new tab
4ABLOBBASEFEE2.block.blobbasefeeбазовая комиссия за BLOB-объект текущего блока (EIP-7516opens in a new tab)
4B-4Fнедопустимо
50удалить слово из стека2_anon.удалить элемент с вершины стека и отбросить его
51Загрузить слово из памяти3*opens in a new tabostmem[ost:ost+32]прочитать слово из памяти по смещению ost
52Сохранить слово в память3*opens in a new tabost, val.mem[ost:ost+32] := valзаписать слово в память
53MSTORE83*opens in a new tabost, val.mem[ost] := val && 0xFFзаписать один байт в память
54Загрузить слово из хранилищаA6opens in a new tabkeystorage[key]прочитать слово из хранилища
55Сохранить слово в хранилищеA7opens in a new tabkey, 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-1153opens in a new tab)
5DTSTORE100key, val.tstorage[key] := valзаписать слово во временное хранилище (EIP-1153opens in a new tab)
5EMCOPY3+3*words+A0opens in a new tabdstOst, ost, len.mem[dstOst] := mem[ost:ost+len]копировать память из одной области в другую (EIP-5656opens 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
A0LOG0A8opens in a new tabost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8opens in a new tabost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8opens in a new tabost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8opens in a new tabost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8opens in a new tabost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFнедопустимо
F0CREATEA9opens in a new tabval, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAAopens in a new tabgas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAAopens in a new tabgas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndataто же, что и DELEGATECALL, но не передает исходные msg.sender и msg.value
F3RETURN0*opens in a new tabost, len.вернуть mem[ost:ost+len-1]
F4DELEGATECALLAAopens in a new tabgas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9opens in a new tabval, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9недопустимо
FASTATICCALLAAopens in a new tabgas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCнедопустимо
FDREVERT0*opens in a new tabost, len.отменить(mem[ost:ost+len-1])
FEINVALIDAFopens in a new tabобозначенный недействительный опкод - EIP-141opens in a new tab
FFSELFDESTRUCTABopens in a new tabaddr.отправляет все ETH на addr; если выполняется в той же транзакции, в которой был создан контракт, уничтожает контракт

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