Rakenna lohkoketju Golangiin tyhjästä

Tässä artikkelissa keskitymme Go-lohkoketjun kehittämiseen tyhjästä. Ennen kuin aloitamme, sinun tulee kuitenkin olla varma, että tunnet Golangin peruskäsitteet. Jos ei, niin on viisasta käydä läpi alustavat käsitteet ja palata sitten lohkoketjuun. 

Joten mennään suoraan aiheeseen. 

Aloitetaan uudesta hakemistosta 

Aluksi rakennamme uuden hakemiston. Oletetaan, että tämän hakemiston nimi on "blockchain". Kirjoitamme koodin komentokehotteeseen (tai jos käytät macOS:ää tai Linuxia, sinun on käytettävä päätettä). Joten kirjoitamme:

cd go-työtila 

mkdir lohkoketju 

cd lohkoketju 

koodi.

Kun VS-koodi avautuu, luomme komentokehotteeseen Go-moduulin. Miten se tehdään? No, kirjoitamme:

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

Koodaus main.gossa 

Seuraavaksi luomme Go-lähdetiedoston nimeltä "main.go" ja kirjoitamme koodin siihen. Mutta ensin ymmärrämme, mitä blockchain on. A blockchain voidaan määritellä julkiseksi tietokannaksi, joka on hajautettu ja hajautettu useiden vertaisyritysten kesken. Lohkoketju mahdollistaa tietokannan itsekorjauksen, vaikka solmu tuottaisi epätarkkoja tietoja. 

Yleensä lohkoketjun lohko koostuu tietokannassa jakamistamme tiedoista, tiivisteestä ja edellisen lohkon kryptografisesta tiivisteestä. 

 Joten, oletko valmis Mene lohkoketjun kehittämiseen? Loistava! Aloitetaan. 

Ohjelmointi osa 

Tässä osiossa tarkastellaan main.go-tiedostoa. 

paketin pää

tuonti (

"tavua"

"crypto/sha256" 

"Fmt" 

)

type Cryptoblock struct {

Hash [] tavu 

Data [] tavu 

PrevHash [] tavu 

}

  • Kuten näet, rakenne on vain luotu. 

func (c *Cryptblock) BuildHash() {

tiedot := tavua.Liity([][] tavu{c.Data, c.PrevHash}, []tavu{}) 

hash := sha256.Sum256(yksityiskohdat)

c.Hash = hash[ : ]

}

  • Rakennamme nyt menetelmän, jonka avulla voimme luoda tiivisteen datasta ja edellisestä tiivisteestä riippuen. Tuomme "tavujen" kirjaston, koska käytämme sitä.
  • Seuraava askel on luoda muuttuja nimeltä Details ja käyttää tietotyypin tavuja. Käytämme Join()-toimintoa tavuviipaleiden yhdistämiseen.

tiedot := tavua.Liity([][] tavu{c.Data, c.PrevHash}, []tavu{}) 

Tässä otamme 2D-osion tavuista, lähetämme c.Data ja edellinen hash. Sitten yhdistämme tyhjät tavut. 

  • Tämän jälkeen luomme varsinaista tiivistettä ottamalla avuksi sum256 hajautustoiminto yksityiskohtiin. Voimme käyttää tätä, kun tuomme sha256-kirjaston. 
  • Seuraavaksi työnnämme luodun tiivisteen lohkon Hash-kenttään. 

