Belajar Dasar Blochchain: Membuat Wallet dan Menerima Coin
Daftar Isi
Banyak developer pemula enggan menyentuh blockchain karena mengira butuh modal uang riil atau pusing dengan volatilitas harga koin di bursa.Kenyataannya, sebagai developer, kita tidak butuh uang sepeser pun untuk belajar dan memprogram di blockchain. Di seri tutorial ini, kita akan membangun interaksi on-chain menggunakan TypeScript dari baris kode paling mendasar: membuat wallet tanpa server terpusat.
Pahami Dulu: Sepolia ETH vs Koin Komersial
Sebelum masuk ke kode, mari singkirkan kebingungan terbesar pemula: “Koin apa yang kita gunakan? Apakah harus beli di bursa crypto?”
Jawabannya: Tidak sama sekali.
Di dunia blockchain (khususnya Ethereum), jaringan terbagi menjadi dua ranah utama:
- Mainnet: Jaringan resmi tempat uang nyata berputar. Biaya transaksi (gas fee) memakai ETH asli yang dibeli dengan rupiah atau dolar.
- Testnet: Jaringan tiruan resmi yang disediakan untuk developer bereksperimen. Segala fitur, aturan EVM (Ethereum Virtual Machine), dan perilaku kodenya 100% identik dengan Mainnet, tetapi koinnya bernilai $0 (gratis selamanya).
⚠️ Catatan Penting: Jaringan uji coba yang kita pakai di seri ini bernama Ethereum Sepolia Testnet, dan koin aslinya disebut Sepolia ETH. Koin ini TIDAK ADA di CoinMarketCap atau bursa jual-beli. Jangan sampai tertukar dengan token komersial lain yang punya nama mirip (seperti token liquid staking komersial).
Bagaimana Akun Blockchain Terbentuk?
Jika di web tradisional Anda butuh database SQL dengan tabel users untuk membuat akun, di blockchain identitas Anda adalah murni produk matematika satu arah.
Alurnya adalah:
[Entropi Acak / Random 256-bit]
│
▼
Private Key (64 karakter hex)
│ (Kriptografi Kurva Eliptik: secp256k1)
▼
Public Key (Titik koordinat di kurva)
│ (Hashing: Keccak-256 lalu ambil 20 byte terakhir)
▼
Address Publik (Alamat 0x... sepanjang 42 karakter)
- Private Key: Kunci rahasia mutlak. Siapa pun yang tahu baris teks ini bisa menguras seluruh isi dompet Anda. Ini tidak boleh dibagikan ke siapa pun.
- Public Key: Diturunkan dari Private Key menggunakan kurva eliptik
secp256k1. - Address Publik: Diturunkan dengan memotong hasil
hashKeccak-256 dari Public Key. Ini adalah alamat “rekening” Anda yang aman dibagikan ke publik agar orang lain bisa mengirim aset ke Anda.
Karena proses ini bersifat satu arah, siapa pun bisa memverifikasi bahwa sebuah transaksi sah ditandatangani oleh pemegang Private Key tanpa si pemegang harus membocorkan Private Key-nya.
Menyiapkan Proyek TypeScript
Buka terminal Anda dan jalankan perintah berikut:
mkdir belajar-blockchain && cd belajar-blockchain
bun init -y # Inisialisasi proyek Bun (otomatis membuat package.json & tsconfig.json)
bun add viem # viem sebagai dependensi utama
Jika mengalami complain seperti Cannot find name 'console'. Do you need to change your target library? Try changing the 'lib' compiler option to include 'dom'.ts(2584) any,
maka solusi yang paling tepat (idiomatik) adalah mendaftarkan tipe Bun di tsconfig.json.
{
"compilerOptions": {
"lib": ["ESNext"],
"target": "ESNext",
"types": ["bun"],
"module": "Preserve",
...
}
}
Menulis Kode: Generate Keypair Secara Offline
Buat file baru bernama generate-account.ts di direktori proyek Anda:
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
function main() {
console.log("🛠️ MEMBUAT IDENTITAS BLOCKCHAIN (OFFLINE)");
console.log("==========================================\n");
// Langkah 1: Generate bilangan acak 32-byte berkekuatan kriptografi tinggi
const privateKey = generatePrivateKey();
// Langkah 2: Turunkan Public Key & Ethereum Address dari Private Key
const account = privateKeyToAccount(privateKey);
console.log("🔑 Private Key (RAHASIA / JANGAN DISHARE):");
console.log(privateKey);
console.log("\n📬 Public Address (Aman dibagikan ke publik):");
console.log(account.address);
}
main();
Jalankan skrip langsung lewat terminal menggunakan bun generate-account.ts:
🛠️ MEMBUAT IDENTITAS BLOCKCHAIN (OFFLINE)
==========================================
🔑 Private Key (RAHASIA / JANGAN DISHARE):
0x8b3a4c5e7f1d2e3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a
📬 Public Address (Aman dibagikan ke publik):
0x71C83a5C7F59972Da534608c02B52B44a04d5C20
Coba matikan koneksi Wi-Fi/internet komputer Anda, lalu jalankan perintah di atas lagi. Skrip tetap akan menghasilkan address baru yang valid secara matematis.
Mengambil Saldo Gratis (Faucet) & Menghubungkan Skrip ke Jaringan
Secara harfiah, faucet berarti keran air. Di ekosistem Web3, faucet adalah layanan web publik yang membagikan sejumlah kecil koin testnet secara cuma-cuma kepada para developer untuk keperluan testing.
Koin yang kita dapatkan adalah Sepolia ETH. Koin ini tidak bernilai rupiah/dolar sama sekali dan tidak bisa diperjualbelikan di exchange. Fungsinya murni sebagai “bensin” (gas fee) agar kita bisa mengirim transaksi di testnet tanpa keluar uang sepeser pun.
Cara Mengklaim Sepolia ETH Gratis
Untuk mencegah bot menguras seluruh saldo faucet, penyedia layanan biasanya meminta autentikasi sederhana (login via akun Google, GitHub, atau Gitcoin Passport).
Berikut tiga pilihan faucet paling stabil yang bisa Anda gunakan:
1. via Google Cloud

