跳至主要内容
Change page

以太坊虛擬機的作業碼

頁面最後更新時間: 2025年9月11日

概覽

這是 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 成本的操作,請參閱 gas.md (opens in a new tab)

💡 快速提示:若要檢視完整一行,請使用 [shift] + scroll 在桌上型電腦上水平捲動。

堆疊名稱燃料初始堆疊最終堆疊記憶體/儲存空間注釋
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)x 進行符號擴充 (opens in a new tab),從 (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, b`a \\b`
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 (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交易的 gas 價格,以 wei/單位 gas 計 ** (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)addr雜湊值hash = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbase目前區塊提交者的地址
42TIMESTAMP2.block.timestamp目前區塊的時間戳
43NUMBER2.block.number目前區塊的編號
44PREVRANDAO2.randomness beacon隨機信標
45GASLIMIT2.block.gaslimit目前區塊的 gas 上限
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目前區塊的 Blob 基本費用 (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將單一位元組寫入記憶體
54SLOADA6 (opens in a new tab)keystorage[key]從儲存體讀取字
55SSTOREA7 (opens in a new tab)key, val.storage[key] := val將字寫入儲存體
56JUMP8dst.$pc := dst 標示 pc 僅在 dst 為有效跳轉目的地時才會被指派
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.uint8將 1 位元組值推入堆疊
61PUSH23.uint16將 2 位元組值推入堆疊
62PUSH33.uint24將 3 位元組值推入堆疊
63PUSH43.uint32將 4 位元組值推入堆疊
64PUSH53.uint40將 5 位元組值推入堆疊
65PUSH63.uint48將 6 位元組值推入堆疊
66PUSH73.uint56將 7 位元組值推入堆疊
67PUSH83.uint64將 8 位元組值推入堆疊
68PUSH93.uint72將 9 位元組值推入堆疊
69PUSH103.uint80將 10 位元組值推入堆疊
6APUSH113.uint88將 11 位元組值推入堆疊
6BPUSH123.uint96將 12 位元組值推入堆疊
6CPUSH133.uint104將 13 位元組值推入堆疊
6DPUSH143.uint112將 14 位元組值推入堆疊
6EPUSH153.uint120將 15 位元組值推入堆疊
6FPUSH163.uint128將 16 位元組值推入堆疊
70PUSH173.uint136將 17 位元組值推入堆疊
71PUSH183.uint144將 18 位元組值推入堆疊
72PUSH193.uint152將 19 位元組值推入堆疊
73PUSH203.uint160將 20 位元組值推入堆疊
74PUSH213.uint168將 21 位元組值推入堆疊
75PUSH223.uint176將 22 位元組值推入堆疊
76PUSH233.uint184將 23 位元組值推入堆疊
77PUSH243.uint192將 24 位元組值推入堆疊
78PUSH253.uint200將 25 位元組值推入堆疊
79PUSH263.uint208將 26 位元組值推入堆疊
7APUSH273.uint216將 27 位元組值推入堆疊
7BPUSH283.uint224將 28 位元組值推入堆疊
7CPUSH293.uint232將 29 位元組值推入堆疊
7DPUSH303.uint240將 30 位元組值推入堆疊
7EPUSH313.uint248將 31 位元組值推入堆疊
7FPUSH323.uint256將 32 位元組值推入堆疊
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] = returndata與 DELEGATECALL 相同,但不傳播原始的 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, 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.還原 (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;如果在建立合約的同筆交易中執行,就會銷毀該合約

這篇文章對你有幫助嗎?