Blockchain Fundamentals — Web3

Pernah denger Bitcoin nilainya melonjak ribuan kali lipat? Atau NFT dijual milyaran rupiah? Atau crypto exchange Indodax/Tokocrypto yang transaksi 24/7?…

Blockchain adalah buku catatan yang disalin ke ribuan komputer, dan tiap halaman barunya ditulisi "sidik jari" halaman sebelumnya. Bayangin buku POIN pelanggan di kasir Raka, tapi yang pegang salinannya bukan cuma Raka, melainkan ratusan orang. Kalau ada yang diam-diam mengubah satu angka di halaman lama, sidik jari halaman itu berubah dan gak cocok lagi dengan yang tertulis di halaman berikutnya. Salinan milik orang lain juga gak ikut berubah, jadi perubahannya ketahuan.

Di track Web3 ini kita ikut Raka, pemilik Toko Kaos Raka: Kaos Sablon Kopi Rp 95.000, Kaos Polos Hitam Rp 75.000, Topi Raka Rp 40.000, Mug Sablon Kopi Rp 65.000. Kita akan membangun dua hal: token loyalty POIN (tiap belanja Rp 1.000 dapat 1 POIN, 100 POIN bisa ditukar potongan Rp 5.000) dan koleksi terbatas Kaos Edisi Kopi (100 buah, tiap pembeli dapat satu sertifikat digital bernomor). Semuanya cuma jalan di chain lokal di laptopmu dan di testnet Sepolia, dengan ETH test yang gak ada harganya. Gak ada uang asli. Dan jujur dari awal: untuk satu toko, database biasa lebih cocok. Bagian "Kapan blockchain itu alat yang salah" menjelaskan kenapa.

