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:
- Input yang sama selalu menghasilkan hash yang sama.
- Ubah satu karakter saja, hasilnya berubah total (disebut avalanche effect).
- Satu arah: dari hash kamu gak bisa menebak inputnya.
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
toHexmengubah teks jadi byte (ditulis dalam hex), karena hash bekerja di atas byte, bukan teks.- SHA-256 sudah ada di browser lewat
crypto.subtle.digest('SHA-256', bytes). keccak256 gak ada di WebCrypto, jadi kamu memakai library seperti viem atau ethers. Lab di halaman ini menulis keccak256 versi kecil sendiri, lalu dicek terhadap viem.
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))
}
minemengulang sampai hash-nya diawali0x00, lalu menyimpan hash itu.isValidChainmengecek tiga hal di tiap block: hash yang tersimpan sama dengan hasil hitung ulang, hash-nya memenuhi aturan0x00, danprevHashsama dengan hash block sebelumnya.
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
- Mengira keccak256 sama dengan SHA3-256. NIST mengubah padding Keccak waktu menjadikannya SHA-3. Hash dari teks kosong: keccak256
0xc5d24601...a470, SHA3-2560xa7ffc6f8...434a. Fungsisha3dari library umum gak menghasilkan hash yang dipakai Ethereum. - Menaruh data pribadi on-chain. Nama, nomor HP dan alamat gak bisa dihapus lagi dan terbaca semua orang. Simpan di database biasa.
- Mengira "tercatat di blockchain" berarti benar. Hash cuma membuktikan data gak berubah sejak ditulis. Kasir salah ketik 950, ya 950 itu yang tercatat selamanya.
- Membagikan private key atau seed phrase. Siapa pun yang memegangnya menguasai akunmu. Gak ada orang jujur yang memintanya, termasuk "admin" atau "support".
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.