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

EVMのオペコード

概要

これは、wolflo/evm-opcodes (opens in a new tab) にあるEVMリファレンスページの更新版です。 また、イエロー・ペーパー (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 を使用して水平方向にスクロールしてください。

StackNameGasInitial StackResulting StackMem / StorageNotes
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, ba || bビット単位のOR
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.senderメッセージ送信者のアドレス
34CALLVALUE2.msg.valueメッセージのバリュー(Wei単位)
35CALLDATALOAD3idxmsg.data[idx:idx+32]インデックスidxのメッセージデータからワードを読み取る
36CALLDATASIZE2.len(msg.data)メッセージデータの長さ(バイト単位)
37CALLDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]メッセージデータをコピーする
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)アドレスにあるコードのサイズ(バイト単位)
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)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 (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)
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 (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, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndataDELEGATECALLと同じだが、元のmsg.senderとmsg.valueを伝播しない
F3RETURN0* (opens in a new tab)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[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, retLensuccessmem[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に送信する。コントラクトが作成されたのと同じトランザクションで実行された場合、コントラクトを破棄する