EVMのオペコード
概要
wolflo/evm-opcodesで公開されているEVMリファレンスページの最新版です。 Yellow Paper、Jello Paper、gethの実装からも引用されています。 わかりやすいリファレンスを目指していますが、とりわけ厳密なものではありません。 すべてのエッジケースを正確に把握したい場合は、Jello Paperまたはクライアント実装をご利用ください。
インタラクティブなリファレンスも用意されているので、 evm.codesをご覧ください。
ダイナミックなガス代の演算については、gas.mdを参照してください。
💡 ヒント: 行全体を表示するには、 [shift] + スクロールを使用してデスクトップ上で水平方向にスクロールします。
| スタック | 名前 | ガス | 初期スタック | 結果スタック | Mem/ストレージ | 注記 |
|---|---|---|---|---|---|---|
| 00 | STOP | 0 | halt execution | |||
| 01 | ADD | 3 | a, b | a + b | (u)int256 addition modulo 2**256 | |
| 02 | MUL | 5 | a, b | a * b | (u)int256 multiplication modulo 2**256 | |
| 03 | SUB | 3 | a, b | a - b | (u)int256 addition modulo 2**256 | |
| 04 | DIV | 5 | a, b | a // b | uint256 division | |
| 05 | SDIV | 5 | a, b | a // b | int256 division | |
| 06 | MOD | 5 | a, b | a % b | uint256 modulus | |
| 07 | SMOD | 5 | a, b | a % b | int256 modulus | |
| 08 | ADDMOD | 8 | a, b, N | (a + b) % N | (u)int256 addition modulo N | |
| 09 | MULMOD | 8 | a, b, N | (a * b) % N | (u)int256 multiplication modulo N | |
| 0A | EXP | A1 | a, b | a ** b | uint256 exponentiation modulo 2**256 | |
| 0B | SIGNEXTEND | 5 | b, x | SIGNEXTEND(x, b) | sign extend x from (b+1) bytes to 32 bytes | |
| 0C-0F | invalid | |||||
| 10 | LT | 3 | a, b | a < b | uint256 less-than | |
| 11 | GT | 3 | a, b | a > b | uint256 greater-than | |
| 12 | SLT | 3 | a, b | a < b | int256 less-than | |
| 13 | SGT | 3 | a, b | a > b | int256 greater-than | |
| 14 | EQ | 3 | a, b | a == b | (u)int256 equality | |
| 15 | ISZERO | 3 | a | a == 0 | (u)int256 iszero | |
| 16 | AND | 3 | a, b | a && b | bitwise AND | |
| 17 | OR | 3 | a, b | a || b | bitwise OR | |
| 18 | XOR | 3 | a, b | a ^ b | bitwise XOR | |
| 19 | NOT | 3 | a | ~a | bitwise NOT | |
| 1A | BYTE | 3 | i, x | (x >> (248 - i * 8)) && 0xFF | ith byte of (u)int256 x, from the left | |
| 1B | SHL | 3 | shift, val | val << shift | shift left | |
| 1C | SHR | 3 | shift, val | val >> shift | logical shift right | |
| 1D | SAR | 3 | shift, val | val >> shift | arithmetic shift right | |
| 1E-1F | invalid | |||||
| 20 | KECCAK256 | A2 | ost, len | keccak256(mem[ost:ost+len-1]) | keccak256 | |
| 21-2F | invalid | |||||
| 30 | ADDRESS | 2 | 。 | address(this) | address of executing contract | |
| 31 | BALANCE | A5 | addr | addr.balance | balance, in wei | |
| 32 | ORIGIN | 2 | 。 | tx.origin | address that originated the tx | |
| 33 | CALLER | 2 | 。 | msg.sender | address of msg sender | |
| 34 | CALLVALUE | 2 | 。 | msg.value | msg value, in wei | |
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | read word from msg data at index idx | |
| 36 | CALLDATASIZE | 2 | 。 | len(msg.data) | length of msg data, in bytes | |
| 37 | CALLDATACOPY | A3 | dstOst, ost, len | 。 | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copy msg data |
| 38 | CODESIZE | 2 | 。 | len(this.code) | length of executing contract's code, in bytes | |
| 39 | CODECOPY | A3 | dstOst, ost, len | 。 | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | |
| 3A | GASPRICE | 2 | 。 | tx.gasprice | gas price of tx, in wei per unit gas ** | |
| 3B | EXTCODESIZE | A5 | addr | len(addr.code) | size of code at addr, in bytes | |
| 3C | EXTCODECOPY | A4 | addr, dstOst, ost, len | 。 | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copy code from addr |
| 3D | RETURNDATASIZE | 2 | 。 | size | size of returned data from last external call, in bytes | |
| 3E | RETURNDATACOPY | A3 | dstOst, ost, len | 。 | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copy returned data from last external call |
| 3F | EXTCODEHASH | A5 | addr | ハッシュ | hash = addr.exists ? keccak256(addr.code) : 0 | |
| 40 | BLOCKHASH | 20 | blockNum | blockHash(blockNum) | ||
| 41 | COINBASE | 2 | 。 | block.coinbase | 現在のブロックの提案者アドレス | |
| 42 | TIMESTAMP | 2 | 。 | block.timestamp | timestamp of current block | |
| 43 | NUMBER | 2 | 。 | block.number | number of current block | |
| 44 | PREVRANDAO | 2 | 。 | randomness beacon | randomness beacon | |
| 45 | GASLIMIT | 2 | 。 | block.gaslimit | gas limit of current block | |
| 46 | CHAINID | 2 | 。 | chain_id | push current chain id onto stack | |
| 47 | SELFBALANCE | 5 | 。 | address(this).balance | balance of executing contract, in wei | |
| 48 | BASEFEE | 2 | 。 | block.basefee | base fee of current block | |
| 49 | BLOBHASH | 3 | idx | tx.blob_versioned_hashes[idx] | EIP-4844 | |
| 4A | BLOBBASEFEE | 2 | 。 | block.blobbasefee | 現在のブロックのブロブベースフィー(EIP-7516) | |
| 4B-4F | invalid | |||||
| 50 | POP | 2 | _anon | 。 | remove item from top of stack and discard it | |
| 51 | MLOAD | 3* | ost | mem[ost:ost+32] | read word from memory at offset ost | |
| 52 | MSTORE | 3* | ost, val | 。 | mem[ost:ost+32] := val | write a word to memory |
| 53 | MSTORE8 | 3* | ost, val | 。 | mem[ost] := val && 0xFF | write a single byte to memory |
| 54 | SLOAD | A6 | key | storage[key] | read word from storage | |
| 55 | SSTORE | A7 | key, val | 。 | storage[key] := val | write word to storage |
| 56 | JUMP | 8 | dst | 。 | $pc := dst mark that pc is only assigned if dst is a valid jumpdest | |
| 57 | JUMPI | 10 | dst, condition | 。 | $pc := condition ? dst : $pc + 1 | |
| 58 | PC | 2 | 。 | $pc | program counter | |
| 59 | MSIZE | 2 | 。 | len(mem) | size of memory in current execution context, in bytes | |
| 5A | GAS | 2 | 。 | gasRemaining | ||
| 5B | JUMPDEST | 1 | mark valid jump destination | a valid jump destination for example a jump destination not inside the push data | ||
| 5C | TLOAD | 100 | key | tstorage[key] | 一時ストレージからワードを読み込む(EIP-1153) | |
| 5D | TSTORE | 100 | key, val | 。 | tstorage[key] := val | 一時ストレージへワードを書き込む (EIP-1153) |
| 5E | MCOPY | 3+3*words+A0 | dstOst, ost, len | 。 | mem[dstOst] := mem[ost:ost+len] | メモリをあるエリアから別のエリアへコピーする(EIP-5656) |
| 5E | PUSH0 | 2 | 。 | uint8 | スタックへ定数値0をプッシュ | |
| 60 | PUSH1 | 3 | 。 | uint8 | push 1-byte value onto stack | |
| 61 | PUSH2 | 3 | 。 | uint16 | push 2-byte value onto stack | |
| 62 | PUSH3 | 3 | 。 | uint24 | push 3-byte value onto stack | |
| 63 | PUSH4 | 3 | 。 | uint32 | push 4-byte value onto stack | |
| 64 | PUSH5 | 3 | 。 | uint40 | push 5-byte value onto stack | |
| 65 | PUSH6 | 3 | 。 | uint48 | push 6-byte value onto stack | |
| 66 | PUSH7 | 3 | 。 | uint56 | push 7-byte value onto stack | |
| 67 | PUSH8 | 3 | 。 | uint64 | push 8-byte value onto stack | |
| 68 | PUSH9 | 3 | 。 | uint72 | push 9-byte value onto stack | |
| 69 | PUSH10 | 3 | 。 | uint80 | push 10-byte value onto stack | |
| 6A | PUSH11 | 3 | 。 | uint88 | push 11-byte value onto stack | |
| 6B | PUSH12 | 3 | 。 | uint96 | push 12-byte value onto stack | |
| 6C | PUSH13 | 3 | 。 | uint104 | push 13-byte value onto stack | |
| 6D | PUSH14 | 3 | 。 | uint112 | push 14-byte value onto stack | |
| 6E | PUSH15 | 3 | 。 | uint120 | push 15-byte value onto stack | |
| 6F | PUSH16 | 3 | 。 | uint128 | push 16-byte value onto stack | |
| 70 | PUSH17 | 3 | 。 | uint136 | push 17-byte value onto stack | |
| 71 | PUSH18 | 3 | 。 | uint144 | push 18-byte value onto stack | |
| 72 | PUSH19 | 3 | 。 | uint152 | push 19-byte value onto stack | |
| 73 | PUSH20 | 3 | 。 | uint160 | push 20-byte value onto stack | |
| 74 | PUSH21 | 3 | 。 | uint168 | push 21-byte value onto stack | |
| 75 | PUSH22 | 3 | 。 | uint176 | push 22-byte value onto stack | |
| 76 | PUSH23 | 3 | 。 | uint184 | push 23-byte value onto stack | |
| 77 | PUSH24 | 3 | 。 | uint192 | push 24-byte value onto stack | |
| 78 | PUSH25 | 3 | 。 | uint200 | push 25-byte value onto stack | |
| 79 | PUSH26 | 3 | 。 | uint208 | push 26-byte value onto stack | |
| 7A | PUSH27 | 3 | 。 | uint216 | push 27-byte value onto stack | |
| 7B | PUSH28 | 3 | 。 | uint224 | push 28-byte value onto stack | |
| 7C | PUSH29 | 3 | 。 | uint232 | push 29-byte value onto stack | |
| 7D | PUSH30 | 3 | 。 | uint240 | push 30-byte value onto stack | |
| 7E | PUSH31 | 3 | 。 | uint248 | push 31-byte value onto stack | |
| 7F | PUSH32 | 3 | 。 | uint256 | push 32-byte value onto stack | |
| 80 | DUP1 | 3 | a | a, a | clone 1st value on stack | |
| 81 | DUP2 | 3 | _, a | a, _, a | clone 2nd value on stack | |
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | clone 3rd value on stack | |
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | clone 4th value on stack | |
| 84 | DUP5 | 3 | ..., a | a, ..., a | clone 5th value on stack | |
| 85 | DUP6 | 3 | ..., a | a, ..., a | clone 6th value on stack | |
| 86 | DUP7 | 3 | ..., a | a, ..., a | clone 7th value on stack | |
| 87 | DUP8 | 3 | ..., a | a, ..., a | clone 8th value on stack | |
| 88 | DUP9 | 3 | ..., a | a, ..., a | clone 9th value on stack | |
| 89 | DUP10 | 3 | ..., a | a, ..., a | clone 10th value on stack | |
| 8A | DUP11 | 3 | ..., a | a, ..., a | clone 11th value on stack | |
| 8B | DUP12 | 3 | ..., a | a, ..., a | clone 12th value on stack | |
| 8C | DUP13 | 3 | ..., a | a, ..., a | clone 13th value on stack | |
| 8D | DUP14 | 3 | ..., a | a, ..., a | clone 14th value on stack | |
| 8E | DUP15 | 3 | ..., a | a, ..., a | clone 15th value on stack | |
| 8F | DUP16 | 3 | ..., a | a, ..., a | clone 16th value on stack | |
| 90 | SWAP1 | 3 | a, b | b, a | ||
| 91 | SWAP2 | 3 | a, _, b | b, _, a | ||
| 92 | SWAP3 | 3 | a, _, _, b | b, _, _, a | ||
| 93 | SWAP4 | 3 | a, _, _, _, b | b, _, _, _, a | ||
| 94 | SWAP5 | 3 | a, ..., b | b, ..., a | ||
| 95 | SWAP6 | 3 | a, ..., b | b, ..., a | ||
| 96 | SWAP7 | 3 | a, ..., b | b, ..., a | ||
| 97 | SWAP8 | 3 | a, ..., b | b, ..., a | ||
| 98 | SWAP9 | 3 | a, ..., b | b, ..., a | ||
| 99 | SWAP10 | 3 | a, ..., b | b, ..., a | ||
| 9A | SWAP11 | 3 | a, ..., b | b, ..., a | ||
| 9B | SWAP12 | 3 | a, ..., b | b, ..., a | ||
| 9C | SWAP13 | 3 | a, ..., b | b, ..., a | ||
| 9D | SWAP14 | 3 | a, ..., b | b, ..., a | ||
| 9E | SWAP15 | 3 | a, ..., b | b, ..., a | ||
| 9F | SWAP16 | 3 | a, ..., b | b, ..., a | ||
| A0 | LOG0 | A8 | ost, len | 。 | LOG0(memory[ost:ost+len-1]) | |
| A1 | LOG1 | A8 | ost, len, topic0 | 。 | LOG1(memory[ost:ost+len-1], topic0) | |
| A2 | LOG2 | A8 | ost, len, topic0, topic1 | 。 | LOG2(memory[ost:ost+len-1], topic0, topic1) | |
| A3 | LOG3 | A8 | ost, len, topic0, topic1, topic2 | 。 | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | |
| A4 | LOG4 | A8 | ost, len, topic0, topic1, topic2, topic3 | 。 | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | |
| A5-EF | invalid | |||||
| F0 | CREATE | A9 | val, ost, len | addr | addr = keccak256(rlp([address(this), this.nonce])) | |
| F1 | CALL | AA | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F2 | CALLCODE | AA | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] = returndata | same as DELEGATECALL, but does not propagate original msg.sender and msg.value |
| F3 | RETURN | 0* | ost, len | 。 | return mem[ost:ost+len-1] | |
| F4 | DELEGATECALL | AA | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F5 | CREATE2 | A9 | val, ost, len, salt | addr | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | |
| F6-F9 | invalid | |||||
| FA | STATICCALL | AA | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| FB-FC | invalid | |||||
| FD | REVERT | 0* | ost, len | 。 | revert(mem[ost:ost+len-1]) | |
| FE | INVALID | AF | designated invalid opcode - EIP-141 | |||
| FF | SELFDESTRUCT | AB | addr | 。 | すべてのETHをaddrへ送信する。コントラクトが作成されたのと同じトランザクションで実行された場合、コントラクトは破壊されます。 |