Bangun Blockchain di Golang dari Awal

Pada artikel ini, kami akan fokus pada pengembangan blockchain Go dari awal. Namun, sebelum kita mulai, Anda harus yakin bahwa Anda sudah familiar dengan konsep dasar di Golang. Jika tidak, maka adalah bijaksana jika Anda melalui konsep awal dan kemudian kembali ke blockchain. 

Jadi, mari kita langsung ke topik. 

Memulai dengan Direktori Baru 

Kami akan membangun direktori baru untuk memulai. Mari kita asumsikan bahwa direktori ini memiliki nama “blockchain.” Kami akan mengetikkan kode di Command Prompt (atau jika Anda menggunakan macOS atau Linux, Anda harus menggunakan Terminal). Jadi, kami mengetik:

cd go-ruang kerja 

blockchain mkdir 

rantai blok cd 

kode

Saat Kode VS terbuka, kami akan membuat modul Go di Command Prompt. Bagaimana kita melakukannya? Nah, kita ketik:

pergi mod init github.com/golang-company/blockchain

Pengkodean di main.go 

Selanjutnya, kita akan membuat file sumber Go bernama 'main.go' dan kita akan mengetikkan kode di dalamnya. Tapi pertama-tama mari kita pahami apa itu blockchain. SEBUAH blockchain dapat didefinisikan sebagai database publik yang terdesentralisasi dan didistribusikan di antara beberapa rekan. Blockchain memungkinkan database untuk mengoreksi diri, bahkan jika sebuah node menghasilkan data yang tidak akurat. 

Biasanya, satu blok di blockchain terdiri dari data yang kami bagikan di database, hash, dan hash kriptografi blok sebelumnya. 

 Jadi, apakah Anda siap untuk Pergi pengembangan blockchain? Besar! Mari kita mulai. 

Bagian Pemrograman 

Di bagian ini, kita akan melihat file main.go. 

paket utama

impor (

"byte"

“kripto/sha256” 

"Fmt" 

)

ketik struct Cryptoblock {

Hash [] byte 

Data [] bita 

SebelumnyaHash [] byte 

}

  • Seperti yang Anda lihat, sebuah struct baru saja dibuat. 

fungsi (c *Cryptoblock) BuildHash() {

detail := byte.Gabung([][] byte{c.Data, c.PrevHash}, []byte{}) 

hash := sha256.Sum256(detail)

c.Hash = hash[ : ]

}

  • Sekarang kita akan membangun metode yang memungkinkan kita untuk menghasilkan hash tergantung pada data dan hash sebelumnya. Kami akan mengimpor perpustakaan "bytes" karena kami akan menggunakannya.
  • Langkah selanjutnya adalah membuat variabel yang disebut detail dan menggunakan tipe data byte. Kami akan menggunakan Join() untuk menghubungkan irisan byte.

detail := byte.Gabung([][] byte{c.Data, c.PrevHash}, []byte{}) 

Di sini, kami mengambil sepotong byte 2D, kami mengirimkan c.Data dan hash sebelumnya. Kemudian kita akan menggabungkan potongan byte yang kosong. 

  • Setelah ini, kami membuat hash aktual dengan mengambil bantuan dari fungsi hashing sum256 pada detailnya. Kita dapat menggunakan ini karena kita akan mengimpor perpustakaan sha256. 
  • Selanjutnya, kami mendorong hash yang dibuat ke bidang Hash untuk blok tersebut. 

