Izgradite Blockchain u Golangu od nule

U ovom ćemo se članku usredotočiti na razvoj Go blockchaina od nule. Međutim, prije nego što počnemo, trebali biste biti sigurni da ste upoznati s osnovnim konceptima u Golangu. Ako ne, onda je mudro da prođete kroz preliminarne koncepte i zatim se vratite na blockchain. 

Dakle, prijeđimo odmah na temu. 

Počinjanje s novim imenikom 

Za početak ćemo napraviti novi imenik. Pretpostavimo da ovaj direktorij ima naziv "blockchain". Ukucat ćemo kod u Command Prompt (ili ako koristite macOS ili Linux, morate koristiti Terminal). Dakle, upisujemo:

cd go-radni prostor 

mkdir blockchain 

cd blockchain 

šifra .

Kako se VS kod otvara, kreirat ćemo Go modul u naredbenom retku. Kako to činimo? Pa upisujemo:

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

Kodiranje u main.go 

Zatim ćemo kreirati Go izvornu datoteku pod nazivom 'main.go' i u nju ćemo upisati kod. Ali prvo da shvatimo što je blockchain. A blockchain može se definirati kao javna baza podataka koja je decentralizirana i distribuirana među nekoliko ravnopravnih baza. Blockchain omogućuje samoispravljanje baze podataka, čak i ako čvor proizvodi netočne podatke. 

Obično se blok na blockchainu sastoji od podataka koje dijelimo u bazi podataka, hasha i kriptografskog hasha prethodnog bloka. 

 Dakle, jeste li spremni za Krenite u razvoj blockchaina? Sjajno! Započnimo. 

Dio programiranja 

U ovom odjeljku pogledat ćemo datoteku main.go. 

paket glavni

uvoz (

"bajtovi"

“kripto/sha256” 

“fmt” 

)

tip Cryptoblock struct {

Hash [] bajt 

Podaci [] bajt 

PrevHash [] bajt 

}

  • Kao što vidite, samo je stvorena struktura. 

func (c *Cryptoblock) BuildHash() {

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

hash := sha256.Sum256(detalji)

c.Hash = hash[ : ]

}

  • Sada ćemo konstruirati metodu koja će nam omogućiti generiranje hash-a ovisno o podacima i prethodnom hash-u. Uvest ćemo biblioteku “bajtova” jer ćemo je koristiti.
  • Sljedeći korak je stvaranje varijable pod nazivom detalji i korištenje tipa podataka bajtova. Koristit ćemo Join() za povezivanje isječaka bajtova.

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

Ovdje uzimamo 2D isječak bajtova, prenosimo c.Data i prethodni hash. Zatim ćemo spojiti prazan isječak bajtova. 

  • Nakon toga, stvaramo stvarni hash uz pomoć funkcije raspršivanja sum256 na detaljima. Ovo možemo koristiti jer ćemo uvesti biblioteku sha256. 
  • Zatim guramo kreirani hash u polje Hash za blok. 

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

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

blok.BuildHash()

povratni blok

  • Sada ćemo izgraditi funkciju koja omogućuje stvaranje bloka. Funkcija prihvaća niz podataka kao ulaz, prevHash iz prethodnog bloka kao ulaz, a zatim šalje referencu na Cryptoblock. Blok ćemo izgraditi pomoću blok konstruktora. 
  • &Cryptoblock djeluje kao referenca na blok. Za Hash polje uključujemo prazan isječak bajtova. Za podatkovno polje uzimamo podatkovni niz i pretvaramo ga u isječak bajtova. I inkorporiramo prevHash u PrevHash polje. 
  • Na kraju, pozivamo BuildHash() na bloku i vraćamo blok. 

tip BlockChain struct {

blokovi []*Kriptoblok

}

  • Potrebna je vrsta koja će pomoći u izražavanju blockchaina. I implementirali smo strukturu da to postignemo. Struktura tipa BlockChain sastoji se od niza pokazivača na Cryptoblock.

func (lanac *BlockChain) AddBlock(niz podataka) {

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

novo := BuildBlock(data, prevBlock.Hash)

chain.blocks = dodati(chain.blocks, novo)

}

  • Ovdje stvaramo metodu koja nam omogućuje pridruživanje bloka lancu. Metoda dohvaća pokazivač blockchaina. Nakon toga prihvaća podatkovni niz. 
  • Pozivanjem chain.blocks dolazimo do prethodnog bloka u blockchainu. Zatim smo proslijedili duljinu blockchaina [len(chain.blocks)-1].
  • U novoj varijabli pozivamo funkciju BuildBlock i prosljeđujemo niz podataka i prevBlock.Hash.
  • Korištenjem funkcije dodavanja, dodavanjem ovog u chain.blocks, zatim prilažemo novi blok u blockchain.

func Inception() *Cryptoblock {

return BuildBlock(“Početak”, []bajt{})

}

  • Sljedeći korak je stvaranje funkcije pod nazivom Inception koja će opisati prvi blok blockchaina. Vratit ćemo novi BuildBlock u funkciji, zajedno s podacima u prvom bloku. Ovdje. Uključio sam "Inception" i dio bajtova koji predstavlja prazan prethodni hash. 

func InitBlockChain() *BlockChain {

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

}

  • Kako bih stvorio prvi blockchain, uveo sam funkciju InitBlockChain. Ovdje samo vraćam konkretnu referencu na BlockChain. Zatim gradimo polje Cryptoblock, gdje pozivamo funkciju Inception. 

funkcija main() {

lanac := InitBlockChain()

chain.AddBlock(“Prvi blok nakon pokretanja”)

chain.AddBlock(“Drugi blok nakon pokretanja”)

chain.AddBlock(“Treći blok nakon početka”)

za _, block := range chain.blocks {

fmt.Printf(“Prethodni hash: %x\n”, block.PrevHash)

fmt.Printf(“Podaci u bloku: %s\n”, blok.Podaci)

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

}

}

  • Konačno smo stigli do glavne funkcije. Kao što vidite, pozvali smo InitBlockChain() i dodijelili smo ga varijabli lanca. 
  • Zatim dodajemo blokove u lanac putem chain.AddBlock i prosljeđujemo potrebne podatke. 
  • Nakon toga pokrećemo for petlju za provjeru blockchaina. Zatim izdvajamo svaki blok i ispisujemo polja unutar svakog bloka. Samo upisujemo:

fmt.Printf(“Prethodni hash: %x\n”, block.PrevHash)

fmt.Printf(“Podaci u bloku: %s\n”, blok.Podaci)

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

Izlaz: 

Dakle, možemo reći da je program uspješan. Nadam se da ste uspjeli razumjeti implementaciju koncepta blockchaina u Golangu. Samo nastavite vježbati i moći ćete se nositi sa zamršenim projektima. 

Vaša kriptovaluta zaslužuje najbolju sigurnost. Dobiti Ledger hardverski novčanik za samo 79 USD!

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