Setelah berhasil, bukti transaksinya seperti ini https://sepolia.etherscan.io/tx/0x2bd3f84a768419b5227addf0a1669dac9f592b51ba4b0bee489476495686529f
2. via Alchemy
Banyak orang membuat jutaan akun bot untuk menguras koin uji coba gratis, sehingga Alchemy mewajibkan wallet pemohon memiliki minimal 0.001 ETH uang sungguhan di Ethereum Mainnet sebagai bukti bahwa itu akun manusia asli.

3. Sepolia PoW Faucet
Faucet ini menggunakan CPU komputer/laptop Anda selama 1–2 menit (Proof of Work) untuk mencegah bot. Begitu selesai mining, koin Sepolia ETH langsung dikirim ke wallet Anda tanpa syarat apa pun.

Cara mengecek saldo
Di dalam folder proyek belajar-blockchain yang kita buat sebelumnya, buat file baru bernama check-balance.ts:
import { createPublicClient, http, formatEther } from 'viem';
import { sepolia } from 'viem/chains';
const client = createPublicClient({
chain: sepolia,
transport: http('https://ethereum-sepolia-rpc.publicnode.com'), // Endpoint RPC publik Sepolia
});
async function main() {
// Ganti string ini dengan Public Address yang Anda buat sebelumnya
const targetAddress = '0xAD3db3511Da0EdBe32a4cE393507B31ADF7e7600';
console.log("==========================================");
console.log("🌐 MEMBACA SALDO ON-CHAIN DARI SEPOLIA");
console.log("==========================================\n");
try {
console.log(`🔍 Memeriksa address: ${targetAddress}...`);
// Query saldo mentah (hasilnya berupa BigInt dalam satuan Wei)
const balanceWei = await client.getBalance({
address: targetAddress as `0x${string}`,
});
// Konversi satuan Wei ke tampilan Ether desimal
const balanceEther = formatEther(balanceWei);
console.log(`\n💰 Saldo Mentah (Wei) : ${balanceWei.toString()}`);
console.log(`🪙 Saldo Akhir (ETH) : ${balanceEther} SepoliaETH`);
console.log("\n==========================================");
} catch (error) {
console.error("❌ Gagal mengambil data dari RPC:", error);
}
}
main();
Mari kita bedah apa yang sebenarnya terjadi di setiap baris kodenya agar tidak ada istilah yang membingungkan:
Membangun jembatan ke jaringan
const client = createPublicClient({
chain: sepolia,
transport: http('https://ethereum-sepolia-rpc.publicnode.com'),
});
Baris ini adalah inisialisasi koneksi antara skrip lokal kita ke komputer validator blockchain. Ada tiga bagian penting di sini:
createPublicClient: Fungsi dari viem untuk membuat instans klien bertipe read-only (hanya baca). Karena kita cuma mau mengecek saldo dan bukan mengubah data, kita tidak butuh Private Key dan pemanggilan ini 100% gratis tanpa biaya gas.chain: sepolia: Menentukan aturan dan ekosistem jaringan yang kita tuju. Konfigurasisepoliabawaan dariviem/chainsini otomatis membawa metadata penting jaringan, seperti Chain ID unik milik Sepolia (11155111), nama native currency (ETH), dan alamat block explorer resminya (sepolia.etherscan.io). Apakah bisa memakai chain lain atau Mainnet uang asli? Bisa sekali! Arsitekturviembersifat multi-chain untuk semua jaringan yang kompatibel dengan EVM (Ethereum Virtual Machine). Anda cukup mengganti nama chain dan URL RPC-nya. Logika kodenya tetap 100% sama. Beberapa contoh chain populer yang didukung langsung olehviem/chains:- Ethereum Mainnet (
mainnet): Jaringan produksi utama Ethereum dengan Chain ID1. Koin yang dibaca adalah ETH asli bernilai uang nyata. - Layer-2 Rollups: Jaringan penskalaan Ethereum yang jauh lebih murah dan cepat:
- Base / Base Sepolia (base, baseSepolia): Jaringan L2 dari Coinbase.
- Arbitrum One / Arbitrum Sepolia (arbitrum, arbitrumSepolia): Salah satu L2 terbesar di ekosistem EVM.
- Optimism (optimism, optimismSepolia).
- Sidechains & Alternatif EVM:
- Polygon (polygon, polygonAmoy): Menggunakan koin native POL.
- BNB Smart Chain (bsc, bscTestnet): Menggunakan koin native BNB. Contoh jika ingin membaca saldo ETH asli di Mainnet:
Skrip langsung beralih membaca saldo di Ethereum Mainnet tanpa mengubah fungsi getBalance sama sekali.import { mainnet } from 'viem/chains'; const client = createPublicClient({ chain: mainnet, transport: http('https://eth.llamarpc.com'), // RPC node publik Mainnet });- Ethereum Mainnet (
transport: http(’…’): Cara komputer kita mengirim dan menerima pesan. Fungsi http() menggunakan protokol HTTP biasa untuk “menembak” endpoint URL tersebut. URL https://ethereum-sepolia-rpc.publicnode.com adalah alamat server dari salah satu komputer (node) Sepolia yang terbuka untuk publik.
💡 Apa itu RPC (Remote Procedure Call)?
Blockchain bukan database terpusat yang bisa kita query dengan SQL. Blockchain adalah ribuan komputer (nodes). Protokol yang digunakan untuk menyapa node tersebut dinamakan JSON-RPC. Saat kita memanggil transport: http(...), skrip kita sebenarnya sedang mengirim permintaan data standar JSON-RPC ke node tersebut di latar belakang.
Menentukan Target Alamat
const targetAddress = '0xAD3db...';
Ini adalah alamat Ethereum (Public Address) sepanjang 42 karakter heksadesimal yang saldonya ingin kita periksa. Anda bisa memasukkan alamat Anda sendiri atau alamat publik milik siapa pun di jaringan Sepolia.
Meminta Saldo On-Chain Mentah
const balanceWei = await client.getBalance({
address: targetAddress as `0x${string}`,
});
client.getBalance(...): Perintah asinkron (await) untuk menanyakan langsung ke node: “Berapa saldo yang tersisa pada alamat ini sekarang?”. Node akan memeriksa state blok paling mutakhir lalu mengembalikan hasilnya.as0x${string}“: Trik tipe data bawaan TypeScript pada pustaka viem. Ini memastikan string yang kita masukkan adalah alamat heksadesimal valid yang diawali dengan prefiks0x.- Tipe Data
BigInt: Hasil yang tersimpan di variabelbalanceWeibukan angkanumberJavaScript biasa, melainkanBigInt. Nilai yang keluar adalah angka bulat raksasa dalam satuan Wei (misalnya50000000000000000n).
Mengubah Bahasa Komputer Menjadi Bahasa Manusia
const balanceEther = formatEther(balanceWei);
Di sinilah perbedaan satuan di blockchain terlihat:
- Kenapa EVM memakai Wei? Komputer sangat buruk menangani angka pecahan/desimal (floating point) karena rawan terjadi kesalahan pembulatan matematis. Oleh karena itu, EVM menetapkan unit terkecil integer tanpa koma bernama Wei. $$1 \text{ Ether} = 10^{18} \text{ Wei} = 1.000.000.000.000.000.000 \text{ Wei}$$
- Fungsi
formatEther(...): Membaca angka raksasa Wei tersebut lalu membaginya dengan $10^{18}$ ke format string desimal manusiawi. Nilai50000000000000000Wei otomatis diubah menjadi0.05ETH.
Refrensi:
Untuk pembaca yang ingin mendalami teori matematika dan dokumentasi library di balik artikel ini:
- Dokumentasi Resmi Viem (viem.sh): Penjelasan lengkap fungsi akun lokal (generatePrivateKey, privateKeyToAccount, dan modul signatur).
- Ethereum.org: Ethereum Accounts: Panduan resmi Ethereum tentang perbedaan EOA (Externally Owned Account) dan Contract Account.
- Mastering Ethereum (Andreas M. Antonopoulos & Gavin Wood): Bab 4: Cryptographic Keys, Addresses, and Wallets (sumber literatur standar industri untuk memahami kurva eliptik dan Keccak-256).