Chuyển đến nội dung chính
Change page

Mã lệnh cho EVM

Tổng quan

Đây là phiên bản cập nhật của trang tham chiếu EVM tại wolflo/evm-opcodes (mở trong tab mới). Cũng được trích xuất từ Sách vàng (mở trong tab mới), Jello Paper (mở trong tab mới), và bản triển khai geth (mở trong tab mới). Tài liệu này nhằm mục đích trở thành một tài liệu tham khảo dễ tiếp cận, nhưng không đặc biệt nghiêm ngặt. Nếu bạn muốn chắc chắn về tính chính xác và nhận biết mọi trường hợp ngoại lệ, bạn nên sử dụng Jello Paper hoặc một bản triển khai máy khách.

Bạn đang tìm kiếm một tài liệu tham khảo tương tác? Hãy xem evm.codes (mở trong tab mới).

Đối với các hoạt động có chi phí Gas động, hãy xem gas.md (mở trong tab mới).

💡 Mẹo nhanh: Để xem toàn bộ các dòng, hãy sử dụng [shift] + cuộn để cuộn ngang trên máy tính để bàn.

Ngăn xếpTênGasNgăn xếp ban đầuNgăn xếp kết quảBộ nhớ / Lưu trữGhi chú
00STOP0dừng thực thi
01ADD3a, ba + bphép cộng (u)int256 modulo 2**256
02MUL5a, ba * bphép nhân (u)int256 modulo 2**256
03SUB3a, ba - bphép trừ (u)int256 modulo 2**256
04DIV5a, ba // bphép chia uint256
05SDIV5a, ba // bphép chia int256
06MOD5a, ba % bphép chia lấy dư uint256
07SMOD5a, ba % bphép chia lấy dư int256
08ADDMOD8a, b, N(a + b) % Nphép cộng (u)int256 modulo N
09MULMOD8a, b, N(a * b) % Nphép nhân (u)int256 modulo N
0AEXPA1 (mở trong tab mới)a, ba ** bphép lũy thừa uint256 modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)mở rộng dấu (mở trong tab mới) x từ (b+1) byte thành 32 byte
0C-0Fkhông hợp lệ
10LT3a, ba < bnhỏ hơn uint256
11GT3a, ba > blớn hơn uint256
12SLT3a, ba < bnhỏ hơn int256
13SGT3a, ba > blớn hơn int256
14EQ3a, ba == bbằng nhau (u)int256
15ISZERO3aa == 0(u)int256 bằng không
16AND3a, ba && bAND theo bit
17OR3a, ba || bOR theo bit
18XOR3a, ba ^ bXOR theo bit
19NOT3a~aNOT theo bit
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFbyte thứ i của (u)int256 x, từ trái sang
1BSHL3shift, valval << shiftdịch trái
1CSHR3shift, valval >> shiftdịch phải logic
1DSAR3shift, valval >> shiftdịch phải số học
1E-1Fkhông hợp lệ
20KECCAK256A2 (mở trong tab mới)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fkhông hợp lệ
30ADDRESS2.address(this)địa chỉ của hợp đồng đang thực thi
31BALANCEA5 (mở trong tab mới)addraddr.balancesố dư, tính bằng Wei
32ORIGIN2.tx.originđịa chỉ đã khởi tạo giao dịch
33CALLER2.msg.senderđịa chỉ của người gửi tin nhắn
34CALLVALUE2.msg.valuegiá trị tin nhắn, tính bằng Wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]đọc từ (word) từ dữ liệu tin nhắn tại chỉ số idx
36CALLDATASIZE2.len(msg.data)độ dài của dữ liệu tin nhắn, tính bằng byte
37CALLDATACOPYA3 (mở trong tab mới)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]sao chép dữ liệu tin nhắn
38CODESIZE2.len(this.code)độ dài mã của hợp đồng đang thực thi, tính bằng byte
39CODECOPYA3 (mở trong tab mới)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspricegiá gas của giao dịch, tính bằng Wei trên mỗi đơn vị Gas ** (mở trong tab mới)
3BEXTCODESIZEA5 (mở trong tab mới)addrlen(addr.code)kích thước mã tại addr, tính bằng byte
3CEXTCODECOPYA4 (mở trong tab mới)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]sao chép mã từ addr
3DRETURNDATASIZE2.sizekích thước dữ liệu trả về từ lệnh gọi bên ngoài cuối cùng, tính bằng byte
3ERETURNDATACOPYA3 (mở trong tab mới)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]sao chép dữ liệu trả về từ lệnh gọi bên ngoài cuối cùng
3FEXTCODEHASHA5 (mở trong tab mới)addrhashhash = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbaseđịa chỉ của người đề xuất khối hiện tại
42TIMESTAMP2.block.timestampdấu thời gian của khối hiện tại
43NUMBER2.block.numbersố của khối hiện tại
44PREVRANDAO2.randomness beaconbáo hiệu tính ngẫu nhiên
45GASLIMIT2.block.gaslimitgiới hạn gas của khối hiện tại
46CHAINID2.chain_idđẩy chain id (mở trong tab mới) hiện tại vào ngăn xếp
47SELFBALANCE5.address(this).balancesố dư của hợp đồng đang thực thi, tính bằng Wei
48BASEFEE2.block.basefeephí cơ sở của khối hiện tại
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (mở trong tab mới)
4ABLOBBASEFEE2.block.blobbasefeephí cơ sở khối dữ liệu của khối hiện tại (EIP-7516 (mở trong tab mới))
4B-4Fkhông hợp lệ
50POP2_anon.xóa mục khỏi đỉnh ngăn xếp và loại bỏ nó
51MLOAD3* (mở trong tab mới)ostmem[ost:ost+32]đọc từ (word) từ bộ nhớ tại độ lệch ost
52MSTORE3* (mở trong tab mới)ost, val.mem[ost:ost+32] := valghi một từ (word) vào bộ nhớ
53MSTORE83* (mở trong tab mới)ost, val.mem[ost] := val && 0xFFghi một byte duy nhất vào bộ nhớ
54SLOADA6 (mở trong tab mới)keystorage[key]đọc từ (word) từ bộ lưu trữ
55SSTOREA7 (mở trong tab mới)key, val.storage[key] := valghi từ (word) vào bộ lưu trữ
56JUMP8dst.$pc := dst đánh dấu rằng pc chỉ được gán nếu dst là một jumpdest hợp lệ
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pcbộ đếm chương trình
59MSIZE2.len(mem)kích thước bộ nhớ trong ngữ cảnh thực thi hiện tại, tính bằng byte
5AGAS2.gasRemaining
5BJUMPDEST1đánh dấu đích nhảy hợp lệmột đích nhảy hợp lệ, ví dụ như một đích nhảy không nằm trong dữ liệu push
5CTLOAD100keytstorage[key]đọc từ (word) từ bộ lưu trữ tạm thời (EIP-1153 (mở trong tab mới))
5DTSTORE100key, val.tstorage[key] := valghi từ (word) vào bộ lưu trữ tạm thời (EIP-1153 (mở trong tab mới))
5EMCOPY3+3*words+A0 (mở trong tab mới)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]sao chép bộ nhớ từ khu vực này sang khu vực khác (EIP-5656 (mở trong tab mới))
5FPUSH02.uint8đẩy giá trị hằng số 0 vào ngăn xếp
60PUSH13.uint8đẩy giá trị 1 byte vào ngăn xếp
61PUSH23.uint16đẩy giá trị 2 byte vào ngăn xếp
62PUSH33.uint24đẩy giá trị 3 byte vào ngăn xếp
63PUSH43.uint32đẩy giá trị 4 byte vào ngăn xếp
64PUSH53.uint40đẩy giá trị 5 byte vào ngăn xếp
65PUSH63.uint48đẩy giá trị 6 byte vào ngăn xếp
66PUSH73.uint56đẩy giá trị 7 byte vào ngăn xếp
67PUSH83.uint64đẩy giá trị 8 byte vào ngăn xếp
68PUSH93.uint72đẩy giá trị 9 byte vào ngăn xếp
69PUSH103.uint80đẩy giá trị 10 byte vào ngăn xếp
6APUSH113.uint88đẩy giá trị 11 byte vào ngăn xếp
6BPUSH123.uint96đẩy giá trị 12 byte vào ngăn xếp
6CPUSH133.uint104đẩy giá trị 13 byte vào ngăn xếp
6DPUSH143.uint112đẩy giá trị 14 byte vào ngăn xếp
6EPUSH153.uint120đẩy giá trị 15 byte vào ngăn xếp
6FPUSH163.uint128đẩy giá trị 16 byte vào ngăn xếp
70PUSH173.uint136đẩy giá trị 17 byte vào ngăn xếp
71PUSH183.uint144đẩy giá trị 18 byte vào ngăn xếp
72PUSH193.uint152đẩy giá trị 19 byte vào ngăn xếp
73PUSH203.uint160đẩy giá trị 20 byte vào ngăn xếp
74PUSH213.uint168đẩy giá trị 21 byte vào ngăn xếp
75PUSH223.uint176đẩy giá trị 22 byte vào ngăn xếp
76PUSH233.uint184đẩy giá trị 23 byte vào ngăn xếp
77PUSH243.uint192đẩy giá trị 24 byte vào ngăn xếp
78PUSH253.uint200đẩy giá trị 25 byte vào ngăn xếp
79PUSH263.uint208đẩy giá trị 26 byte vào ngăn xếp
7APUSH273.uint216đẩy giá trị 27 byte vào ngăn xếp
7BPUSH283.uint224đẩy giá trị 28 byte vào ngăn xếp
7CPUSH293.uint232đẩy giá trị 29 byte vào ngăn xếp
7DPUSH303.uint240đẩy giá trị 30 byte vào ngăn xếp
7EPUSH313.uint248đẩy giá trị 31 byte vào ngăn xếp
7FPUSH323.uint256đẩy giá trị 32 byte vào ngăn xếp
80DUP13aa, anhân bản giá trị thứ 1 trên ngăn xếp
81DUP23_, aa, _, anhân bản giá trị thứ 2 trên ngăn xếp
82DUP33_, _, aa, _, _, anhân bản giá trị thứ 3 trên ngăn xếp
83DUP43_, _, _, aa, _, _, _, anhân bản giá trị thứ 4 trên ngăn xếp
84DUP53..., aa, ..., anhân bản giá trị thứ 5 trên ngăn xếp
85DUP63..., aa, ..., anhân bản giá trị thứ 6 trên ngăn xếp
86DUP73..., aa, ..., anhân bản giá trị thứ 7 trên ngăn xếp
87DUP83..., aa, ..., anhân bản giá trị thứ 8 trên ngăn xếp
88DUP93..., aa, ..., anhân bản giá trị thứ 9 trên ngăn xếp
89DUP103..., aa, ..., anhân bản giá trị thứ 10 trên ngăn xếp
8ADUP113..., aa, ..., anhân bản giá trị thứ 11 trên ngăn xếp
8BDUP123..., aa, ..., anhân bản giá trị thứ 12 trên ngăn xếp
8CDUP133..., aa, ..., anhân bản giá trị thứ 13 trên ngăn xếp
8DDUP143..., aa, ..., anhân bản giá trị thứ 14 trên ngăn xếp
8EDUP153..., aa, ..., anhân bản giá trị thứ 15 trên ngăn xếp
8FDUP163..., aa, ..., anhân bản giá trị thứ 16 trên ngăn xếp
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 (mở trong tab mới)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (mở trong tab mới)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (mở trong tab mới)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (mở trong tab mới)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (mở trong tab mới)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFkhông hợp lệ
F0CREATEA9 (mở trong tab mới)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (mở trong tab mới)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (mở trong tab mới)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndatagiống như DELEGATECALL, nhưng không truyền msg.sender và msg.value ban đầu
F3RETURN0* (mở trong tab mới)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (mở trong tab mới)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (mở trong tab mới)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9không hợp lệ
FASTATICCALLAA (mở trong tab mới)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCkhông hợp lệ
FDREVERT0* (mở trong tab mới)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (mở trong tab mới)mã lệnh không hợp lệ được chỉ định - EIP-141 (mở trong tab mới)
FFSELFDESTRUCTAB (mở trong tab mới)addr.gửi tất cả ETH đến addr; nếu được thực thi trong cùng một giao dịch khi hợp đồng được tạo, nó sẽ phá hủy hợp đồng