func BuildBlock (tietomerkkijono, prevHash [] tavu) *Cryptoblock {

block := &Salauslohko{[]tavu{}, []tavu(data), prevHash}

block.BuildHash()

paluulohko

  • Rakennamme nyt toiminnon, joka mahdollistaa Blockin luomisen. Funktio hyväksyy syötteeksi tietojonon, syötteeksi edellisen lohkon prevHash ja tulostaa sitten viittauksen Cryptoblockiin. Rakennamme lohkon lohkokonstruktorilla. 
  • &Cryptblock toimii viitteenä lohkoon. Hash-kenttään sisällytämme tyhjän osan tavuja. Data-kentässä otamme tietomerkkijonon ja muunnamme sen tavuiksi. Ja sisällytämme prevHash-kenttään PrevHash-kenttään. 
  • Lopuksi kutsumme lohkon BuildHash()-funktiota ja palautamme lohkon. 

kirjoita BlockChain struct {

lohkot []*Cryptblock

}

  • Tarvitaan tyyppi, joka auttaa lohkoketjun ilmaisemisessa. Ja toteutimme rakenteen tämän saavuttamiseksi. BlockChain-tyyppinen rakenne koostuu joukosta osoittimia Cryptoblockiin.

func (ketju *BlockChain) AddBlock(datamerkkijono) {

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

uusi := BuildBlock(data, prevBlock.Hash)

chain.blocks = liitä(ketju.lohkot, uusi)

}

  • Tässä luomme menetelmän, jonka avulla voimme liittää lohkon ketjuun. Menetelmä hakee blockchain-osoittimen. Tämän jälkeen se hyväksyy datamerkkijonon. 
  • Kutsumalla chain.blocks pääsemme lohkoketjun edelliseen lohkoon. Seuraavaksi ohitimme lohkoketjun pituuden [len(chain.blocks)-1].
  • Uudessa muuttujassa kutsumme BuildBlock-funktiota ja välitämme datamerkkijonon ja prevBlock.Hash.
  • Hyödyntämällä append-toimintoa, lisäämällä tämä ketju.lohkoihin, liitämme sitten uuden lohkon lohkoketjuun.

func Inception() *Cryptblock {

palauttaa BuildBlock("Alku", []tavu{})

}

  • Seuraava askel on luoda Inception-niminen funktio, joka kuvaa lohkoketjun ensimmäisen lohkon. Ja palautamme funktioon uuden BuildBlockin ensimmäisen lohkon tietojen kanssa. Tässä. Olen sisällyttänyt "Inception" ja siivu tavuja, joka edustaa tyhjää edellistä hash. 

func InitBlockChain() *BlockChain {

palauta &BlockChain{[]*Cryptblock{Alku()}}

}

  • Ensimmäisen lohkoketjun luomiseksi olen ottanut käyttöön InitBlockChain-toiminnon. Tässä palautan vain erityisen viittauksen BlockChainiin. Seuraavaksi rakennamme Cryptoblock-joukon, jossa kutsumme Inception-toimintoa. 

func main() {

ketju := InitBlockChain()

chain.AddBlock("Ensimmäinen lohko aloittamisen jälkeen"

chain.AddBlock("Toinen lohko aloittamisen jälkeen")

chain.AddBlock ("Kolmas lohko aloittamisen jälkeen")

for _, block := range chain.blocks {

fmt.Printf("Edellinen hajautus: %x\n", block.PrevHash)

fmt.Printf("Data lohkossa: %s\n", block.Data)

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

}

}

  • Lopulta olemme päässeet päätoimintoon. Kuten näet, olemme kutsuneet InitBlockChain() -funktiota ja olemme osoittaneet sen ketjumuuttujalle. 
  • Seuraavaksi lisäämme lohkoja ketjuun chain.AddBlockin kautta ja välitämme tarvittavat tiedot. 
  • Tämän jälkeen suoritamme for-silmukan lohkoketjun tarkistamiseksi. Sitten erottelemme jokaisen lohkon ja tulostamme kentät jokaisen lohkon sisään. Kirjoitamme vain:

fmt.Printf("Edellinen hajautus: %x\n", block.PrevHash)

fmt.Printf("Data lohkossa: %s\n", block.Data)

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

lähtö: 

Voimme siis sanoa, että ohjelma on onnistunut. Toivon, että pystyit ymmärtämään lohkoketjun konseptin toteutuksen Golangissa. Jatka vain harjoittelua, niin pystyt käsittelemään monimutkaisia ​​projekteja. 

Kryptosi ansaitsee parhaan turvallisuuden. Saada Ledger-laitteistolompakko vain 79 dollarilla!

Lähde: https://coinfomania.com/build-a-blockchain-in-golang/