🧪 Tebakan cepat: buku POIN Raka punya 4 block (#0 sampai #3). Kamu mengubah "Dinda +95 POIN" di block #1 jadi "+950". Supaya rantainya valid lagi, berapa block yang harus kamu hitung ulang: 1, 2, atau 3? Tebak dulu, jawabannya ada di bagian "Rantai block".

Hash: sidik jari data

Hash function mengubah data sepanjang apa pun jadi angka berukuran tetap. Yang dipakai di sini menghasilkan 256 bit, ditulis sebagai 64 karakter hex. Tiga sifatnya:

Ethereum memakai keccak256, Bitcoin memakai SHA-256 (dua kali berturut-turut). Ini hasil asli keduanya:

Input keccak256 SHA-256
Dinda +95 POIN 0xc90bc93f...8718 0xf1a5cdc8...6a0d
Dinda +950 POIN 0xf61ac26d...0f3d 0xb30f7582...3fb1

Cuma beda satu angka 0, tapi hasilnya gak mirip sama sekali.

import { keccak256, sha256, toHex } from 'viem'

console.log(keccak256(toHex('Dinda +95 POIN')))
// 0xc90bc93f4c38630c036c98daa4021801d3f4e8d40066e31e9615171ec28a8718
console.log(sha256(toHex('Dinda +95 POIN')))
// 0xf1a5cdc8a0b8db5bfa09ecc1963dcec1fb0a06a0b34647091d914d0550276a0d

Rantai block

Block adalah satu halaman di buku itu. Di contoh kita, isinya nomor, data, prevHash (hash block sebelumnya), nonce (angka coba-coba, dijelaskan di bawah) dan hash block itu sendiri. Hash-nya dihitung dari nomor|prevHash|data|nonce.

Aturan main buku POIN Raka: hash sebuah block baru sah kalau diawali 0x00. Untuk itu komputer mencoba nonce 0, 1, 2, dan seterusnya sampai ketemu. Mencari nonce ini disebut menambang (mining). Ini hasil asli, dihitung dengan keccak256:

Block Data prevHash nonce hash
#0 Genesis: buku POIN Toko Kaos Raka 0x0000...0000 216 0x00f307b8...21f2
#1 Dinda +95 POIN (Kaos Sablon Kopi) 0x00f307b8...21f2 308 0x001e1293...ef1d
#2 Yoga +115 POIN (Kaos Polos Hitam, Topi Raka) 0x001e1293...ef1d 43 0x00e21053...4e48
#3 Dinda +65 POIN (Mug Sablon Kopi) 0x00e21053...4e48 64 0x0058f3da...45b6

Sekarang ubah block #1 jadi "Dinda +950 POIN". Hash-nya jadi 0x7efe161e...c6b6: gak diawali 0x00 lagi, dan prevHash di block #2 masih 0x001e1293...ef1d, gak cocok. Rantainya putus di situ.

Supaya valid lagi, kamu tambang ulang #1 (nonce baru: 1.359). Tapi hash #1 yang baru mengubah prevHash #2, jadi #2 harus ditambang ulang, lalu #3 juga. Jawabannya 3 block: #1, #2 dan #3, total 1.875 kali hitung hash. Itu jawaban tebakannya. Mengubah satu block berarti menghitung ulang semua block sesudahnya.

const hashBlock = (b) => keccak256(toHex(`${b.number}|${b.prevHash}|${b.data}|${b.nonce}`))

function mine(b) {
  b.nonce = 0
  while (!hashBlock(b).startsWith('0x00')) b.nonce++ // coba nonce berikutnya
  b.hash = hashBlock(b)
  return b
}

function isValidChain(chain) {
  return chain.every((b, i) =>
    hashBlock(b) === b.hash && b.hash.startsWith('0x00') &&
    (i === 0 || b.prevHash === chain[i - 1].hash))
}

Tanda tangan digital: siapa yang boleh menulis

Hash menjaga isi gak berubah. Untuk membuktikan siapa yang menulis, blockchain memakai tanda tangan digital. Tiap akun punya private key (angka rahasia 32 byte), dan dari situ dihitung public key. Alamat Ethereum adalah 20 byte terakhir dari keccak256 public key itu. Transaksi ditandatangani dengan private key, dan siapa pun bisa mengecek tanda tangannya cukup dengan alamatnya, tanpa pernah melihat private key. Algoritmanya ECDSA di kurva secp256k1. WebCrypto di browser punya ECDSA, tapi cuma untuk kurva P-256, P-384 dan P-521, bukan secp256k1, jadi viem dan ethers membawa implementasi JavaScript sendiri.

Sepanjang track ini kita pakai akun test bawaan Hardhat dan Anvil: akun #0 0xf39F...2266 adalah Raka, #1 0x7099...79C8 adalah Dinda, #2 0x3C44...93BC adalah Yoga. Private key akun-akun ini sengaja publik: dicetak ke semua orang tiap kali npx hardhat node jalan. Cuma untuk chain lokal. Jangan pernah kirim ETH asli ke alamat itu.

Konsensus: PoW dan PoS

Ribuan komputer (node) memegang salinan yang sama. Konsensus adalah aturan yang membuat mereka sepakat block mana yang masuk berikutnya.

Proof of Work (PoW) Proof of Stake (PoS)
Dipakai Bitcoin Ethereum sejak The Merge, 15 September 2022
Yang menulis block penambang yang paling dulu menemukan nonce validator yang dipilih acak, sudah mengunci 32 ETH
Kalau curang listrik dan waktunya terbuang stake-nya dipotong (slashing)
Energi sangat besar sekitar 99,95% lebih hemat dari PoW Ethereum dulu

Di PoW, menulis ulang sejarah butuh tenaga hitung lebih besar dari seluruh penambang jujur. Di Ethereum, tiap 12 detik ada slot untuk satu block, validator lain ikut menyetujui, dan setelah sekitar 13 menit block dianggap final.

On-chain dan off-chain

On-chain artinya disimpan di blockchain: saldo, kode smart contract dan isinya, riwayat transaksi. Semuanya publik, permanen, dan tiap penulisan ada biayanya. Off-chain adalah sisanya: foto produk, nama, nomor HP, alamat kirim. Taruh on-chain cuma yang memang perlu dipercaya bersama, misalnya saldo POIN dan siapa pemilik Kaos Edisi Kopi nomor 7. Alamat Dinda gak memuat namanya, tapi begitu ada yang tahu alamat itu milik Dinda, seluruh riwayatnya bisa dibaca siapa pun.

Kapan blockchain itu alat yang salah

Untuk POIN satu toko, tabel poin di database Laravel menang di hampir semua hal:

Database Toko Kaos Raka Blockchain publik
Biaya per catatan praktis gratis bayar gas tiap transaksi
Kasir salah input tinggal UPDATE gak bisa dihapus, harus transaksi baru
Privasi cuma Raka yang lihat semua orang bisa baca
Siapa yang dipercaya Raka gak perlu percaya satu pihak

Kolom terakhir itulah satu-satunya keunggulan blockchain, dan pelanggan Raka memang sudah percaya Raka. Blockchain baru masuk akal kalau beberapa pihak yang gak saling percaya harus berbagi satu catatan tanpa pemilik, misalnya lima toko berbeda menerima POIN yang sama, dan pelanggan boleh memindahkan POIN-nya tanpa izin siapa pun. Kita tetap mempelajarinya karena kamu ingin bisa membangunnya, dan developer yang jujur tahu juga kapan gak memakainya.

Satu lagi: transaksi di blockchain gak bisa dibatalkan. Salah kirim ke alamat keliru, gak ada customer service yang bisa menariknya. Banyak penipuan memanfaatkan ini, misalnya situs palsu yang minta seed phrase (12 atau 24 kata cadangan wallet) atau minta kamu menandatangani sesuatu yang gak kamu pahami.

⚠️ Jebakan yang sering ketemu

TL;DR: Blockchain adalah database terdistribusi: data disimpan dalam block, tiap block menyimpan hash block sebelumnya, dan salinannya dipegang banyak node. Hash (keccak256 di Ethereum, SHA-256 di Bitcoin) berubah total kalau datanya berubah sedikit, jadi mengubah satu block memutus rantai dan memaksa semua block sesudahnya dihitung ulang. Tanda tangan ECDSA secp256k1 membuktikan siapa yang menulis, tanpa membuka private key. Konsensus menentukan block berikutnya: PoW (Bitcoin) lewat menambang, PoS (Ethereum sejak 15 September 2022) lewat validator yang mengunci stake. On-chain itu publik dan permanen, jadi data pribadi tetap off-chain. Untuk satu toko seperti Raka, database biasa lebih murah, lebih cepat, bisa dikoreksi dan privat; blockchain berguna kalau banyak pihak yang gak saling percaya berbagi satu catatan. Kita cuma memakai chain lokal dan Sepolia, dengan akun test yang private key-nya publik.

Yang akan kamu pelajari