func BuildBlock (string data, prevHash [] byte) *Cryptoblock {

blok := &Cryptoblock{[]byte{}, []byte(data), prevHash}

blok.BuildHash()

blok kembali

  • Kami sekarang akan membangun fungsi yang memungkinkan pembuatan Blok. Fungsi menerima string data sebagai input, prevHash dari blok sebelumnya sebagai input, dan kemudian mengeluarkan referensi ke Cryptoblock. Kami akan membangun blok menggunakan konstruktor blok. 
  • &Cryptoblock bertindak sebagai referensi ke blok. Untuk bidang Hash, kami memasukkan sepotong byte kosong. Untuk bidang Data, kami mengambil string data dan mengubahnya menjadi irisan byte. Dan kami memasukkan prevHash ke dalam bidang PrevHash. 
  • Terakhir, kita memanggil BuildHash() pada blok dan mengembalikan blok tersebut. 

ketik struct BlockChain {

blok []*Cryptoblock

}

  • Jenis yang akan membantu dalam mengekspresikan blockchain diperlukan. Dan kami menerapkan struct untuk mencapai ini. Jenis struct BlockChain terdiri dari array pointer ke Cryptoblock.

func (rantai *BlockChain) AddBlock(string data) {

prevBlock := rantai.blok[len(rantai.blok)-1]

baru := BuildBlock(data, prevBlock.Hash)

chain.blocks = tambahkan (chain.blocks, baru)

}

  • Di sini, kami membuat metode yang memungkinkan kami untuk menggabungkan blok ke rantai. Metode ini mengambil pointer blockchain. Setelah ini, ia menerima string data. 
  • Memanggil chain.blocks, kita sampai ke blok sebelumnya di blockchain. Selanjutnya, kami melewati panjang blockchain [len(chain.blocks)-1].
  • Dalam variabel baru, kita memanggil fungsi BuildBlock dan kita melewatkan string data dan prevBlock.Hash.
  • Dengan memanfaatkan fungsi append, menambahkan ini ke chain.blocks, kami kemudian melampirkan blok baru ke blockchain.

func Inception() *Cryptoblock {

kembalikan BuildBlock(“Inception”, []byte{})

}

  • Langkah selanjutnya adalah membuat fungsi bernama Inception yang akan mendeskripsikan blok pertama blockchain. Dan kami akan mengembalikan BuildBlock baru di fungsi tersebut, bersama dengan data di blok pertama. Di Sini. Saya telah memasukkan "Inception" dan sepotong byte yang mewakili hash kosong sebelumnya. 

fungsi InitBlockChain() *BlockChain {

kembalikan &BlockChain{[]*Cryptoblock{Inception()}}

}

  • Untuk membuat blockchain pertama, saya telah memperkenalkan fungsi InitBlockChain. Di sini, saya hanya mengembalikan referensi khusus ke BlockChain. Selanjutnya, kita membangun array Cryptoblock, di mana kita membuat panggilan ke fungsi Inception. 

fungsi utama() {

rantai := InitBlockChain()

chain.AddBlock("Blok Pertama setelah Inception")

chain.AddBlock("Blok Kedua setelah Inception")

chain.AddBlock("Blok Ketiga setelah Inception")

untuk _, blok := range chain.blocks {

fmt.Printf(“Hash Sebelumnya: %x\n”, blok.PrevHash)

fmt.Printf(“Data dalam Blok: %s\n”, blok.Data)

fmt.Printf(“Hash: %x\n”, blok.Hash)

}

}

  • Akhirnya, kita sampai pada fungsi utama. Seperti yang Anda lihat, kami telah memanggil InitBlockChain() dan kami telah menetapkannya ke variabel rantai. 
  • Selanjutnya, kami menambahkan blok ke rantai melalui chain.AddBlock, dan kami meneruskan data yang diperlukan. 
  • Setelah ini, kami menjalankan for loop untuk memeriksa blockchain. Kemudian kami memilih setiap blok dan mencetak bidang di dalam setiap blok. Kami hanya mengetik:

fmt.Printf(“Hash Sebelumnya: %x\n”, blok.PrevHash)

fmt.Printf(“Data dalam Blok: %s\n”, blok.Data)

fmt.Printf(“Hash: %x\n”, blok.Hash)

Keluaran: 

Jadi, kita dapat mengatakan bahwa program ini berhasil. Saya harap Anda dapat memahami implementasi konsep blockchain di Golang. Teruslah berlatih dan Anda akan dapat menangani proyek yang rumit. 

Crypto Anda layak mendapatkan keamanan terbaik. Mendapatkan Dompet perangkat keras buku besar hanya dengan $79!

Sumber: https://coinfomania.com/build-a-blockchain-in-golang/