Opcode untuk EVM
Pembaruan terakhir halaman: 11 September 2025
Ringkasan
Ini adalah versi yang diperbarui dari halaman referensi EVM di wolflo/evm-opcodes (opens in a new tab). Juga diambil dari Yellow Paper (opens in a new tab), Jello Paper (opens in a new tab), dan implementasi geth (opens in a new tab). Ini dimaksudkan untuk menjadi referensi yang mudah diakses, tetapi tidak terlalu ketat. Jika Anda ingin memastikan kebenaran 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 (opens in a new tab) x dari (b+1) byte menjadi 32 byte | |
| 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 | byte 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 kanan logis | |
| 1D | SAR | 3 | shift, val | val >> shift | geser kanan aritmatika | |
| 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 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 transaksi | |
| 33 | CALLER | 2 | . | msg.sender | alamat pengirim pesan | |
| 34 | CALLVALUE | 2 | . | msg.value | nilai pesan, dalam wei | |
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | membaca word dari data pesan pada indeks idx | |
| 36 | CALLDATASIZE | 2 | . | len(msg.data) | panjang data pesan, dalam byte | |
| 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 byte | |
| 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 transaksi, 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 addr, dalam byte | |
| 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 byte | |
| 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 pengusul blok saat ini | |
| 42 | TIMESTAMP | 2 | . | block.timestamp | stempel waktu dari blok saat ini | |
| 43 | NUMBER | 2 | . | block.number | nomor blok saat ini | |
| 44 | PREVRANDAO | 2 | . | randomness beacon | beacon 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 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 word dari memori pada offset ost | |
| 52 | MSTORE | 3* (opens in a new tab) | ost, val | . | mem[ost:ost+32] := val | menulis word ke memori |
| 53 | MSTORE8 | 3* (opens in a new tab) | ost, val | . | mem[ost] := val && 0xFF | menulis satu byte ke memori |
| 54 | SLOAD | A6 (opens in a new tab) | key | storage[key] | membaca word dari penyimpanan | |
| 55 | SSTORE | A7 (opens in a new tab) | key, val | . | storage[key] := val | menulis word ke penyimpanan |
| 56 | JUMP | 8 | dst | . | $pc := dst menandai 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 | |
| 59 | MSIZE | 2 | . | len(mem) | ukuran memori dalam konteks eksekusi saat ini, dalam byte | |
| 5A | GAS | 2 | . | gasRemaining | ||
| 5B | JUMPDEST | 1 | menandai tujuan lompatan yang valid | tujuan lompatan yang valid misalnya tujuan lompatan yang tidak berada di dalam data push | ||
| 5C | TLOAD | 100 | key | tstorage[key] | membaca word dari penyimpanan sementara (EIP-1153 (opens in a new tab)) | |
| 5D | TSTORE | 100 | key, val | . | tstorage[key] := val | menulis word 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-byte ke dalam stack | |
| 61 | PUSH2 | 3 | . | uint16 | mendorong nilai 2-byte ke dalam stack | |
| 62 | PUSH3 | 3 | . | uint24 | mendorong nilai 3-byte ke dalam stack | |
| 63 | PUSH4 | 3 | . | uint32 | mendorong nilai 4-byte ke dalam stack | |
| 64 | PUSH5 | 3 | . | uint40 | mendorong nilai 5-byte ke dalam stack | |
| 65 | PUSH6 | 3 | . | uint48 | mendorong nilai 6-byte ke dalam stack | |
| 66 | PUSH7 | 3 | . | uint56 | mendorong nilai 7-byte ke dalam stack | |
| 67 | PUSH8 | 3 | . | uint64 | mendorong nilai 8-byte ke dalam stack | |
| 68 | PUSH9 | 3 | . | uint72 | mendorong nilai 9-byte ke dalam stack | |
| 69 | PUSH10 | 3 | . | uint80 | mendorong nilai 10-byte ke dalam stack | |
| 6A | PUSH11 | 3 | . | uint88 | mendorong nilai 11-byte ke dalam stack | |
| 6B | PUSH12 | 3 | . | uint96 | mendorong nilai 12-byte ke dalam stack | |
| 6C | PUSH13 | 3 | . | uint104 | mendorong nilai 13-byte ke dalam stack | |
| 6D | PUSH14 | 3 | . | uint112 | mendorong nilai 14-byte ke dalam stack | |
| 6E | PUSH15 | 3 | . | uint120 | mendorong nilai 15-byte ke dalam stack | |
| 6F | PUSH16 | 3 | . | uint128 | mendorong nilai 16-byte ke dalam stack | |
| 70 | PUSH17 | 3 | . | uint136 | mendorong nilai 17-byte ke dalam stack | |
| 71 | PUSH18 | 3 | . | uint144 | mendorong nilai 18-byte ke dalam stack | |
| 72 | PUSH19 | 3 | . | uint152 | mendorong nilai 19-byte ke dalam stack | |
| 73 | PUSH20 | 3 | . | uint160 | mendorong nilai 20-byte ke dalam stack | |
| 74 | PUSH21 | 3 | . | uint168 | mendorong nilai 21-byte ke dalam stack | |
| 75 | PUSH22 | 3 | . | uint176 | mendorong nilai 22-byte ke dalam stack | |
| 76 | PUSH23 | 3 | . | uint184 | mendorong nilai 23-byte ke dalam stack | |
| 77 | PUSH24 | 3 | . | uint192 | mendorong nilai 24-byte ke dalam stack | |
| 78 | PUSH25 | 3 | . | uint200 | mendorong nilai 25-byte ke dalam stack | |
| 79 | PUSH26 | 3 | . | uint208 | mendorong nilai 26-byte ke dalam stack | |
| 7A | PUSH27 | 3 | . | uint216 | mendorong nilai 27-byte ke dalam stack | |
| 7B | PUSH28 | 3 | . | uint224 | mendorong nilai 28-byte ke dalam stack | |
| 7C | PUSH29 | 3 | . | uint232 | mendorong nilai 29-byte ke dalam stack | |
| 7D | PUSH30 | 3 | . | uint240 | mendorong nilai 30-byte ke dalam stack | |
| 7E | PUSH31 | 3 | . | uint248 | mendorong nilai 31-byte ke dalam stack | |
| 7F | PUSH32 | 3 | . | uint256 | mendorong nilai 32-byte ke dalam stack | |
| 80 | DUP1 | 3 | a | a, a | mengkloning nilai ke-1 di stack | |
| 81 | DUP2 | 3 | _, a | a, _, a | mengkloning nilai ke-2 di stack | |
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | mengkloning nilai ke-3 di stack | |
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | mengkloning nilai ke-4 di stack | |
| 84 | DUP5 | 3 | ..., a | a, ..., a | mengkloning nilai ke-5 di stack | |
| 85 | DUP6 | 3 | ..., a | a, ..., a | mengkloning nilai ke-6 di stack | |
| 86 | DUP7 | 3 | ..., a | a, ..., a | mengkloning nilai ke-7 di stack | |
| 87 | DUP8 | 3 | ..., a | a, ..., a | mengkloning nilai ke-8 di stack | |
| 88 | DUP9 | 3 | ..., a | a, ..., a | mengkloning nilai ke-9 di stack | |
| 89 | DUP10 | 3 | ..., a | a, ..., a | mengkloning nilai ke-10 di stack | |
| 8A | DUP11 | 3 | ..., a | a, ..., a | mengkloning nilai ke-11 di stack | |
| 8B | DUP12 | 3 | ..., a | a, ..., a | mengkloning nilai ke-12 di stack | |
| 8C | DUP13 | 3 | ..., a | a, ..., a | mengkloning nilai ke-13 di stack | |
| 8D | DUP14 | 3 | ..., a | a, ..., a | mengkloning nilai ke-14 di stack | |
| 8E | DUP15 | 3 | ..., a | a, ..., a | mengkloning nilai ke-15 di stack | |
| 8F | DUP16 | 3 | ..., a | a, ..., a | mengkloning nilai ke-16 di 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 menyebarkan 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 | . | mengirim semua ETH ke addr; jika dieksekusi dalam transaksi yang sama saat kontrak dibuat, ini akan menghancurkan kontrak |