跳至主要内容
Change page

以太坊虛擬機的作業碼

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

概覽

這是 wolflo/evm-opcodesopens in a new tab 上 EVM 參考頁面的更新版本。 內容也參考自 黃皮書opens in a new tabJello Paperopens in a new tabgethopens in a new tab 的實作。 本文意圖成為方便參考的頁面,但並非特別嚴謹。 若你想確定正確性並了解每種邊界案例(指僅在極端工作參數下才會發生的問題或情況),建議使用 Jello Paper 或用戶端實作。

正在尋找互動式參考資料? 請查看 evm.codesopens in a new tab

關於動態 gas 成本的操作,請參閱 gas.mdopens 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
0AEXPA1opens in a new taba, 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無效
20KECCAK256A2opens in a new tabost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2F無效
30ADDRESS2.address(this)執行合約的地址
31BALANCEA5opens in a new tabaddraddr.balance餘額,以 wei 計
32ORIGIN2.tx.origin發起交易的地址
33CALLER2.msg.sender訊息發送者的地址
34CALLVALUE2.msg.value訊息數值,以 wei 計
35CALLDATALOAD3idxmsg.data[idx:idx+32]從索引 idx 讀取訊息資料中的字
36CALLDATASIZE2.len(msg.data)訊息資料的長度,以位元組計
37CALLDATACOPYA3opens in a new tabdstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]複製訊息資料
38CODESIZE2.len(this.code)執行合約的程式碼長度,以位元組計
39CODECOPYA3opens in a new tabdstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]複製執行合約的位元組碼
3AGASPRICE2.tx.gasprice交易的 gas 價格,以 wei/單位 gas 計 **opens in a new tab
3BEXTCODESIZEA5opens in a new tabaddrlen(addr.code)地址處程式碼的大小,以位元組計
3CEXTCODECOPYA4opens in a new tabaddr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]addr 複製程式碼
3DRETURNDATASIZE2.size上次外部呼叫所回傳資料的大小,以位元組計
3ERETURNDATACOPYA3opens in a new tabdstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]複製上次外部呼叫所回傳的資料
3FEXTCODEHASHA5opens in a new tabaddr雜湊值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將目前鏈 IDopens in a new tab 推入堆疊
47SELFBALANCE5.address(this).balance執行中合約的餘額,以 wei 計
48BASEFEE2.block.basefee目前區塊的基本費用
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844opens in a new tab
4ABLOBBASEFEE2.block.blobbasefee目前區塊的 Blob 基本費用 (EIP-7516opens in a new tab)
4B-4F無效
50POP2_anon.從堆疊頂端移除項目並捨棄
51MLOAD3*opens in a new tabostmem[ost:ost+32]從偏移量 ost 的記憶體讀取字
52MSTORE3*opens in a new tabost, val.mem[ost:ost+32] := val將一個字寫入記憶體
53MSTORE83*opens in a new tabost, val.mem[ost] := val && 0xFF將單一位元組寫入記憶體
54SLOADA6opens in a new tabkeystorage[key]從儲存體讀取字
55SSTOREA7opens in a new tabkey, 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-1153opens in a new tab)
5DTSTORE100key, val.tstorage[key] := val將字寫入暫時性儲存體 (EIP-1153opens in a new tab)
5EMCOPY3+3*words+A0opens in a new tabdstOst, ost, len.mem[dstOst] := mem[ost:ost+len]將記憶體從一個區域複製到另一個區域 (EIP-5656opens 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
A0LOG0A8opens in a new tabost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8opens in a new tabost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8opens in a new tabost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8opens in a new tabost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8opens in a new tabost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EF無效
F0CREATEA9opens in a new tabval, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAAopens in a new tabgas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAAopens in a new tabgas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndata與 DELEGATECALL 相同,但不傳播原始的 msg.sender 和 msg.value
F3RETURN0*opens in a new tabost, len.回傳 mem[ost:ost+len-1]
F4DELEGATECALLAAopens in a new tabgas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9opens in a new tabval, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9無效
FASTATICCALLAAopens in a new tabgas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FC無效
FDREVERT0*opens in a new tabost, len.還原 (mem[ost:ost+len-1])
FEINVALIDAFopens in a new tab指定的無效操作碼 - EIP-141opens in a new tab
FFSELFDESTRUCTABopens in a new tabaddr.將所有 ETH 傳送到 addr;如果在建立合約的同筆交易中執行,就會銷毀該合約

這篇文章對你有幫助嗎?