跳至主要內容
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 進行水平捲動。

堆疊名稱燃料初始堆疊結果堆疊記憶體 / 儲存空間備註
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(b+1) 個位元組符號擴充 (opens in a new tab)至 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 (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 ** (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目前區塊的 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目前區塊的資料塊基礎費用 (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 標記僅當 dst 為有效的跳轉目標 (jumpdest) 時,才會指派 pc
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pc程式計數器
59MSIZE2.len(mem)目前執行環境中的記憶體大小,單位為位元組
5AGAS2.gasRemaining
5BJUMPDEST1標記有效的跳轉目標有效的跳轉目標,例如不在 push 資料內的跳轉目標
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.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.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;如果在建立合約的同一筆交易中執行,則會銷毀該合約