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 khảo EVM tại wolflo/evm-opcodes (opens in a new tab). Cũng được trích xuất từ sách vàng (opens in a new tab), Jello Paper (opens in a new tab), và bản triển khai geth (opens in a new tab). 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 nó 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 được 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 (opens in a new tab).

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

💡 Mẹo nhanh: Để xem toàn bộ các dòng, hãy sử dụng [shift] + scroll để 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 (opens in a new tab)a, ba ** bphép lũy thừa uint256 modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)mở rộng dấu (opens in a new tab) x từ (b+1) byte thành 32 byte
0C-0Fkhông hợp lệ
10LT3a, ba < buint256 nhỏ hơn
11GT3a, ba > buint256 lớn hơn
12SLT3a, ba < bint256 nhỏ hơn
13SGT3a, ba > bint256 lớn hơn
14EQ3a, ba == b(u)int256 bằng nhau
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 (opens in a new tab)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 (opens in a new tab)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 msg
34CALLVALUE2.msg.valuegiá trị msg, tính bằng Wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]đọc word từ dữ liệu msg tại chỉ số idx
36CALLDATASIZE2.len(msg.data)độ dài của dữ liệu msg, tính bằng byte
37CALLDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]sao chép dữ liệu msg
38CODESIZE2.len(this.code)độ dài mã của hợp đồng đang thực thi, tính bằng byte
39CODECOPYA3 (opens in a new tab)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 cho mỗi đơn vị gas ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)kích thước mã tại địa chỉ, tính bằng byte
3CEXTCODECOPYA4 (opens in a new tab)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 (opens in a new tab)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 (opens in a new tab)addrhashmã băm = 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 beaconbeacon 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 ID chuỗi (opens in a new tab) 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 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeephí cơ sở khối dữ liệu của khối hiện tại (EIP-7516 (opens in a new tab))
4B-4Fkhông hợp lệ
50POP2_anon.xóa mục ở đầu ngăn xếp và loại bỏ nó
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]đọc word từ bộ nhớ tại offset ost
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valghi một word vào bộ nhớ
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFghi một byte đơn vào bộ nhớ
54SLOADA6 (opens in a new tab)keystorage[key]đọc word từ lưu trữ
55SSTOREA7 (opens in a new tab)key, val.storage[key] := valghi word vào 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 word từ lưu trữ tạm thời (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := valghi word vào lưu trữ tạm thời (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]sao chép bộ nhớ từ vùng này sang vùng khác (EIP-5656 (opens in a new tab))
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, asao chép giá trị thứ 1 trên ngăn xếp
81DUP23_, aa, _, asao chép giá trị thứ 2 trên ngăn xếp
82DUP33_, _, aa, _, _, asao chép giá trị thứ 3 trên ngăn xếp
83DUP43_, _, _, aa, _, _, _, asao chép giá trị thứ 4 trên ngăn xếp
84DUP53..., aa, ..., asao chép giá trị thứ 5 trên ngăn xếp
85DUP63..., aa, ..., asao chép giá trị thứ 6 trên ngăn xếp
86DUP73..., aa, ..., asao chép giá trị thứ 7 trên ngăn xếp
87DUP83..., aa, ..., asao chép giá trị thứ 8 trên ngăn xếp
88DUP93..., aa, ..., asao chép giá trị thứ 9 trên ngăn xếp
89DUP103..., aa, ..., asao chép giá trị thứ 10 trên ngăn xếp
8ADUP113..., aa, ..., asao chép giá trị thứ 11 trên ngăn xếp
8BDUP123..., aa, ..., asao chép giá trị thứ 12 trên ngăn xếp
8CDUP133..., aa, ..., asao chép giá trị thứ 13 trên ngăn xếp
8DDUP143..., aa, ..., asao chép giá trị thứ 14 trên ngăn xếp
8EDUP153..., aa, ..., asao chép giá trị thứ 15 trên ngăn xếp
8FDUP163..., aa, ..., asao chép 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 (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-EFkhông hợp lệ
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] = returndatagiống như DELEGATECALL, nhưng không truyền msg.sender và msg.value ban đầu
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-F9không hợp lệ
FASTATICCALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCkhông hợp lệ
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)mã lệnh không hợp lệ được chỉ định - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)addr.gửi toàn bộ ETH đến addr; nếu được thực thi trong cùng một giao dịch mà hợp đồng được tạo, nó sẽ phá hủy hợp đồng