Opcode untuk EVM
Ikhtisar
Ini adalah versi yang diperbarui dari halaman referensi EVM di wolflo/evm-opcodes (opens in a new tab). Juga diambil dari Kertas Kuning (opens in a new tab), Jello Paper (opens in a new tab), dan implementasi geth (opens in a new tab). Ini dimaksudkan sebagai referensi yang mudah diakses, tetapi tidak terlalu ketat. Jika Anda ingin memastikan kebenarannya dan menyadari setiap kasus ekstrem, disarankan untuk menggunakan Jello Paper atau implementasi klien.
Mencari referensi interaktif? Kunjungi evm.codes (opens in a new tab).
Untuk operasi dengan biaya gas dinamis, lihat gas.md (opens in a new tab).
💡 Kiat cepat: Untuk melihat seluruh baris, gunakan [shift] + scroll untuk menggulir secara horizontal di desktop.
| Stack | Nama | Gas | Stack Awal | Stack Hasil | Mem / Penyimpanan | Catatan |
|---|---|---|---|---|---|---|
| 00 | STOP | 0 | menghentikan eksekusi | |||
| 01 | ADD | 3 | a, b | a + b | penambahan (u)int256 modulo 2**256 | |
| 02 | MUL | 5 | a, b | a * b | perkalian (u)int256 modulo 2**256 | |
| 03 | SUB | 3 | a, b | a - b | pengurangan (u)int256 modulo 2**256 | |
| 04 | DIV | 5 | a, b | a // b | pembagian uint256 | |
| 05 | SDIV | 5 | a, b | a // b | pembagian int256 | |
| 06 | MOD | 5 | a, b | a % b | modulus uint256 | |
| 07 | SMOD | 5 | a, b | a % b | modulus int256 | |
| 08 | ADDMOD | 8 | a, b, N | (a + b) % N | penambahan (u)int256 modulo N | |
| 09 | MULMOD | 8 | a, b, N | (a * b) % N | perkalian (u)int256 modulo N | |
| 0A | EXP | A1 (opens in a new tab) | a, b | a ** b | eksponensiasi uint256 modulo 2**256 | |
| 0B | SIGNEXTEND | 5 | b, x | SIGNEXTEND(x, b) | perluasan tanda (sign extend) (opens in a new tab) x dari (b+1) bita menjadi 32 bita | |
| 0C-0F | tidak valid | |||||
| 10 | LT | 3 | a, b | a < b | uint256 kurang dari | |
| 11 | GT | 3 | a, b | a > b | uint256 lebih dari | |
| 12 | SLT | 3 | a, b | a < b | int256 kurang dari | |
| 13 | SGT | 3 | a, b | a > b | int256 lebih dari | |
| 14 | EQ | 3 | a, b | a == b | kesetaraan (u)int256 | |
| 15 | ISZERO | 3 | a | a == 0 | (u)int256 iszero | |
| 16 | AND | 3 | a, b | a && b | AND bitwise | |
| 17 | OR | 3 | a, b | a || b | OR bitwise | |
| 18 | XOR | 3 | a, b | a ^ b | XOR bitwise | |
| 19 | NOT | 3 | a | ~a | NOT bitwise | |
| 1A | BYTE | 3 | i, x | (x >> (248 - i * 8)) && 0xFF | bita ke-i dari (u)int256 x, dari kiri | |
| 1B | SHL | 3 | shift, val | val << shift | geser ke kiri | |
| 1C | SHR | 3 | shift, val | val >> shift | geser logis ke kanan | |
| 1D | SAR | 3 | shift, val | val >> shift | geser aritmetika ke kanan | |
| 1E-1F | tidak valid | |||||
| 20 | KECCAK256 | A2 (opens in a new tab) | ost, len | keccak256(mem[ost:ost+len-1]) | keccak256 | |
| 21-2F | tidak valid | |||||
| 30 | ADDRESS | 2 | . | address(this) | alamat dari kontrak yang dieksekusi | |
| 31 | BALANCE | A5 (opens in a new tab) | addr | addr.balance | saldo, dalam Wei | |
| 32 | ORIGIN | 2 | . | tx.origin | alamat yang memulai tx | |
| 33 | CALLER | 2 | . | msg.sender | alamat dari pengirim pesan (msg sender) | |
| 34 | CALLVALUE | 2 | . | msg.value | nilai pesan (msg value), dalam Wei | |
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | membaca kata dari data pesan pada indeks idx | |
| 36 | CALLDATASIZE | 2 | . | len(msg.data) | panjang data pesan, dalam bita | |
| 37 | CALLDATACOPY | A3 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | menyalin data pesan |
| 38 | CODESIZE | 2 | . | len(this.code) | panjang kode kontrak yang dieksekusi, dalam bita | |
| 39 | CODECOPY | A3 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | |
| 3A | GASPRICE | 2 | . | tx.gasprice | harga gas dari tx, dalam Wei per unit gas ** (opens in a new tab) | |
| 3B | EXTCODESIZE | A5 (opens in a new tab) | addr | len(addr.code) | ukuran kode pada alamat, dalam bita | |
| 3C | EXTCODECOPY | A4 (opens in a new tab) | addr, dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | menyalin kode dari addr |
| 3D | RETURNDATASIZE | 2 | . | size | ukuran data yang dikembalikan dari panggilan eksternal terakhir, dalam bita | |
| 3E | RETURNDATACOPY | A3 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | menyalin data yang dikembalikan dari panggilan eksternal terakhir |
| 3F | EXTCODEHASH | A5 (opens in a new tab) | addr | hash | hash = addr.exists ? keccak256(addr.code) : 0 | |
| 40 | BLOCKHASH | 20 | blockNum | blockHash(blockNum) | ||
| 41 | COINBASE | 2 | . | block.coinbase | alamat dari pengusul blok saat ini | |
| 42 | TIMESTAMP | 2 | . | block.timestamp | stempel waktu dari blok saat ini | |
| 43 | NUMBER | 2 | . | block.number | nomor dari blok saat ini | |
| 44 | PREVRANDAO | 2 | . | randomness beacon | suar keacakan | |
| 45 | GASLIMIT | 2 | . | block.gaslimit | batas gas dari blok saat ini | |
| 46 | CHAINID | 2 | . | chain_id | mendorong id rantai (opens in a new tab) saat ini ke dalam stack | |
| 47 | SELFBALANCE | 5 | . | address(this).balance | saldo dari kontrak yang dieksekusi, dalam Wei | |
| 48 | BASEFEE | 2 | . | block.basefee | biaya dasar dari blok saat ini | |
| 49 | BLOBHASH | 3 | idx | tx.blob_versioned_hashes[idx] | EIP-4844 (opens in a new tab) | |
| 4A | BLOBBASEFEE | 2 | . | block.blobbasefee | biaya dasar blob dari blok saat ini (EIP-7516 (opens in a new tab)) | |
| 4B-4F | tidak valid | |||||
| 50 | POP | 2 | _anon | . | menghapus item dari atas stack dan membuangnya | |
| 51 | MLOAD | 3* (opens in a new tab) | ost | mem[ost:ost+32] | membaca kata dari memori pada offset ost | |
| 52 | MSTORE | 3* (opens in a new tab) | ost, val | . | mem[ost:ost+32] := val | menulis sebuah kata ke memori |
| 53 | MSTORE8 | 3* (opens in a new tab) | ost, val | . | mem[ost] := val && 0xFF | menulis satu bita ke memori |
| 54 | SLOAD | A6 (opens in a new tab) | key | storage[key] | membaca kata dari penyimpanan | |
| 55 | SSTORE | A7 (opens in a new tab) | key, val | . | storage[key] := val | menulis kata ke penyimpanan |
| 56 | JUMP | 8 | dst | . | $pc := dst menandakan bahwa pc hanya ditetapkan jika dst adalah jumpdest yang valid | |
| 57 | JUMPI | 10 | dst, condition | . | $pc := condition ? dst : $pc + 1 | |
| 58 | PC | 2 | . | $pc | penghitung program (program counter) | |
| 59 | MSIZE | 2 | . | len(mem) | ukuran memori dalam konteks eksekusi saat ini, dalam bita | |
| 5A | GAS | 2 | . | gasRemaining | ||
| 5B | JUMPDEST | 1 | menandai tujuan lompatan (jump) yang valid | tujuan lompatan yang valid, misalnya tujuan lompatan yang tidak berada di dalam data push | ||
| 5C | TLOAD | 100 | key | tstorage[key] | membaca kata dari penyimpanan sementara (transient storage) (EIP-1153 (opens in a new tab)) | |
| 5D | TSTORE | 100 | key, val | . | tstorage[key] := val | menulis kata ke penyimpanan sementara (EIP-1153 (opens in a new tab)) |
| 5E | MCOPY | 3+3*words+A0 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst] := mem[ost:ost+len] | menyalin memori dari satu area ke area lain (EIP-5656 (opens in a new tab)) |
| 5F | PUSH0 | 2 | . | uint8 | mendorong nilai konstan 0 ke dalam stack | |
| 60 | PUSH1 | 3 | . | uint8 | mendorong nilai 1-bita ke dalam stack | |
| 61 | PUSH2 | 3 | . | uint16 | mendorong nilai 2-bita ke dalam stack | |
| 62 | PUSH3 | 3 | . | uint24 | mendorong nilai 3-bita ke dalam stack | |
| 63 | PUSH4 | 3 | . | uint32 | mendorong nilai 4-bita ke dalam stack | |
| 64 | PUSH5 | 3 | . | uint40 | mendorong nilai 5-bita ke dalam stack | |
| 65 | PUSH6 | 3 | . | uint48 | mendorong nilai 6-bita ke dalam stack | |
| 66 | PUSH7 | 3 | . | uint56 | mendorong nilai 7-bita ke dalam stack | |
| 67 | PUSH8 | 3 | . | uint64 | mendorong nilai 8-bita ke dalam stack | |
| 68 | PUSH9 | 3 | . | uint72 | mendorong nilai 9-bita ke dalam stack | |
| 69 | PUSH10 | 3 | . | uint80 | mendorong nilai 10-bita ke dalam stack | |
| 6A | PUSH11 | 3 | . | uint88 | mendorong nilai 11-bita ke dalam stack | |
| 6B | PUSH12 | 3 | . | uint96 | mendorong nilai 12-bita ke dalam stack | |
| 6C | PUSH13 | 3 | . | uint104 | mendorong nilai 13-bita ke dalam stack | |
| 6D | PUSH14 | 3 | . | uint112 | mendorong nilai 14-bita ke dalam stack | |
| 6E | PUSH15 | 3 | . | uint120 | mendorong nilai 15-bita ke dalam stack | |
| 6F | PUSH16 | 3 | . | uint128 | mendorong nilai 16-bita ke dalam stack | |
| 70 | PUSH17 | 3 | . | uint136 | mendorong nilai 17-bita ke dalam stack | |
| 71 | PUSH18 | 3 | . | uint144 | mendorong nilai 18-bita ke dalam stack | |
| 72 | PUSH19 | 3 | . | uint152 | mendorong nilai 19-bita ke dalam stack | |
| 73 | PUSH20 | 3 | . | uint160 | mendorong nilai 20-bita ke dalam stack | |
| 74 | PUSH21 | 3 | . | uint168 | mendorong nilai 21-bita ke dalam stack | |
| 75 | PUSH22 | 3 | . | uint176 | mendorong nilai 22-bita ke dalam stack | |
| 76 | PUSH23 | 3 | . | uint184 | mendorong nilai 23-bita ke dalam stack | |
| 77 | PUSH24 | 3 | . | uint192 | mendorong nilai 24-bita ke dalam stack | |
| 78 | PUSH25 | 3 | . | uint200 | mendorong nilai 25-bita ke dalam stack | |
| 79 | PUSH26 | 3 | . | uint208 | mendorong nilai 26-bita ke dalam stack | |
| 7A | PUSH27 | 3 | . | uint216 | mendorong nilai 27-bita ke dalam stack | |
| 7B | PUSH28 | 3 | . | uint224 | mendorong nilai 28-bita ke dalam stack | |
| 7C | PUSH29 | 3 | . | uint232 | mendorong nilai 29-bita ke dalam stack | |
| 7D | PUSH30 | 3 | . | uint240 | mendorong nilai 30-bita ke dalam stack | |
| 7E | PUSH31 | 3 | . | uint248 | mendorong nilai 31-bita ke dalam stack | |
| 7F | PUSH32 | 3 | . | uint256 | mendorong nilai 32-bita ke dalam stack | |
| 80 | DUP1 | 3 | a | a, a | menggandakan nilai ke-1 pada stack | |
| 81 | DUP2 | 3 | _, a | a, _, a | menggandakan nilai ke-2 pada stack | |
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | menggandakan nilai ke-3 pada stack | |
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | menggandakan nilai ke-4 pada stack | |
| 84 | DUP5 | 3 | ..., a | a, ..., a | menggandakan nilai ke-5 pada stack | |
| 85 | DUP6 | 3 | ..., a | a, ..., a | menggandakan nilai ke-6 pada stack | |
| 86 | DUP7 | 3 | ..., a | a, ..., a | menggandakan nilai ke-7 pada stack | |
| 87 | DUP8 | 3 | ..., a | a, ..., a | menggandakan nilai ke-8 pada stack | |
| 88 | DUP9 | 3 | ..., a | a, ..., a | menggandakan nilai ke-9 pada stack | |
| 89 | DUP10 | 3 | ..., a | a, ..., a | menggandakan nilai ke-10 pada stack | |
| 8A | DUP11 | 3 | ..., a | a, ..., a | menggandakan nilai ke-11 pada stack | |
| 8B | DUP12 | 3 | ..., a | a, ..., a | menggandakan nilai ke-12 pada stack | |
| 8C | DUP13 | 3 | ..., a | a, ..., a | menggandakan nilai ke-13 pada stack | |
| 8D | DUP14 | 3 | ..., a | a, ..., a | menggandakan nilai ke-14 pada stack | |
| 8E | DUP15 | 3 | ..., a | a, ..., a | menggandakan nilai ke-15 pada stack | |
| 8F | DUP16 | 3 | ..., a | a, ..., a | menggandakan nilai ke-16 pada stack | |
| 90 | SWAP1 | 3 | a, b | b, a | ||
| 91 | SWAP2 | 3 | a, _, b | b, _, a | ||
| 92 | SWAP3 | 3 | a, _, _, b | b, _, _, a | ||
| 93 | SWAP4 | 3 | a, _, _, _, b | b, _, _, _, a | ||
| 94 | SWAP5 | 3 | a, ..., b | b, ..., a | ||
| 95 | SWAP6 | 3 | a, ..., b | b, ..., a | ||
| 96 | SWAP7 | 3 | a, ..., b | b, ..., a | ||
| 97 | SWAP8 | 3 | a, ..., b | b, ..., a | ||
| 98 | SWAP9 | 3 | a, ..., b | b, ..., a | ||
| 99 | SWAP10 | 3 | a, ..., b | b, ..., a | ||
| 9A | SWAP11 | 3 | a, ..., b | b, ..., a | ||
| 9B | SWAP12 | 3 | a, ..., b | b, ..., a | ||
| 9C | SWAP13 | 3 | a, ..., b | b, ..., a | ||
| 9D | SWAP14 | 3 | a, ..., b | b, ..., a | ||
| 9E | SWAP15 | 3 | a, ..., b | b, ..., a | ||
| 9F | SWAP16 | 3 | a, ..., b | b, ..., a | ||
| A0 | LOG0 | A8 (opens in a new tab) | ost, len | . | LOG0(memory[ost:ost+len-1]) | |
| A1 | LOG1 | A8 (opens in a new tab) | ost, len, topic0 | . | LOG1(memory[ost:ost+len-1], topic0) | |
| A2 | LOG2 | A8 (opens in a new tab) | ost, len, topic0, topic1 | . | LOG2(memory[ost:ost+len-1], topic0, topic1) | |
| A3 | LOG3 | A8 (opens in a new tab) | ost, len, topic0, topic1, topic2 | . | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | |
| A4 | LOG4 | A8 (opens in a new tab) | ost, len, topic0, topic1, topic2, topic3 | . | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | |
| A5-EF | tidak valid | |||||
| F0 | CREATE | A9 (opens in a new tab) | val, ost, len | addr | addr = keccak256(rlp([address(this), this.nonce])) | |
| F1 | CALL | AA (opens in a new tab) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F2 | CALLCODE | AA (opens in a new tab) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] = returndata | sama seperti DELEGATECALL, tetapi tidak meneruskan msg.sender dan msg.value asli |
| F3 | RETURN | 0* (opens in a new tab) | ost, len | . | return mem[ost:ost+len-1] | |
| F4 | DELEGATECALL | AA (opens in a new tab) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F5 | CREATE2 | A9 (opens in a new tab) | val, ost, len, salt | addr | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | |
| F6-F9 | tidak valid | |||||
| FA | STATICCALL | AA (opens in a new tab) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| FB-FC | tidak valid | |||||
| FD | REVERT | 0* (opens in a new tab) | ost, len | . | revert(mem[ost:ost+len-1]) | |
| FE | INVALID | AF (opens in a new tab) | opcode tidak valid yang ditetapkan - EIP-141 (opens in a new tab) | |||
| FF | SELFDESTRUCT | AB (opens in a new tab) | addr | . | mengirimkan semua ETH ke addr; jika dieksekusi dalam transaksi yang sama saat kontrak dibuat, ini akan menghancurkan kontrak tersebut |