Baut e Blockchain zu Golang vun Null

An dësem Artikel konzentréiere mir eis op Go Blockchain Entwécklung vun Null. Wéi och ëmmer, ier mer ufänken, sollt Dir sécher sinn datt Dir mat de Basiskonzepter am Golang vertraut sidd. Wann net, dann ass et schlau wann Dir duerch déi virleefeg Konzepter gitt an dann zréck op Blockchain kënnt. 

Also, loosst eis direkt op d'Thema kommen. 

Start mat engem neie Verzeechnes 

Mir bauen en neie Verzeechnes fir unzefänken. Loosst eis unhuelen datt dësen Verzeichnis den Numm "Blockchain" huet. Mir schreiwen de Code an der Command Prompt (oder wann Dir macOS oder Linux benotzt, musst Dir den Terminal benotzen). Also schreiwen mir:

cd go-workspace 

mkdir blockchain 

cd blockchain 

code.

Wéi de VS Code opmaacht, kreéiere mir e Go Modul an der Command Prompt. Wéi maache mir dat? Gutt, mir schreiwen:

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

Kodéierung an main.go 

Als nächst wäerte mir eng Go Quelldatei mam Numm 'main.go' erstellen a mir schreiwen de Code dran. Awer loosst eis als éischt verstoen wat Blockchain ass. A blockchain kann als ëffentlech Datebank definéiert ginn, déi dezentraliséiert ass a verdeelt tëscht verschiddene Kollegen. Blockchain erlaabt d'Datebank sech selwer ze korrigéieren, och wann en Node ongenau Daten produzéiert. 

Normalerweis besteet e Block op enger Blockchain aus Daten déi mir an der Datebank deelen, engem Hash, an dem Kryptografesche Hash vum fréiere Block. 

 Also, sidd Dir prett fir Gitt Blockchain Entwécklung? Super! Loosst eis ufänken. 

Programméiere Deel 

An dëser Sektioun wäerte mir an d'main.go Datei kucken. 

Haaptpak

importéieren (

"bytes"

"crypto/sha256" 

"fmt" 

)

Typ Cryptoblock struct {

Hash [] byte 

Daten [] byte 

PrevHash [] byte 

}

  • Wéi Dir gesitt, ass nëmmen e Struktur erstallt ginn. 

func (c *Cryptoblock) BuildHash() {

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

hash:= sha256.Sum256(details)

c.Hash = hash[ : ]

}

  • Mir wäerten elo eng Method konstruéieren déi et eis erlaabt en Hash ze generéieren ofhängeg vun den Daten an dem fréiere Hash. Mir wäerten d'"Bytes" Bibliothéik importéieren well mir se wäerte benotzen.
  • De nächste Schrëtt ass eng Variabel genannt Detailer ze kreéieren an d'Datentyp Bytes ze benotzen. Mir benotzen Join () fir d'Schecken vu Bytes ze verbannen.

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

Hei huelen mir eng 2D Slice vu Bytes, mir iwwerdroen d'c.Data an de fréiere Hash. Da wäerte mir déi eidel Slice vu Bytes kombinéieren. 

  • Duerno kreéiere mir den aktuellen Hash mat Hëllef vun der sum256 Hashing Funktioun op d'Detailer. Mir kënnen dëst benotzen wéi mir d'sha256 Bibliothéik importéieren. 
  • Als nächst drécke mir den erstallten Hash an den Hash Feld fir de Block. 

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

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

block.BuildHash()

zréck Block

  • Mir bauen elo eng Funktioun déi d'Schafung vum Block erméiglecht. D'Funktioun akzeptéiert e String vun Daten als Input, prevHash vum virege Block als Input, a gitt dann eng Referenz op Cryptoblock eraus. Mir bauen de Block mat dem Blockkonstruktor. 
  • De &Cryptoblock handelt als Referenz op de Block. Fir Hash Feld, integréiere mir eng eidel Slice vu Bytes. Fir Datefeld huelen mir d'Datenstring a konvertéieren se an Slice of Bytes. A mir integréieren prevHash an PrevHash Feld. 
  • Schlussendlech ruffe mir de BuildHash () um Block a mir ginn de Block zréck. 

Typ BlockChain Struktur {

blockéiert []*Cryptoblock

}

  • Eng Aart déi hëlleft beim Ausdrock vun der Blockchain ass erfuerderlech. A mir hunn e Struktur ëmgesat fir dëst z'erreechen. Den Typ BlockChain-Struk besteet aus enger ganzer Rei vu Pointer op Cryptoblock.

func (chain *BlockChain) AddBlock(Datenstring) {

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

nei := BuildBlock(Daten, prevBlock.Hash)

chain.blocks = append(chain.blocks, nei)

}

  • Hei kreéiere mir eng Method déi et eis erlaabt e Block an d'Kette ze verbannen. D'Method recuperéiert de Blockchain Pointer. Duerno akzeptéiert et eng Datestring. 
  • Calling chain.blocks, mir komme bei de fréiere Block am Blockchain. Als nächst hu mir d'Längt vun der Blockchain [len(chain.blocks)-1] passéiert.
  • An der neier Variabel ruffe mir d'BuildBlock Funktioun a mir passéieren d'Datenstring a prevBlock.Hash.
  • Andeems Dir d'Append Funktioun benotzt, dës an d'chain.blocks addéieren, befestigen mir dann den neie Block un d'Blockchain.

func Inception() *Cryptoblock {

return BuildBlock("Inception", []byte{})

}

  • De nächste Schrëtt ass eng Funktioun genannt Inception ze kreéieren déi den éischte Block vum Blockchain beschreiwen. A mir ginn en neie BuildBlock an der Funktioun zréck, zesumme mat den Daten am éischte Block. Hei. Ech hunn "Inception" an e Slice vu Bytes integréiert, déi en eidele fréiere Hash duerstellt. 

func InitBlockChain() *BlockChain {

zréck &BlockChain{[]*Cryptoblock{Inception()}}

}

  • Fir déi éischt Blockchain ze kreéieren, hunn ech d'InitBlockChain Funktioun agefouert. Hei ginn ech just déi speziell Referenz op de BlockChain zréck. Als nächst bauen mir eng Array vu Cryptoblock, wou mir en Uruff un d'Inception Funktioun maachen. 

func main () {

chain := InitBlockChain()

chain.AddBlock ("First Block after Inception")

chain.AddBlock ("Second Block after Inception")

chain.AddBlock ("Drëtt Block nom Ufank")

fir _, blockéieren := range chain.blocks {

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

fmt.Printf(“Daten am Block: %s\n”, block.Data)

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

}

}

  • Endlech si mer bei der Haaptfunktioun ukomm. Wéi Dir gesitt, hu mir den InitBlockChain () genannt a mir hunn et un d'Kettevariabel zougewisen. 
  • Als nächst addéiere mir Blocken an d'Kette iwwer Kette.AddBlock, a mir passéieren déi néideg Donnéeën. 
  • Duerno lafe mir e For Loop fir de Blockchain ze kontrolléieren. Da maache mir all Block eraus a drécken d'Felder an all Block aus. Mir schreiwen just:

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

fmt.Printf(“Daten am Block: %s\n”, block.Data)

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

Ausgab: 

Also kënne mir soen datt de Programm erfollegräich ass. Ech hoffen Dir konnt d'Ëmsetzung vum Konzept vu Blockchain zu Golang verstoen. Fuert just weider ze üben an Dir wäert fäeg sinn komplizéiert Projeten ze handhaben. 

Är Krypto verdéngt déi bescht Sécherheet. Kréien a Ledger Hardware Portemonnaie fir nëmmen $ 79!

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