← Semua pembelajaran / Blockchain Nol → RWA
Fase 0 · Fondasi Kriptografi & Struktur Data

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.

Sumber asli ethereum.org Resmi Rangkuman ~8 menit baca

Intisari

  • Transaksi Ethereum modern (EIP-1559) punya field inti: nonce, to, value, gasLimit, maxFeePerGas, maxPriorityFeePerGas, data, v, r, s.
  • nonce adalah penghitung urutan transaksi per akun — mencegah replay attack dan memastikan urutan eksekusi.
  • data kosong berarti transfer native coin biasa; data terisi berarti memanggil fungsi smart contract (4 byte pertama = function selector).
  • gasLimit adalah 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

FieldAnalog Web2Fungsinya
nonceSequence number / idempotency keyUrutan transaksi per akun — transaksi ke-N sebuah akun harus punya nonce N, mencegah pengiriman ulang transaksi lama
toURL endpointAddress penerima — akun biasa (transfer) atau smart contract (pemanggilan fungsi)
valueJumlah pembayaranNative coin (ETH) yang ikut dikirim, dalam satuan wei (10-18 ETH)
dataRequest bodyKosong = transfer biasa. Terisi = ABI-encoded call ke smart contract
gasLimitTimeout / budget CPUBatas atas unit komputasi yang boleh dipakai transaksi ini
maxFeePerGasHarga maksimum per unitSejak EIP-1559: batas atas total yang mau kamu bayar per unit gas
v, r, sSignature 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:

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.