Opcode untuk EVM
Ikhtisar
Ini adalah versi yang diperbarui dari halaman referensi EVM di wolflo/evm-opcodes (buka di tab baru). Juga diambil dari Kertas Kuning (buka di tab baru), Jello Paper (buka di tab baru), dan implementasi geth (buka di tab baru). Ini dimaksudkan sebagai referensi yang mudah diakses, tetapi tidak terlalu ketat. Jika Anda ingin memastikan kebenaran dan mengetahui setiap kasus ekstrem, disarankan untuk menggunakan Jello Paper atau implementasi klien.
Mencari referensi interaktif? Kunjungi evm.codes (buka di tab baru).
Untuk operasi dengan biaya gas dinamis, lihat gas.md (buka di tab baru).
💡 Tip 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 (buka di tab baru) | a, b | a ** b | eksponensiasi uint256 modulo 2**256 | |
| 0B | SIGNEXTEND | 5 | b, x | SIGNEXTEND(x, b) | perluasan tanda (sign extend) (buka di tab baru) 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 | kesamaan (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` | |
| 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 aritmatika ke kanan | |
| 1E-1F | tidak valid | |||||
| 20 | KECCAK256 | A2 (buka di tab baru) | 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 (buka di tab baru) | addr | addr.balance | saldo, dalam Wei | |
| 32 | ORIGIN | 2 | . | tx.origin | alamat yang memulai transaksi | |
| 33 | CALLER | 2 | . | msg.sender | alamat pengirim pesan (msg sender) | |
| 34 | CALLVALUE | 2 | . | msg.value | nilai pesan (msg value), dalam Wei | |
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | baca kata (word) dari data pesan pada indeks idx | |
| 36 | CALLDATASIZE | 2 | . | len(msg.data) | panjang data pesan, dalam bita | |
| 37 | CALLDATACOPY | A3 (buka di tab baru) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | salin data pesan |
| 38 | CODESIZE | 2 | . | len(this.code) | panjang kode kontrak yang dieksekusi, dalam bita | |
| 39 | CODECOPY | A3 (buka di tab baru) | 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 ** (buka di tab baru) | |
| 3B | EXTCODESIZE | A5 (buka di tab baru) | addr | len(addr.code) | ukuran kode pada alamat, dalam bita | |
| 3C | EXTCODECOPY | A4 (buka di tab baru) | addr, dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | salin kode dari addr |
| 3D | RETURNDATASIZE | 2 | . | size | ukuran data yang dikembalikan dari panggilan eksternal terakhir, dalam bita | |
| 3E | RETURNDATACOPY | A3 (buka di tab baru) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | salin data yang dikembalikan dari panggilan eksternal terakhir |
| 3F | EXTCODEHASH | A5 (buka di tab baru) | 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 blok saat ini | |
| 43 | NUMBER | 2 | . | block.number | nomor blok saat ini | |
| 44 | PREVRANDAO | 2 | . | randomness beacon | suar keacakan (randomness beacon) | |
| 45 | GASLIMIT | 2 | . | block.gaslimit | batas gas blok saat ini | |
| 46 | CHAINID | 2 | . | chain_id | dorong ID rantai (buka di tab baru) saat ini ke stack | |
| 47 | SELFBALANCE | 5 | . | address(this).balance | saldo kontrak yang dieksekusi, dalam Wei | |
| 48 | BASEFEE | 2 | . | block.basefee | biaya dasar blok saat ini | |
| 49 | BLOBHASH | 3 | idx | tx.blob_versioned_hashes[idx] | EIP-4844 (buka di tab baru) | |
| 4A | BLOBBASEFEE | 2 | . | block.blobbasefee | biaya dasar blob blok saat ini (EIP-7516 (buka di tab baru)) | |
| 4B-4F | tidak valid | |||||
| 50 | POP | 2 | _anon | . | hapus item dari atas stack dan buang | |
| 51 | MLOAD | 3* (buka di tab baru) | ost | mem[ost:ost+32] | baca kata (word) dari memori pada offset ost | |
| 52 | MSTORE | 3* (buka di tab baru) | ost, val | . | mem[ost:ost+32] := val | tulis sebuah kata (word) ke memori |
| 53 | MSTORE8 | 3* (buka di tab baru) | ost, val | . | mem[ost] := val && 0xFF | tulis satu bita ke memori |
| 54 | SLOAD | A6 (buka di tab baru) | key | storage[key] | baca kata (word) dari penyimpanan | |
| 55 | SSTORE | A7 (buka di tab baru) | key, val | . | storage[key] := val | tulis kata (word) ke penyimpanan |
| 56 | JUMP | 8 | dst | . | $pc := dst tandai 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 | tandai tujuan lompatan yang valid | tujuan lompatan yang valid misalnya tujuan lompatan yang tidak berada di dalam data push | ||
| 5C | TLOAD | 100 | key | tstorage[key] | baca kata (word) dari penyimpanan sementara (EIP-1153 (buka di tab baru)) | |
| 5D | TSTORE | 100 | key, val | . | tstorage[key] := val | tulis kata (word) ke penyimpanan sementara (EIP-1153 (buka di tab baru)) |
| 5E | MCOPY | 3+3*words+A0 (buka di tab baru) | dstOst, ost, len | . | mem[dstOst] := mem[ost:ost+len] | salin memori dari satu area ke area lain (EIP-5656 (buka di tab baru)) |
| 5F | PUSH0 | 2 | . | uint8 | dorong nilai konstan 0 ke stack | |
| 60 | PUSH1 | 3 | . | uint8 | dorong nilai 1-bita ke stack | |
| 61 | PUSH2 | 3 | . | uint16 | dorong nilai 2-bita ke stack | |
| 62 | PUSH3 | 3 | . | uint24 | dorong nilai 3-bita ke stack | |
| 63 | PUSH4 | 3 | . | uint32 | dorong nilai 4-bita ke stack | |
| 64 | PUSH5 | 3 | . | uint40 | dorong nilai 5-bita ke stack | |
| 65 | PUSH6 | 3 | . | uint48 | dorong nilai 6-bita ke stack | |
| 66 | PUSH7 | 3 | . | uint56 | dorong nilai 7-bita ke stack | |
| 67 | PUSH8 | 3 | . | uint64 | dorong nilai 8-bita ke stack | |
| 68 | PUSH9 | 3 | . | uint72 | dorong nilai 9-bita ke stack | |
| 69 | PUSH10 | 3 | . | uint80 | dorong nilai 10-bita ke stack | |
| 6A | PUSH11 | 3 | . | uint88 | dorong nilai 11-bita ke stack | |
| 6B | PUSH12 | 3 | . | uint96 | dorong nilai 12-bita ke stack | |
| 6C | PUSH13 | 3 | . | uint104 | dorong nilai 13-bita ke stack | |
| 6D | PUSH14 | 3 | . | uint112 | dorong nilai 14-bita ke stack | |
| 6E | PUSH15 | 3 | . | uint120 | dorong nilai 15-bita ke stack | |
| 6F | PUSH16 | 3 | . | uint128 | dorong nilai 16-bita ke stack | |
| 70 | PUSH17 | 3 | . | uint136 | dorong nilai 17-bita ke stack | |
| 71 | PUSH18 | 3 | . | uint144 | dorong nilai 18-bita ke stack | |
| 72 | PUSH19 | 3 | . | uint152 | dorong nilai 19-bita ke stack | |
| 73 | PUSH20 | 3 | . | uint160 | dorong nilai 20-bita ke stack | |
| 74 | PUSH21 | 3 | . | uint168 | dorong nilai 21-bita ke stack | |
| 75 | PUSH22 | 3 | . | uint176 | dorong nilai 22-bita ke stack | |
| 76 | PUSH23 | 3 | . | uint184 | dorong nilai 23-bita ke stack | |
| 77 | PUSH24 | 3 | . | uint192 | dorong nilai 24-bita ke stack | |
| 78 | PUSH25 | 3 | . | uint200 | dorong nilai 25-bita ke stack | |
| 79 | PUSH26 | 3 | . | uint208 | dorong nilai 26-bita ke stack | |
| 7A | PUSH27 | 3 | . | uint216 | dorong nilai 27-bita ke stack | |
| 7B | PUSH28 | 3 | . | uint224 | dorong nilai 28-bita ke stack | |
| 7C | PUSH29 | 3 | . | uint232 | dorong nilai 29-bita ke stack | |
| 7D | PUSH30 | 3 | . | uint240 | dorong nilai 30-bita ke stack | |
| 7E | PUSH31 | 3 | . | uint248 | dorong nilai 31-bita ke stack | |
| 7F | PUSH32 | 3 | . | uint256 | dorong nilai 32-bita ke stack | |
| 80 | DUP1 | 3 | a | a, a | kloning nilai ke-1 di stack | |
| 81 | DUP2 | 3 | _, a | a, _, a | kloning nilai ke-2 di stack | |
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | kloning nilai ke-3 di stack | |
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | kloning nilai ke-4 di stack | |
| 84 | DUP5 | 3 | ..., a | a, ..., a | kloning nilai ke-5 di stack | |
| 85 | DUP6 | 3 | ..., a | a, ..., a | kloning nilai ke-6 di stack | |
| 86 | DUP7 | 3 | ..., a | a, ..., a | kloning nilai ke-7 di stack | |
| 87 | DUP8 | 3 | ..., a | a, ..., a | kloning nilai ke-8 di stack | |
| 88 | DUP9 | 3 | ..., a | a, ..., a | kloning nilai ke-9 di stack | |
| 89 | DUP10 | 3 | ..., a | a, ..., a | kloning nilai ke-10 di stack | |
| 8A | DUP11 | 3 | ..., a | a, ..., a | kloning nilai ke-11 di stack | |
| 8B | DUP12 | 3 | ..., a | a, ..., a | kloning nilai ke-12 di stack | |
| 8C | DUP13 | 3 | ..., a | a, ..., a | kloning nilai ke-13 di stack | |
| 8D | DUP14 | 3 | ..., a | a, ..., a | kloning nilai ke-14 di stack | |
| 8E | DUP15 | 3 | ..., a | a, ..., a | kloning nilai ke-15 di stack | |
| 8F | DUP16 | 3 | ..., a | a, ..., a | kloning 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 (buka di tab baru) | ost, len | . | LOG0(memory[ost:ost+len-1]) | |
| A1 | LOG1 | A8 (buka di tab baru) | ost, len, topic0 | . | LOG1(memory[ost:ost+len-1], topic0) | |
| A2 | LOG2 | A8 (buka di tab baru) | ost, len, topic0, topic1 | . | LOG2(memory[ost:ost+len-1], topic0, topic1) | |
| A3 | LOG3 | A8 (buka di tab baru) | ost, len, topic0, topic1, topic2 | . | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | |
| A4 | LOG4 | A8 (buka di tab baru) | ost, len, topic0, topic1, topic2, topic3 | . | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | |
| A5-EF | tidak valid | |||||
| F0 | CREATE | A9 (buka di tab baru) | val, ost, len | addr | addr = keccak256(rlp([address(this), this.nonce])) | |
| F1 | CALL | AA (buka di tab baru) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F2 | CALLCODE | AA (buka di tab baru) | 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* (buka di tab baru) | ost, len | . | return mem[ost:ost+len-1] | |
| F4 | DELEGATECALL | AA (buka di tab baru) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F5 | CREATE2 | A9 (buka di tab baru) | 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 (buka di tab baru) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| FB-FC | tidak valid | |||||
| FD | REVERT | 0* (buka di tab baru) | ost, len | . | revert(mem[ost:ost+len-1]) | |
| FE | INVALID | AF (buka di tab baru) | opcode tidak valid yang ditetapkan - EIP-141 (buka di tab baru) | |||
| FF | SELFDESTRUCT | AB (buka di tab baru) | addr | . | mengirimkan semua ETH ke addr; jika dieksekusi dalam transaksi yang sama saat kontrak dibuat, ini akan menghancurkan kontrak tersebut |