Доп 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* |