Доп 3. Коды EVM и потребление газа

Это приложение основано на работе по консолидации, проделанной людьми с сайта https://github.com/trailofbits/evm-opcodes в качестве справочника по опкодам и информации об инструкциях Ethereum VM (EVM), лицензированного по лицензии Apache License 2.0.

Таблица 1. Опкоды EVM и стоимость газа

Опкод Имя Описание Доп Газ
0x00 STOP Остановка выполнения - 0
0x01 ADD Операция сложения - 3
0x02 MUL Операция умножения - 5
0x03 SUB Операция вычитания - 3
0x04 DIV Операция деления целых чисел - 5
0x05 SDIV Операция деления целого числа со знаком (усеченная) - 5
0x06 MOD Операция остатка по модулю - 5
0x07 SMOD Операция знакового модульного остатка - 5
0x08 ADDMOD Операция сложения по модулю - 8
0x09 MULMOD Операция умножения по модулю - 8
0x0a EXP Экспоненциальная операция - 10***
0x0b SIGNEXTEND Увеличение длины целого знакового числа с двойным дополнением - 5
0x0c - 0x0f Неиспользуемые - - -
0x10 LT Меньше, чем сравнение - 3
0x11 GT Больше, чем сравнение - 3
0x12 SLT Подписанное сравнение меньшего с меньшим - 3
0x13 SGT Знак больше, чем сравнение - 3
0x14 EQ Сравнение по качеству - 3
0x15 ISZERO Простой оператор NOT - 3
0x16 AND Побитовая операция AND - 3
0x17 OR Поразрядная операция OR - 3
0x18 XOR Битрейшая операция XOR - 3
0x19 NOT Битрейшая операция NOT - 3
0x1a BYTE Получение одного байта из слова - 3
0x1b - 0x1f Неиспользуемые - - -
0x20 SHA3 Вычисление хэша Keccak-256 - 30
0x21 - 0x2f Неиспользуемые - - -
0x30 ADDRESS Получение адреса текущего исполняемого счета - 2
0x31 BALANCE Получение баланса данного счета - 400
0x32 ORIGIN Получение адреса начала исполнения - 2
0x33 CALLER Получение адреса вызывающего абонента - 2
0x34 CALLVALUE Получение значения, депонированного инструкцией/транзакцией, ответственной за данное выполнение - 2
0x35 CALLDATALOAD Получение входных данных текущей среды - 3
0x36 CALLDATASIZE Получение размера входных данных в текущей среде - 2
0x37 CALLDATACOPY Копирование входных данных в текущей среде в память - 3
0x38 CODESIZE Получить размер кода, выполняемого в текущей среде - 2
0x39 CODECOPY Копирование кода, выполняющегося в текущей среде, в память - 3
0x3a GASPRICE Получение цены на газ в текущей среде - 2
0x3b EXTCODESIZE Получение размера кода счета - 700
0x3c EXTCODECOPY Копирование кода счета в память - 700
0x3d RETURNDATASIZE Загоняет размер буфера данных возврата в стек EIP-211 2
0x3e RETURNDATACOPY Копирует данные из буфера возвращенных данных в память EIP-211 3
0x3f Неиспользуемый - - -
0x40 BLOCKHASH Получение хэша одного из 256 последних полных блоков - 20
0x41 COINBASE Получение адреса получателя блока - 2
0x42 TIMESTAMP Получение временной метки блока - 2
0x43 NUMBER Получить номер блока - 2
0x44 DIFFICULTY Получить сложность блока - 2
0x45 GASLIMIT Получить лимит газа блока - 2
0x46 - 0x4f Неиспользуемые - - -
0x50 POP Удаление слова из стека - 2
0x51 MLOAD Загрузка слова из памяти - 3
0x52 MSTORE Сохранение слова в память - 3*
0x53 MSTORE8 Сохранение байта в память - 3
0x54 SLOAD Загрузка слова из памяти - 200
0x55 SSTORE Сохранение слова в память - 0*
0x56 JUMP Альтернативный счетчик программы - 8
0x57 JUMPI Условное изменение счетчика программы - 10
0x58 GETPC Получение значения программного счетчика перед инкрементом - 2
0x59 MSIZE Получить размер активной памяти в байтах - 2
0x5a GAS Получение количества доступного газа, включая соответствующее уменьшение количества доступного газа - 2
0x5b JUMPDEST Маркировка допустимого места назначения для прыжков - 1
0x5c - 0x5f Неиспользуемые - - -
0x60 PUSH1 Поместить 1-байтовый элемент в стек - 3
0x61 PUSH2 Поместить 2-байтовый элемент в стек - 3
0x62 PUSH3 Поместить 3-байтовый элемент в стек - 3
0x63 PUSH4 Поместить 4-байтовый элемент в стек - 3
0x64 PUSH5 Поместить 5-байтовый элемент в стек - 3
0x65 PUSH6 Поместить 6-байтовый элемент в стек - 3
0x66 PUSH7 Поместить 7-байтовый элемент в стек - 3
0x67 PUSH8 Поместить 8-байтовый элемент в стек - 3
0x68 PUSH9 Поместить 9-байтовый элемент в стек - 3
0x69 PUSH10 Поместить 10-байтовый элемент в стек - 3
0x6a PUSH11 Поместить 11-байтовый элемент в стек - 3
0x6b PUSH12 Поместить 12-байтовый элемент в стек - 3
0x6c PUSH13 Поместить 13-байтовый элемент в стек - 3
0x6d PUSH14 Поместить 14-байтовый элемент в стек - 3
0x6e PUSH15 Поместить 15-байтовый элемент в стек - 3
0x6f PUSH16 Поместить 16-байтовый элемент в стек - 3
0x70 PUSH17 Поместить 17-байтовый элемент в стек - 3
0x71 PUSH18 Поместить 18-байтовый элемент в стек - 3
0x72 PUSH19 Поместить 19-байтовый элемент в стек - 3
0x73 PUSH20 Поместить 20-байтовый элемент в стек - 3
0x74 PUSH21 Поместить 21-байтовый элемент в стек - 3
0x75 PUSH22 Поместить 22-байтовый элемент в стек - 3
0x76 PUSH23 Поместить 23-байтовый элемент в стек - 3
0x77 PUSH24 Поместить 24-байтовый элемент в стек - 3
0x78 PUSH25 Поместить 25-байтовый элемент в стек - 3
0x79 PUSH26 Поместить 26-байтовый элемент в стек - 3
0x7a PUSH27 Поместить 27-байтовый элемент в стек - 3
0x7b PUSH28 Поместить 28-байтовый элемент в стек - 3
0x7c PUSH29 Поместить 29-байтовый элемент в стек - 3
0x7d PUSH30 Поместить 30-байтовый элемент в стек - 3
0x7e PUSH31 Поместить 31-байтовый элемент в стек - 3
0x7f PUSH32 Поместить 32-байтовый элемент (полное слово) в стек - 3
0x80 DUP1 Дублирование 1-го элемента стека - 3
0x81 DUP2 Дублирование 2-го элемента стека - 3
0x82 DUP3 Дублирование 3-го элемента стека - 3
0x83 DUP4 Дублирование 4-го элемента стека - 3
0x84 DUP5 Дубликат 5-го элемента стека - 3
0x85 DUP6 Дубликат 6-го элемента стека - 3
0x86 DUP7 Дубликат 7-го элемента стека - 3
0x87 DUP8 Дубликат 8-го элемента стека - 3
0x88 DUP9 Дубликат 9-го элемента стека - 3
0x89 DUP10 Дубликат 10-го элемента стека - 3
0x8a DUP11 Дубликат 11-го элемента стека - 3
0x8b DUP12 Дубликат 12-го элемента стека - 3
0x8c DUP13 Дубликат 13-го элемента стека - 3
0x8d DUP14 Дубликат 14-го элемента стека - 3
0x8e DUP15 Дубликат 15-го элемента стека - 3
0x8f DUP16 Дубликат 16-го элемента стека - 3
0x90 SWAP1 Замена 1-го и 2-го элементов стека - 3
0x91 SWAP2 Замена 1-го и 3-го элементов стека - 3
0x92 SWAP3 Замена 1-го и 4-го элементов стека - 3
0x93 SWAP4 Замена 1-го и 5-го элементов стека - 3
0x94 SWAP5 Замена 1-го и 6-го элементов стека - 3
0x95 SWAP6 Замена 1-го и 7-го элементов стека - 3
0x96 SWAP7 Замена 1-го и 8-го элементов стека - 3
0x97 SWAP8 Замена 1-го и 9-го элементов стека - 3
0x98 SWAP9 Замена 1-го и 10-го элементов стека - 3
0x99 SWAP10 Замена 1-го и 11-го элементов стека - 3
0x9a SWAP11 Замена 1-го и 12-го элементов стека - 3
0x9b SWAP12 Замена 1-го и 13-го элементов стека - 3
0x9c SWAP13 Замена 1-го и 14-го элементов стека - 3
0x9d SWAP14 Замена 1-го и 15-го элементов стека - 3
0x9e SWAP15 Замена 1-го и 16-го элементов стека - 3
0x9f SWAP16 Замена 1-го и 17-го элементов стека - 3
0xa0 LOG0 Добавить запись журнала без тем - 375
0xa1 LOG1 Добавить запись журнала с одной темой - 750
0xa2 LOG2 Добавить запись журнала с двумя темами - 1125
0xa3 LOG3 Добавить запись журнала с тремя темами - 1500
0xa4 LOG4 Добавить запись журнала с четырьмя темами - 1875
0xa5 - 0xaf Неиспользуемые - - -
0xb0 JUMPTO Тенденция http://bit.ly/2Sx2Vkg[libevmasm имеет другие номера] EIP615
0xb1 JUMPIF Tentative EIP615
0xb2 JUMPSUB Tentative EIP615
0xb4 JUMPSUBV Tentative EIP615
0xb5 BEGINSUB Tentative EIP615
0xb6 BEGINDATA Tentative EIP615
0xb8 RETURNSUB Tentative EIP615
0xb9 PUTLOCAL Обязательно EIP615
0xba GETLOCA Tentative EIP615
0xbb - 0xe0 Неиспользуемые - - -
0xe1 SLOADBYTES Только в pyethereum - -
0xe2 SSTOREBYTES Только в pyethereum - -
0xe3 SSIZE Только в pyethereum - -
0xe4 - 0xef Неиспользуемые - - -
0xf0 CREATE Создать новый аккаунт с ассоциированным кодом - 32000
0xf1 CALL Отправка сообщения на счет - Complicated
0xf2 CALLCODE Отправка сообщения на этот счет с альтернативным кодом счета - Complicated
0xf3 RETURN+ Выполнение шага, возвращающего выходные данные - 0
0xf4 DELEGATECALL Вызов сообщения на этот счет с кодом альтернативного счета, но персистинг на этот счет с кодом альтернативного счета - Сложный
0xf5 CALLBLACKBOX - - 40
0xf6 - 0xf9 Неиспользуемые - - -
0xfa STATICCALL Похож на CALL, но не изменяет состояние - 40
0xfb CREATE2 Создание нового аккаунта и установка адреса создания в sha3(sender + sha3(init code)) % 2**160 - -
0xfc TXEXECGAS Не в желтой бумаге FIXME - -
0xfd REVERT Остановить выполнение и вернуть изменения состояния, не израсходовав весь предоставленный газ и не указав причину - 0
0xfe INVALID Определение недействительной инструкции - 0
0xff SELFDESTRUCT Остановить выполнение и зарегистрировать счет для последующего удаления - 5000*