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

EVMのオペコード

最終更新: 2025年9月11日

概要

これはwolflo/evm-opcodes (opens in a new tab)にあるEVMリファレンスページの更新版です。 また、Yellow Paper (opens in a new tab)Jello Paper (opens in a new tab)、およびgeth (opens in a new tab)の実装からも引用しています。 わかりやすいリファレンスを目指していますが、とりわけ厳密なものではありません。 すべてのエッジケースを正確に把握したい場合は、Jello Paperまたはクライアント実装をご利用ください。

インタラクティブなリファレンスも用意されているので、 evm.codes (opens in a new tab)をチェックしてみてください。

動的なガス費用がかかるオペレーションについては、gas.md (opens in a new tab)を参照してください。

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

スタック名前ガス初期スタック結果スタックMem/ストレージ注記
00STOP0実行を停止
01ADD3a, ba + b(u)int256の加算 (2**256を法とする)
02MUL5a, ba * b(u)int256の乗算 (2**256を法とする)
03SUB3a, ba - b(u)int256の減算 (2**256を法とする)
04DIV5a, ba // buint256の除算
05SDIV5a, ba // bint256の除算
06MOD5a, ba % buint256の剰余
07SMOD5a, ba % bint256の剰余
08ADDMOD8a, b, N(a + b) % N(u)int256の加算 (Nを法とする)
09MULMOD8a, b, N(a * b) % N(u)int256の乗算 (Nを法とする)
0AEXPA1 (opens in a new tab)a, ba ** buint256のべき乗 (2**256を法とする)
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)(b+1)バイトから32バイトへのx符号拡張 (opens in a new tab)
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, b`a \\b`
18XOR3a, ba ^ bビット単位のXOR
19NOT3a~aビット単位のNOT
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFF(u)int256 xi番目のバイト (左から)
1BSHL3shift, valval << shift左シフト
1CSHR3shift, valval >> shift論理右シフト
1DSAR3shift, valval >> shift算術右シフト
1E-1F無効
20KECCAK256A2 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2F無効
30ADDRESS2.address(this)実行中のコントラクトのアドレス
31BALANCEA5 (opens in a new tab)addraddr.balance残高 (wei単位)
32ORIGIN2.tx.originトランザクションを開始したアドレス
33CALLER2.msg.sendermsg送信者のアドレス
34CALLVALUE2.msg.valuemsgの値 (wei単位)
35CALLDATALOAD3idxmsg.data[idx:idx+32]インデックスidxのmsgデータからワードを読み取る
36CALLDATASIZE2.len(msg.data)msgデータの長さ (バイト単位)
37CALLDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]msgデータのコピー
38CODESIZE2.len(this.code)実行中のコントラクトのコードの長さ (バイト単位)
39CODECOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]実行中のコントラクトのバイトコードをコピーする
3AGASPRICE2.tx.gaspriceトランザクションのガス価格、単位ガスあたりのwei ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)addrにあるコードのサイズ (バイト単位)
3CEXTCODECOPYA4 (opens in a new tab)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]addrからコードをコピー
3DRETURNDATASIZE2.size最後の外部呼び出しからの戻りデータのサイズ (バイト単位)
3ERETURNDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]最後の外部呼び出しからの戻りデータをコピーする
3FEXTCODEHASHA5 (opens in a new tab)addrハッシュハッシュ = 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 (opens in a new tab)をスタックにプッシュする
47SELFBALANCE5.address(this).balance実行中のコントラクトの残高 (wei単位)
48BASEFEE2.block.basefee現在のブロックのベースフィー
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefee現在のブロックのブロブベースフィー (EIP-7516 (opens in a new tab))
4B-4F無効
50POP2_anon.スタックの先頭からアイテムを削除して破棄する
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]オフセットostのメモリからワードを読み取る
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valメモリにワードを書き込む
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFメモリに1バイトを書き込む
54SLOADA6 (opens in a new tab)keystorage[key]ストレージからワードを読み取る
55SSTOREA7 (opens in a new tab)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 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := val一時ストレージにワードを書き込む (EIP-1153 (opens in a new tab))
5EMCOPY3+3*words+A0 (opens in a new tab)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]ある領域から別の領域へメモリをコピーする (EIP-5656 (opens in a new tab))
5EPUSH02.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 (opens in a new tab)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (opens in a new tab)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (opens in a new tab)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (opens in a new tab)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (opens in a new tab)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EF無効
F0CREATEA9 (opens in a new tab)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLen成功しましたmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLen成功しましたmem[retOst:retOst+retLen-1] = returndataDELEGATECALLと同じですが、元のmsg.senderとmsg.valueは伝播しません
F3RETURN0* (opens in a new tab)ost, len.mem[ost:ost+len-1]を返す
F4DELEGATECALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLen成功しましたmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (opens in a new tab)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9無効
FASTATICCALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLen成功しましたmem[retOst:retOst+retLen-1] := returndata
FB-FC無効
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)指定された無効なオペコード - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)addr.すべてのETHをaddrに送信します。コントラクトが作成されたのと同じトランザクションで実行された場合、そのコントラクトは破棄されます。

この記事は役に立ちましたか?