Zgradite verigo blokov v Golangu iz nič

V tem članku se bomo osredotočili na razvoj Go blockchain od začetka. Toda preden začnemo, morate biti prepričani, da ste seznanjeni z osnovnimi koncepti v Golangu. Če ne, potem je pametno, če greste skozi predhodne koncepte in se nato vrnete k blockchainu. 

Torej, pojdimo naravnost k temi. 

Začetek z novim imenikom 

Za začetek bomo zgradili nov imenik. Predpostavimo, da ima ta imenik ime "blockchain." Kodo bomo vnesli v ukazni poziv (ali če uporabljate macOS ali Linux, morate uporabiti terminal). Tako vtipkamo:

cd go-workspace 

mkdir blockchain 

cd blockchain 

Koda .

Ko se odpre koda VS, bomo v ukaznem pozivu ustvarili modul Go. Kako to naredimo? No, vtipkamo:

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

Kodiranje v main.go 

Nato bomo ustvarili izvorno datoteko Go z imenom 'main.go' in vanjo bomo vnesli kodo. Najprej pa poglejmo, kaj je blockchain. A blockchain lahko definiramo kot javno bazo podatkov, ki je decentralizirana in porazdeljena med več vrstnikov. Blockchain omogoča, da se zbirka podatkov sama popravi, tudi če vozlišče proizvaja netočne podatke. 

Običajno je blok v verigi blokov sestavljen iz podatkov, ki jih delimo v bazi podatkov, zgoščene vrednosti in kriptografske zgoščene vrednosti prejšnjega bloka. 

 Torej, ali ste pripravljeni na Pojdite na razvoj blockchaina? Super! Začnimo. 

Programski del 

V tem razdelku si bomo ogledali datoteko main.go. 

glavni paket

uvoz (

"bajti"

“crypto/sha256” 

"Fmt" 

)

tip Cryptoblock struct {

Hash [] bajt 

Podatki [] bajt 

PrevHash [] bajt 

}

  • Kot lahko vidite, je bila struktura samo ustvarjena. 

func (c *Cryptoblock) BuildHash() {

podrobnosti := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

hash := sha256.Sum256(podrobnosti)

c.Hash = hash[ : ]

}

  • Sedaj bomo izdelali metodo, ki nam bo omogočila ustvarjanje zgoščene vrednosti glede na podatke in prejšnje zgoščene vrednosti. Knjižnico »bytes« bomo uvozili, ker jo bomo uporabljali.
  • Naslednji korak je ustvariti spremenljivko, imenovano podrobnosti, in uporabiti podatkovni tip bytes. Za povezovanje rezin bajtov bomo uporabili Join().

podrobnosti := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

Tukaj vzamemo 2D rezino bajtov, prenesemo c.Data in prejšnji hash. Nato bomo združili prazno rezino bajtov. 

  • Po tem ustvarjamo dejansko zgoščevanje s pomočjo funkcije zgoščevanja sum256 za podrobnosti. To lahko uporabimo, saj bomo uvozili knjižnico sha256. 
  • Nato ustvarjeni hash potisnemo v polje Hash za blok. 

func BuildBlock (podatkovni niz, prevHash [] bajt) *Cryptoblock {

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

block.BuildHash()

povratni blok

  • Zdaj bomo zgradili funkcijo, ki omogoča ustvarjanje bloka. Funkcija sprejme niz podatkov kot vhod, prevHash iz prejšnjega bloka kot vhod in nato izda referenco na Cryptoblock. Blok bomo zgradili s konstruktorjem blokov. 
  • &Cryptoblock deluje kot sklic na blok. Za polje Hash vključimo prazno rezino bajtov. Za podatkovno polje vzamemo podatkovni niz in ga pretvorimo v rezino bajtov. In vključimo prevHash v polje PrevHash. 
  • Na koncu pokličemo BuildHash() za blok in vrnemo blok. 

tip BlockChain struct {

bloki []*Kriptoblok

}

  • Zahtevana je vrsta, ki bo pomagala pri izražanju verige blokov. In uvedli smo strukturo, da bi to dosegli. Struktura tipa BlockChain je sestavljena iz niza kazalcev na Cryptoblock.

func (veriga *BlockChain) AddBlock(podatkovni niz) {

prevBlock := chain.blocks[len(chain.blocks)-1]

novo := BuildBlock(data, prevBlock.Hash)

veriga.bloki = dodaj(veriga.bloki, novo)

}

  • Tukaj ustvarjamo metodo, ki nam omogoča pridružitev bloka v verigo. Metoda pridobi kazalec verige blokov. Po tem sprejme podatkovni niz. 
  • Če pokličemo chain.blocks, pridemo do prejšnjega bloka v verigi blokov. Nato smo posredovali dolžino verige blokov [len(chain.blocks)-1].
  • V novi spremenljivki kličemo funkcijo BuildBlock in posredujemo podatkovni niz in prevBlock.Hash.
  • Z uporabo funkcije dodajanja in dodajanjem tega v verigo blokov (chain.blocks) nato dodamo nov blok v verigo blokov.

func Inception() *Cryptoblock {

return BuildBlock(“Začetek”, []byte{})

}

  • Naslednji korak je ustvariti funkcijo z imenom Inception, ki bo opisala prvi blok verige blokov. In vrnili bomo nov BuildBlock v funkciji, skupaj s podatki v prvem bloku. Tukaj. Vključil sem »Inception« in rezino bajtov, ki predstavlja prazen prejšnji razpršitev. 

func InitBlockChain() *BlockChain {

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

}

  • Da bi ustvaril prvo verigo blokov, sem uvedel funkcijo InitBlockChain. Tukaj samo vračam določeno sklicevanje na BlockChain. Nato zgradimo matriko Cryptoblock, kjer pokličemo funkcijo Inception. 

func main() {

veriga := InitBlockChain()

veriga.AddBlock(“Prvi blok po začetku”)

veriga.AddBlock(“Drugi blok po začetku”)

veriga.AddBlock(“Tretji blok po začetku”)

za _, blok := obseg veriga.bloki {

fmt.Printf(“Prejšnji razpršitev: %x\n”, block.PrevHash)

fmt.Printf(“Podatki v bloku: %s\n”, block.Data)

fmt.Printf(“Zgoščena vrednost: %x\n”, block.Hash)

}

}

  • Končno smo prispeli do glavne funkcije. Kot lahko vidite, smo poklicali InitBlockChain() in ga dodelili spremenljivki verige. 
  • Nato dodajamo bloke v verigo prek chain.AddBlock in posredujemo potrebne podatke. 
  • Po tem zaženemo zanko for, da preverimo verigo blokov. Nato izločimo vsak blok in natisnemo polja znotraj vsakega bloka. Vtipkamo samo:

fmt.Printf(“Prejšnji razpršitev: %x\n”, block.PrevHash)

fmt.Printf(“Podatki v bloku: %s\n”, block.Data)

fmt.Printf(“Zgoščena vrednost: %x\n”, block.Hash)

izhod: 

Torej lahko rečemo, da je program uspešen. Upam, da ste lahko razumeli implementacijo koncepta blockchain v Golangu. Samo še naprej vadite in kos boste zapletenim projektom. 

Vaša kripto si zasluži najboljšo varnost. Pridobite Strojna denarnica Ledger za samo 79 $!

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