Anatomi transaksi Ethereum
Setiap aksi di Ethereum — transfer, panggil smart contract, deploy kontrak baru — dibungkus dalam struktur yang sama: satu objek transaksi. Memahami field-nya satu per satu membuat separuh 'keajaiban' blockchain langsung masuk akal.
Intisari
- Transaksi Ethereum modern (EIP-1559) punya field inti:
nonce, to, value, gasLimit, maxFeePerGas, maxPriorityFeePerGas, data, v, r, s. nonceadalah penghitung urutan transaksi per akun — mencegah replay attack dan memastikan urutan eksekusi.datakosong berarti transfer native coin biasa;dataterisi berarti memanggil fungsi smart contract (4 byte pertama = function selector).gasLimitadalah batas atas gas yang kamu izinkan terpakai — bukan yang pasti terpakai. Sisa dikembalikan; kehabisan di tengah jalan berarti transaksi gagal tapi gas tetap hangus.(v, r, s)adalah tanda tangan ECDSA — dari sinilah node memulihkan address pengirim tanpa transaksi perlu menyebutkan pengirimnya secara eksplisit.
Struktur mentah satu transaksi
{
"nonce": "0x2a",
"to": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984",
"value": "0x0",
"gasLimit": "0x5208",
"maxFeePerGas": "0x9502f9000",
"maxPriorityFeePerGas": "0x9502f900",
"data": "0xa9059cbb0000000000000000000000001f98...",
"chainId": "0x1",
"v": "0x1", "r": "0x9a3c...", "s": "0x7ef1..."
}
Field demi field
| Field | Analog Web2 | Fungsinya |
|---|---|---|
nonce | Sequence number / idempotency key | Urutan transaksi per akun — transaksi ke-N sebuah akun harus punya nonce N, mencegah pengiriman ulang transaksi lama |
to | URL endpoint | Address penerima — akun biasa (transfer) atau smart contract (pemanggilan fungsi) |
value | Jumlah pembayaran | Native coin (ETH) yang ikut dikirim, dalam satuan wei (10-18 ETH) |
data | Request body | Kosong = transfer biasa. Terisi = ABI-encoded call ke smart contract |
gasLimit | Timeout / budget CPU | Batas atas unit komputasi yang boleh dipakai transaksi ini |
maxFeePerGas | Harga maksimum per unit | Sejak EIP-1559: batas atas total yang mau kamu bayar per unit gas |
v, r, s | Signature header (mis. JWT) | Tanda tangan ECDSA — bukti kepemilikan private key pengirim |
data: transfer polos vs panggilan fungsi
Field data adalah yang membedakan transfer native coin biasa dari pemanggilan smart contract.
Kosong berarti "kirim value ke to, selesai". Terisi berarti node akan menjalankan
kode di address to, dengan data sebagai instruksi:
data = 0xa9059cbb
000000000000000000000000...address penerima, 32 byte...
0000000000000000000000000000000000000000000000000de0b6b3a7640000
Baca sebagai:
0xa9059cbb → 4 byte pertama = function selector = keccak256("transfer(address,uint256)")[:4]
32 byte berikutnya → parameter pertama (address), padded jadi 32 byte
32 byte berikutnya → parameter kedua (uint256), dalam contoh ini 1 token (18 desimal)
Ini juga jawaban dari pertanyaan "bagaimana Etherscan tahu ini transaksi transfer token, bukan sekadar
transaksi acak?" — ia membaca 4 byte pertama data, mencocokkannya dengan ABI kontrak yang sudah
terverifikasi, lalu men-decode sisanya.
Gas: dibayar berapa pun hasilnya
Jebakan yang menjebak pemula: gasLimit adalah batas atas, bukan biaya pasti.
Kalau eksekusi selesai memakai gas lebih sedikit, sisanya dikembalikan. Tapi kalau transaksi gagal
di tengah jalan karena kehabisan gas, seluruh gas yang sudah terpakai sampai titik itu tetap
hangus — kegagalan tidak berarti gratis. Ini alasan kenapa estimasi gas (eth_estimateGas)
selalu dipanggil dulu sebelum mengirim transaksi produksi.
Kenapa nonce tidak boleh diabaikan
Setiap akun punya penghitung nonce sendiri, dimulai dari 0. Node menolak transaksi dengan nonce yang:
- Sudah dipakai — mencegah orang mengirim ulang transaksi lama yang kamu tanda tangani (replay attack).
- Melompat — transaksi dengan nonce 5 tidak akan dieksekusi kalau nonce 4 belum pernah masuk block, ia mengantre (pending) sampai gap-nya terisi.
Ini konsekuensi langsung bagi backend yang mengirim banyak transaksi berurutan dari satu akun service (dibahas lebih jauh di Fase 3): kamu harus mengelola nonce sendiri secara eksplisit, bukan berasumsi node akan mengurutkannya untukmu.
Latihan: buka satu transaksi transfer token ERC-20 apa pun di Etherscan, klik "Click to see
More" di bagian Input Data. Cocokkan 4 byte pertamanya dengan keccak256("transfer(address,uint256)")
yang kamu hitung di materi sebelumnya, lalu identifikasi sendiri di mana address penerima dan jumlah token
disisipkan dalam data mentahnya.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.