Membuat Blockchain Dengan Golang
date
Oct 10, 2023
slug
membuat-blockchain-dengan-golang
status
Published
tags
Blockchain
summary
Blockchain adalah database yang tersimpan tidak hanya di satu tempat, tapi tersebar di banyak tempat, dan semua yang terlibat di dalamnya memiliki salinan penuh atau sebagian dari database tersebut.
type
Post
Jadi, apa itu blockchain? kita bisa mulai dengan membayangkan sebuah excel yang dibagikan kepada banyak orang. Setiap baris pada file excel tersebut berisi catatan transaksi yang pernah terjadi dan akan diperbaharui setiap kali ada transaksi baru. Itulah analogi termudah dari blockchain.
Blockchain merupakan database yang tidak hanya tersimpan pada satu tempat, melainkan menyebar di berbagai tempat, dan setiap individu yang terlibat di dalamnya memiliki salinan lengkap atau sebagian dari database tersebut. Oleh karena itu, tidak sembarang orang dapat menambahkan catatan baru ke dalam blockchain, sebab diperlukan persetujuan dari semua pengguna yang memiliki salinan data tersebut
Cara Kerja Blockchain
Kemudian, bagaimana blockchain bekerja? Kembali lagi ke analogi excel kita, ketika transaksi baru dilakukan, sebuah baris baru akan ditambahkan. Dalam blockchain, baris tersebut disebut block. Block merupakan tempat penyimpanan berbagai informasi. Misalnya, block pada Bitcoin bertujuan untuk menyimpan informasi transaksi, yang merupakan inti dari jaringan Bitcoin. Selain itu, sebuah block juga dapat berisi informasi teknis, seperti versi block tersebut, waktu pembuatan block, dan hash dari block sebelumnya.
Sebelum sebuah block dapat dimasukkan ke dalam blockchain, detail dari transaksi tersebut harus diperiksa dan disetujui terlebih dahulu oleh pengguna lainnya.
Setelah pengguna lain setuju bahwa transaksi tersebut valid, sebuah block baru dapat ditambahkan ke dalam blockchain. Yang membuat blockchain menjadi unik adalah bahwa setelah block ditambahkan ke blockchain, ia tidak bisa diubah atau dihapus. Ini memberikan transparansi dan keamanan yang luar biasa pada semua transaksi.
Mulai Membuat Blockchain
Setelah kita memahami tentang blockchain secara singkat, sekarang saatnya kita mencoba membuat versi sederhana dari blockchain
- Buatlah Folder baru dan berikan nama yang sesuai, misalnya blockchain. buatkan file
main.go
berserta fungsimain
didalamnya
- Buat file bernama
block.go
lalu tulis kode di bawah untuk membuat structblock
- Timestamp berfungsi sebagai penanda waktu kapan Block dibuat
- Data merupakan inti dari block. Dalam konteks kita yaitu bitcoin, data merujuk pada detail transaksi yang dilakukan
- PrevBlockHash menyimpan hash dari block yang ada sebelumnya. Fitur ini memungkinkan blockchain menjadi seperti rantai, dimana setiap block akan saling berhubungan dengan block sebelumnya. Karena itulah di sebut blockchain (rantai block)
- Hash adalah kode unik dari setiap Block. Hash ini mengacak informasi yang ada di dalam blok menjadi deretan angka dan huruf acak. Setiap block memiliki hash yang berbeda
Mari kita bahas apa saja yang ada di dalam struct
block
:- Selanjutnya, kita akan membuat fungsi yang digunakan untuk menghasilkan hash dari sebuah block
timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
Baris ini mengkonversiTimestamp
dari block (yang merupakan tipe data int64) ke string, dan kemudian ke slice byte.headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
Baris ini menggabungkanPrevBlockHash
,Data
, dantimestamp
menjadi satu slice byte.bytes.Join
menggabungkan elemen-elemen slice byte dan memisahkannya menggunakan pemisah yang diberikan, dalam hal ini pemisahnya adalah slice byte kosong.hash := sha256.Sum256(headers)
Baris ini menghitung hash SHA-256 dariheaders.Sum256
adalah fungsi dari paketcrypto/sha256
dan menghasilkan hash dalam bentuk array byte dengan ukuran 32.- Baris kode
b.Hash = hash[:]
menetapkan nilai hash yang baru dihitung ke dalam attributHash
pada objekBlock
.hash[:]
mengambil array byte dan membuat salinan dalam bentuk slice byte. Dalam konteks ini,b
adalah pointer ke objekBlock
kita. Oleh karena itu, nilai hash yang dihasilkan akan disimpan pada pointerb
.
Mari kita lihat apa saja yang ada di dalam fungsi
SetHash
- Setelah membuat fungsi
SetHash
, langkah berikutnya adalah membuat fungsi untuk menciptakan block baru. Dalam fungsi ini kita akan mengunakan fungsiSetHash
yang telah dibuat sebelumnya untuk menghasilkan hash yang diinginkan. block := &Block{Timestamp: 0, Data: []byte(data), PrevBlockHash: prevBlockHash, Hash: []byte{}}
Baris ini membuat variabel baru dari struckBlock
dengan nilai:- Timestamp diberikan 0
- Data akan diisi detail transaksi
- PrevBlockHash diisi dengan hash block sebelumnya
- Hash diinisialisasi sebagai slice byte kosong terlebih dahulu.
block.SetHash()
. Baris ini memanggil fungsiSetHash
yang telah kita buat sebelumnya. Fungsi ini akan menghitung nilai hash berdasarkanTimestamp
,Data
, danPrevBlockHash
.
- Setelah berhasil membuat beberapa fungsi yang berhubungan dengan block, langkah selanjutnya adalah membuat fungsi yang bertujuan untuk menambahkan block ke dalam rantai block yang sudah ada. Buatlah file bernama
blockchain.go
lalu buatlah struck bernama blockchain di dalamnya
Struct ini bertujuan untuk menambung beberapa block
- Lalu kita buatkan fungsi untuk menambahkan block kedalam Blockchain
prevBlock := bc.blocks[len(bc.blocks)-1]
Baris ini bertujuan untuk memperoleh block terakhir (terbaru) dalam blockchain saat ini. Kita bisa mendapatkan blok terakhir dengan mengakses elemen terakhir dalam sliceblocks
milik pointerbc
.newBlock := NewBlock(data, prevBlock.Hash)
Baris ini membuat blok baru dengan menggunakan fungsiNewBlock
yang sudah kita buat pada fileblock.go
. Fungsi ini mengambil data yang diberikan sebagai argumen dan hash dariprevBlock
untuk membuat block baru.bc.blocks = append(bc.blocks, newBlock)
Baris ini menambahkan blok baru yang dibuat pada baris sebelumnya ke dalam sliceblocks
milikbc
Fungsi
AddBlock
kita buat ini bertujuan untuk menambahkan block baru ke dalam blockchain.- Untuk menambahkan block baru, kita membutuhkan block sebelumnya yang sudah ada, tetapi tetapi bagaimana jika dalam blockchain kita belum ada block sama sekali. Oleh karena itu, dalam blockchain, harus ada setidaknya satu block pertama dalam rantai, block ini disebut genesis block
fungsi ini memangil fungsi
NewBlock
yang sebelumnya sudah kita buat, dengan memasukan Genesis Block
untuk parameter data dan []byte{}
untuk prevBlockHash- Sekarang, kita dapat membuat fungsi yang bertujuan untuk menciptakan blockchain dan akan mengunakan fungsi
NewGenesisBlock
untuk membuat block pertama.
return &Blockchain{[]*Block{NewGenesisBlock()}}
baris ini bertujuan untuk mengembalikan sebuah pointer blockchain yang berisi array dari pointer block. Array ini hanya memiliki satu block di dalamnya sebagai block awal yang dihasilkan oleh fungsi NewGenesisBlock()
- Setelah membuat semua fungsi yang dibutuhkan, kita bisa mulai memangilnya pada fungsi main di file
main.go
- Sekarang kita sudah berhasil membuat versi sederhana dari blockchain, dengan menggunakan array block yang saling terhubung. pada kasus sebenarnya blockchain jauh lebih kompleks. terdapat banyak mekanisme yang harus di buat. Sebagai contoh, salah satu mekanisme penting dalam sistem Bitcoin adalah Proof-of-Work (PoW). PoW dirancang dengan tujuan yang sangat spesifik yaitu untuk mencegah potensi spam dan serangan DDoS kepada sistem. Mekanisme ini memastikan integritas dan keamanan di dalam jaringan blockchain.
Sumber utama tulisan ini berasal dari artikel https://jeiwan.net/posts/building-blockchain-in-go-part-1/. Untuk pemahaman yang lebih mendalam dan lengkap, saya sarankan Anda untuk mengikuti membaca tulisan tersebut
Tujuan dari penulisan ini adalah untuk mencatat proses pembelajaran saya saat mengikuti tutorial tersebut. Saya berpikir bahwa dengan menuangkan catatan saya dalam bentuk blog, maka akan membantu orang lain yang ingin mengikuti tutorial yang sama
Full source codes: https://github.com/hajidalakhtar/blockchain-sederhana