メインコンテンツへスキップ
Change page

EVMのオペコード

概要

これは、wolflo/evm-opcodes (新しいタブで開く) にあるEVMリファレンスページの更新版です。 また、イエロー・ペーパー (新しいタブで開く)Jello Paper (新しいタブで開く)、および geth(ゲス) (新しいタブで開く) の実装からも引用しています。 これはわかりやすいリファレンスであることを目的としていますが、特に厳密なものではありません。 正確性を確実なものにし、すべてのエッジケースを把握したい場合は、Jello Paperまたはクライアント実装を使用することをお勧めします。

インタラクティブなリファレンスをお探しですか? evm.codes (新しいタブで開く) をチェックしてください。

動的なガス・コストを伴うオペレーションについては、gas.md (新しいタブで開く) を参照してください。

💡 ヒント: デスクトップで全行を表示するには、[shift] + スクロール を使用して水平方向にスクロールしてください。

スタック名前ガス初期スタック結果スタックメモリ / ストレージ備考
00STOP0実行を停止
01ADD3a, ba + b2**256を法とする(u)int256の加算
02MUL5a, ba * b2**256を法とする(u)int256の乗算
03SUB3a, ba - b2**256を法とする(u)int256の減算
04DIV5a, ba // buint256の除算
05SDIV5a, ba // bint256の除算
06MOD5a, ba % buint256の剰余
07SMOD5a, ba % bint256の剰余
08ADDMOD8a, b, N(a + b) % NNを法とする(u)int256の加算
09MULMOD8a, b, N(a * b) % NNを法とする(u)int256の乗算
0AEXPA1 (新しいタブで開く)a, ba ** b2**256を法とするuint256のべき乗
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)x(b+1) バイトから32バイトに符号拡張 (新しいタブで開く)
0C-0F無効
10LT3a, ba < buint256の「より小さい(<)」
11GT3a, ba > buint256の「より大きい(>)」
12SLT3a, ba < bint256の「より小さい(<)」
13SGT3a, ba > bint256の「より大きい(>)」
14EQ3a, ba == b(u)int256の等価性
15ISZERO3aa == 0(u)int256がゼロかどうか
16AND3a, ba && bビット単位のAND
17OR3a, ba || bビット単位のOR
18XOR3a, ba ^ bビット単位のXOR
19NOT3a~aビット単位のNOT
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFF(u)int256 x の左から i 番目のバイト
1BSHL3shift, valval << shift左シフト
1CSHR3shift, valval >> shift論理右シフト
1DSAR3shift, valval >> shift算術右シフト
1E-1F無効
20KECCAK256A2 (新しいタブで開く)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2F無効
30ADDRESS2.address(this)実行中のコントラクトのアドレス
31BALANCEA5 (新しいタブで開く)addraddr.balance残高(Wei単位)
32ORIGIN2.tx.originトランザクションの送信元アドレス
33CALLER2.msg.senderメッセージ送信者のアドレス
34CALLVALUE2.msg.valueメッセージのバリュー(Wei単位)
35CALLDATALOAD3idxmsg.data[idx:idx+32]メッセージデータのインデックス idx からワードを読み取る
36CALLDATASIZE2.len(msg.data)メッセージデータの長さ(バイト単位)
37CALLDATACOPYA3 (新しいタブで開く)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]メッセージデータをコピー
38CODESIZE2.len(this.code)実行中のコントラクトのコード長(バイト単位)
39CODECOPYA3 (新しいタブで開く)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspriceトランザクションのガス価格(ガス単位あたりのWei) ** (新しいタブで開く)
3BEXTCODESIZEA5 (新しいタブで開く)addrlen(addr.code)addrにあるコードのサイズ(バイト単位)
3CEXTCODECOPYA4 (新しいタブで開く)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]addr からコードをコピー
3DRETURNDATASIZE2.size最後の外部呼び出しから返されたデータのサイズ(バイト単位)
3ERETURNDATACOPYA3 (新しいタブで開く)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]最後の外部呼び出しから返されたデータをコピー
3FEXTCODEHASHA5 (新しいタブで開く)addrhashhash = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbase現在のブロックのプロポーザーのアドレス
42TIMESTAMP2.block.timestamp現在のブロックのタイムスタンプ
43NUMBER2.block.number現在のブロックの番号
44PREVRANDAO2.randomness beaconランダム性ビーコン
45GASLIMIT2.block.gaslimit現在のブロックのガス・リミット
46CHAINID2.chain_id現在のチェーンID (新しいタブで開く)をスタックにプッシュ
47SELFBALANCE5.address(this).balance実行中のコントラクトの残高(Wei単位)
48BASEFEE2.block.basefee現在のブロックの基本料金
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (新しいタブで開く)
4ABLOBBASEFEE2.block.blobbasefee現在のブロックのブロブ基本料金(EIP-7516 (新しいタブで開く)
4B-4F無効
50POP2_anon.スタックの一番上からアイテムを取り除き、破棄する
51MLOAD3* (新しいタブで開く)ostmem[ost:ost+32]オフセット ost のメモリからワードを読み取る
52MSTORE3* (新しいタブで開く)ost, val.mem[ost:ost+32] := valメモリにワードを書き込む
53MSTORE83* (新しいタブで開く)ost, val.mem[ost] := val && 0xFFメモリに1バイトを書き込む
54SLOADA6 (新しいタブで開く)keystorage[key]ストレージからワードを読み取る
55SSTOREA7 (新しいタブで開く)key, val.storage[key] := valストレージにワードを書き込む
56JUMP8dst.$pc := dst dst が有効なjumpdestである場合のみ pc が割り当てられることをマークする
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pcプログラムカウンタ
59MSIZE2.len(mem)現在の実行コンテキストにおけるメモリのサイズ(バイト単位)
5AGAS2.gasRemaining
5BJUMPDEST1有効なジャンプ先をマークするプッシュデータ内にないジャンプ先など、有効なジャンプ先
5CTLOAD100keytstorage[key]一時ストレージからワードを読み取る(EIP-1153 (新しいタブで開く)
5DTSTORE100key, val.tstorage[key] := val一時ストレージにワードを書き込む(EIP-1153 (新しいタブで開く)
5EMCOPY3+3*words+A0 (新しいタブで開く)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]ある領域から別の領域へメモリをコピーする(EIP-5656 (新しいタブで開く)
5FPUSH02.uint8定数値0をスタックにプッシュ
60PUSH13.uint81バイトの値をスタックにプッシュ
61PUSH23.uint162バイトの値をスタックにプッシュ
62PUSH33.uint243バイトの値をスタックにプッシュ
63PUSH43.uint324バイトの値をスタックにプッシュ
64PUSH53.uint405バイトの値をスタックにプッシュ
65PUSH63.uint486バイトの値をスタックにプッシュ
66PUSH73.uint567バイトの値をスタックにプッシュ
67PUSH83.uint648バイトの値をスタックにプッシュ
68PUSH93.uint729バイトの値をスタックにプッシュ
69PUSH103.uint8010バイトの値をスタックにプッシュ
6APUSH113.uint8811バイトの値をスタックにプッシュ
6BPUSH123.uint9612バイトの値をスタックにプッシュ
6CPUSH133.uint10413バイトの値をスタックにプッシュ
6DPUSH143.uint11214バイトの値をスタックにプッシュ
6EPUSH153.uint12015バイトの値をスタックにプッシュ
6FPUSH163.uint12816バイトの値をスタックにプッシュ
70PUSH173.uint13617バイトの値をスタックにプッシュ
71PUSH183.uint14418バイトの値をスタックにプッシュ
72PUSH193.uint15219バイトの値をスタックにプッシュ
73PUSH203.uint16020バイトの値をスタックにプッシュ
74PUSH213.uint16821バイトの値をスタックにプッシュ
75PUSH223.uint17622バイトの値をスタックにプッシュ
76PUSH233.uint18423バイトの値をスタックにプッシュ
77PUSH243.uint19224バイトの値をスタックにプッシュ
78PUSH253.uint20025バイトの値をスタックにプッシュ
79PUSH263.uint20826バイトの値をスタックにプッシュ
7APUSH273.uint21627バイトの値をスタックにプッシュ
7BPUSH283.uint22428バイトの値をスタックにプッシュ
7CPUSH293.uint23229バイトの値をスタックにプッシュ
7DPUSH303.uint24030バイトの値をスタックにプッシュ
7EPUSH313.uint24831バイトの値をスタックにプッシュ
7FPUSH323.uint25632バイトの値をスタックにプッシュ
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
A0LOG0A8 (新しいタブで開く)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (新しいタブで開く)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (新しいタブで開く)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (新しいタブで開く)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (新しいタブで開く)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EF無効
F0CREATEA9 (新しいタブで開く)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (新しいタブで開く)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (新しいタブで開く)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndataDELEGATECALLと同じだが、元のmsg.senderとmsg.valueを伝播しない
F3RETURN0* (新しいタブで開く)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (新しいタブで開く)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (新しいタブで開く)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9無効
FASTATICCALLAA (新しいタブで開く)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FC無効
FDREVERT0* (新しいタブで開く)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (新しいタブで開く)指定された無効なオペコード - EIP-141 (新しいタブで開く)
FFSELFDESTRUCTAB (新しいタブで開く)addr.すべてのETHを addr に送信する。コントラクトが作成されたのと同じトランザクションで実行された場合、コントラクトを破棄する