Bygg en blockkedja i Golang från grunden

I den här artikeln kommer vi att fokusera på Go blockchain-utveckling från grunden. Men innan vi sätter igång bör du vara säker på att du är bekant med de grundläggande begreppen i Golang. Om inte, så är det klokt om du går igenom de preliminära koncepten och sedan kommer tillbaka till blockchain. 

Så låt oss gå direkt till ämnet. 

Börjar med en ny katalog 

Vi kommer att bygga en ny katalog till att börja med. Låt oss anta att den här katalogen har namnet "blockchain." Vi kommer att skriva koden i kommandotolken (eller om du använder macOS eller Linux måste du använda terminalen). Därför skriver vi:

cd go-workspace 

mkdir blockchain 

cd blockchain 

kod.

När VS-koden öppnas kommer vi att skapa en Go-modul i kommandotolken. Hur gör vi det? Tja, vi skriver:

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

Kodning i main.go 

Därefter kommer vi att skapa en Go-källfil med namnet 'main.go' och vi kommer att skriva in koden i den. Men låt oss först förstå vad blockchain är. A blockchain kan definieras som en offentlig databas som är decentraliserad och distribuerad mellan flera kollegor. Blockchain tillåter databasen att korrigera sig själv, även om en nod producerar felaktig data. 

Vanligtvis består ett block på en blockchain av data vi delar i databasen, en hash och föregående blocks kryptografiska hash. 

 Så, är du redo för Gå blockchain-utveckling? Bra! Låt oss börja. 

Programmeringsdel 

I det här avsnittet kommer vi att titta på filen main.go. 

paketets huvud

importera (

"bytes"

"crypto/sha256" 

"Fmt" 

)

typ Cryptoblock struct {

Hash [] byte 

Data [] byte 

PrevHash [] byte 

}

  • Som du kan se har en struktur bara skapats. 

func (c *Cryptoblock) BuildHash() {

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

hash := sha256.Sum256(detaljer)

c.Hash = hash[ : ]

}

  • Vi kommer nu att konstruera en metod som gör det möjligt för oss att generera en hash beroende på data och föregående hash. Vi kommer att importera "bytes"-biblioteket eftersom vi kommer att använda det.
  • Nästa steg är att skapa en variabel som heter detaljer och använda datatypen byte. Vi kommer att använda Join() för att koppla samman bitarna av byte.

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

Här tar vi en 2D-bit av bytes, vi överför c.Data och föregående hash. Sedan kommer vi att kombinera den tomma biten av byte. 

  • Efter detta skapar vi själva hashen med hjälp av sum256 hashfunktionen på detaljerna. Vi kan använda detta eftersom vi kommer att importera sha256-biblioteket. 
  • Därefter trycker vi in ​​den skapade hashen i Hash-fältet för blocket. 

func BuildBlock (datasträng, prevHash [] byte) *Cryptoblock {

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

block.BuildHash()

returblock

  • Vi kommer nu att bygga en funktion som möjliggör skapandet av Block. Funktionen accepterar en sträng med data som indata, prevHash från föregående block som indata och matar sedan ut en referens till Cryptoblock. Vi kommer att bygga blocket med blockkonstruktören. 
  • &Cryptoblocket fungerar som referens till blocket. För Hash-fältet inkluderar vi en tom bit byte. För datafält tar vi datasträngen och konverterar den till en bit av byte. Och vi införlivar prevHash i PrevHash-fältet. 
  • Till sist anropar vi BuildHash() på blocket och vi returnerar blocket. 

typ BlockChain struct {

block []*Kryptoblock

}

  • En typ som hjälper till att uttrycka blockkedjan krävs. Och vi implementerade en struktur för att åstadkomma detta. Typen BlockChain-struktur består av en rad pekare till Cryptoblock.

func (kedja *BlockChain) AddBlock(datasträng) {

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

new := BuildBlock(data, prevBlock.Hash)

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

}

  • Här skapar vi en metod som gör att vi kan ansluta ett block till kedjan. Metoden hämtar blockchain-pekaren. Efter detta accepterar den en datasträng. 
  • Genom att kalla chain.blocks kommer vi till föregående block i blockkedjan. Därefter passerade vi blockkedjans längd [len(chain.blocks)-1].
  • I den nya variabeln anropar vi BuildBlock-funktionen och vi skickar datasträng och prevBlock.Hash.
  • Genom att använda append-funktionen, lägga till denna i chain.blocks, kopplar vi sedan det nya blocket till blockchain.

func Inception() *Cryptoblock {

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

}

  • Nästa steg är att skapa en funktion som heter Inception som ska beskriva blockkedjans första block. Och vi kommer att returnera ett nytt BuildBlock i funktionen, tillsammans med data i det första blocket. Här. Jag har införlivat "Inception" och en bit byte som representerar en tom tidigare hash. 

func InitBlockChain() *BlockChain {

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

}

  • För att skapa den första blockkedjan har jag introducerat funktionen InitBlockChain. Här återvänder jag bara den specifika hänvisningen till BlockChain. Därefter bygger vi en array av Cryptoblock, där vi gör ett anrop till Inception-funktionen. 

func main () {

kedja := InitBlockChain()

chain.AddBlock(“Första blocket efter start”)

chain.AddBlock(”Andra blocket efter start”)

chain.AddBlock(”Tredje blocket efter start”)

för _, block := range chain.blocks {

fmt.Printf(“Föregående Hash: %x\n”, block.PrevHash)

fmt.Printf(“Data i block: %s\n”, block.Data)

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

}

}

  • Äntligen har vi kommit fram till huvudfunktionen. Som du kan se har vi kallat InitBlockChain() och vi har tilldelat den till kedjevariabeln. 
  • Därefter lägger vi till block i kedjan via chain.AddBlock, och vi skickar nödvändiga data. 
  • Efter detta kör vi en for-loop för att leta efter blockkedjan. Sedan pekar vi ut varje block och skriver ut fälten inuti varje block. Vi skriver bara:

fmt.Printf(“Föregående Hash: %x\n”, block.PrevHash)

fmt.Printf(“Data i block: %s\n”, block.Data)

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

Produktion: 

Så vi kan säga att programmet är framgångsrikt. Jag hoppas att du kunde förstå implementeringen av konceptet blockchain i Golang. Fortsätt bara att öva så kommer du att kunna hantera intrikata projekt. 

Din krypto förtjänar den bästa säkerheten. Få en Ledger hårdvara plånbok för bara $79!

Källa: https://coinfomania.com/build-a-blockchain-in-golang/