EVM 操作码和指令
2022-03-23 本文已影响0人
雪落无留痕
Opcode | Name | Description | Extra Info | Gas |
---|---|---|---|---|
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
|
Unused | Unused | - | |
0x10 |
LT | 小于比较 | - | 3 |
0x11 |
GT | 大于比较 | - | 3 |
0x12 |
SLT | 带符号的小于比较 | - | 3 |
0x13 |
SGT | 带符号的大小比较 | - | 3 |
0x14 |
EQ | 相等比较 | - | 3 |
0x15 |
ISZERO | NOT 操作 | - | 3 |
0x16 |
AND | 按位且操作 | - | 3 |
0x17 |
OR | 按位或操作 | - | 3 |
0x18 |
XOR | 按位异或操作 | - | 3 |
0x19 |
NOT | 按位非操作 | - | 3 |
0x1a |
BYTE | 从字中获取单个字节 | - | 3 |
0x1b |
SHL | 左移 | EIP145 | 3 |
0x1c |
SHR | 逻辑右移 | EIP145 | 3 |
0x1d |
SAR | 数值右移 | EIP145 | 3 |
0x20 |
KECCAK256 | 计算Keccak-256 hash | - | 30* |
0x21-0x2f |
Unused | Unused | ||
0x30 |
ADDRESS | 获取目前执行账户的地址 | - | 2 |
0x31 |
BALANCE | 获取账户余额 | - | |
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 | 获取gas的价格 | - | 2 |
0x3b |
EXTCODESIZE | 获取账户代码 | - | 700 |
0x3c |
EXTCODECOPY | 复制账户代码到内存中 | - | 700* |
0x3d |
RETURNDATASIZE | 将返回数据大小推到栈上 | EIP 211 | 2 |
0x3e |
RETURNDATACOPY | 复到返回数据到内存中 | EIP 211 | 3 |
0x3f |
EXTCODEHASH | 返回合约代码keccak256 hash | EIP 1052 | 700 |
0x40 |
BLOCKHASH | 获取最近256个块的其中一个hash | - | 20 |
0x41 |
COINBASE | 获取块的收益地址 | - | 2 |
0x42 |
TIMESTAMP | 获取块的时间戳 | - | 2 |
0x43 |
NUMBER | 获取块号 | - | 2 |
0x44 |
DIFFICULTY | 获取块的难度值 | - | 2 |
0x45 |
GASLIMIT | 获取块的gaslimit | - | 2 |
0x46 |
CHAINID | 返加链的惟一识别符 | EIP 1344 | 2 |
0x47-0x4f |
Unused | - | ||
0x48 |
BASEFEE | 返回当前块的基本fee | EIP 3198 | 2 |
0x50 |
POP | 从栈中移除 | - | 2 |
0x51 |
MLOAD | 从内存中载入一个字 | - | 3* |
0x52 |
MSTORE | 保存字到内存中 | - | 3* |
0x53 |
MSTORE8 | 保存字节到内存中 | - | 3 |
0x54 |
SLOAD | 从存储中载入字 | - | 800 |
0x55 |
SSTORE | 将字存入存储中 | - | 20000* |
0x56 |
JUMP | 更改程序计数器 | - | 8 |
0x57 |
JUMPI | 有条件地更改程序计数器 | - | 10 |
0x58 |
GETPC | 获取程序计算器的值 | - | 2 |
0x59 |
MSIZE | 获取活跃内存中字节的大小 | - | 2 |
0x5a |
GAS | 获得可获取的gas | - | 2 |
0x5b |
JUMPDEST | 标记一个有效的JUMP 目标 | - | 1 |
0x5c-0x5f |
Unused | - | ||
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 | 添加log记录,无topics | - | 375 |
0xa1 |
LOG1 | 添加log记录,1个topics | - | 750 |
0xa2 |
LOG2 | 添加log记录,2个topics | - | 1125 |
0xa3 |
LOG3 | 添加log记录,3个topics | - | 1500 |
0xa4 |
LOG4 | 添加log记录,4个topics | - | 1875 |
0xa5-0xaf |
Unused | - | ||
0xb0 |
JUMPTO | Tentative | EIP 615 | |
0xb1 |
JUMPIF | Tentative | EIP 615 | |
0xb2 |
JUMPSUB | Tentative | EIP 615 | |
0xb4 |
JUMPSUBV | Tentative | EIP 615 | |
0xb5 |
BEGINSUB | Tentative | EIP 615 | |
0xb6 |
BEGINDATA | Tentative | EIP 615 | |
0xb8 |
RETURNSUB | Tentative | EIP 615 | |
0xb9 |
PUTLOCAL | Tentative | EIP 615 | |
0xba |
GETLOCAL | Tentative | EIP 615 | |
0xbb-0xe0 |
Unused | - | ||
0xe1 |
SLOADBYTES | Only referenced in pyethereum | - | - |
0xe2 |
SSTOREBYTES | Only referenced in pyethereum | - | - |
0xe3 |
SSIZE | Only referenced in pyethereum | - | - |
0xe4-0xef |
Unused | - | ||
0xf0 |
CREATE | 创建一个新的账户和相关的代码 | - | 32000 |
0xf1 |
CALL | 对账户消息调用 | - | Complicated |
0xf2 |
CALLCODE | 对账户代码的消息调用 | - | Complicated |
0xf3 |
RETURN | 中断执行,返回输出数据 | - | 0 |
0xf4 |
DELEGATECALL | 代理调用账户的代码 | Complicated | |
0xf5 |
CREATE2 | sha3(sender + sha3(init code)) % 2**160 |
- | |
0xf6-0xf9 |
Ununsed | - | - | |
0xfa |
STATICCALL | 类似CALL,但不修改状态 | - | 40 |
0xfb |
Unused | - | - | |
0xfc |
TXEXECGAS | - | - | |
0xfd |
REVERT | 停止执行,撤销状态的改变 | - | 0 |
0xfe |
INVALID | 指令的无效的指令 | - | 0 |
0xff |
SELFDESTRUCT | 中断执行 | - | 5000* |