Costruisci una Blockchain in Golang da zero

In questo articolo, ci concentreremo sullo sviluppo della blockchain Go da zero. Tuttavia, prima di iniziare, dovresti essere sicuro di avere familiarità con i concetti di base di Golang. In caso contrario, è saggio esaminare i concetti preliminari e poi tornare alla blockchain. 

Allora, veniamo subito all'argomento. 

A partire da una nuova directory 

Costruiremo una nuova directory per cominciare. Assumiamo che questa directory abbia il nome "blockchain". Digiteremo il codice nel prompt dei comandi (o se stai usando macOS o Linux, devi usare il Terminale). Quindi digitiamo:

cd go-spazio di lavoro 

blockchain mkdir 

blockchain 

codice .

Quando si apre il codice VS, creeremo un modulo Go nel prompt dei comandi. Come lo facciamo? Bene, digitiamo:

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

Codifica in main.go 

Successivamente, creeremo un file sorgente Go chiamato 'main.go' e digiteremo il codice al suo interno. Ma prima cerchiamo di capire cos'è la blockchain. UN blockchain può essere definito come un database pubblico decentralizzato e distribuito tra più peer. Blockchain consente al database di correggersi automaticamente, anche se un nodo sta producendo dati imprecisi. 

Di solito, un blocco su una blockchain è costituito dai dati che condividiamo nel database, un hash e l'hash crittografico del blocco precedente. 

 Allora, sei pronto per Vai allo sviluppo blockchain? Grande! Iniziamo. 

Parte di programmazione 

In questa sezione esamineremo il file main.go. 

pacchetto principale

importazione (

"byte"

"cripto/sha256" 

"Fmt" 

)

tipo struttura Cryptoblock {

Hash [] byte 

Dati [] byte 

PrevHash [] byte 

}

  • Come puoi vedere, è stata solo creata una struttura. 

funz (c *Cryptoblock) BuildHash() {

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

hash := sha256.Sum256(dettagli)

c.Hash = hash[ : ]

}

  • Costruiremo ora un metodo che ci consentirà di generare un hash a seconda dei dati e dell'hash precedente. Importeremo la libreria "bytes" perché la useremo.
  • Il passaggio successivo consiste nel creare una variabile denominata dettagli e utilizzare il tipo di dati byte. Useremo Join() per connettere le fette di byte.

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

Qui prendiamo una porzione 2D di byte, trasmettiamo il c.Data e l'hash precedente. Quindi combineremo la fetta di byte vuota. 

  • Successivamente, stiamo creando l'hash effettivo prendendo l'aiuto della funzione di hashing sum256 sui dettagli. Possiamo usarlo mentre importeremo la libreria sha256. 
  • Successivamente, inseriamo l'hash creato nel campo Hash per il blocco. 

func BuildBlock (stringa di dati, prevHash [] byte) *Cryptoblock {

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

block.BuildHash()

blocco di ritorno

  • Creeremo ora una funzione che abilita la creazione di Block. La funzione accetta una stringa di dati come input, prevHash dal blocco precedente come input e quindi restituisce un riferimento a Cryptoblock. Costruiremo il blocco usando il costruttore di blocchi. 
  • Il &Cryptoblock funge da riferimento al blocco. Per il campo Hash, incorporiamo una porzione vuota di byte. Per Campo dati, prendiamo la stringa di dati e la convertiamo in una fetta di byte. E incorporiamo prevHash nel campo PrevHash. 
  • Infine, chiamiamo BuildHash() sul blocco e restituiamo il blocco. 

digita BlockChain struct {

blocca []*Criptoblocco

}

  • È richiesto un tipo che aiuti ad esprimere la blockchain. E abbiamo implementato una struttura per raggiungere questo obiettivo. La struttura di tipo BlockChain è composta da un array di puntatori a Cryptoblock.

func (catena *BlockChain) AddBlock (stringa di dati) {

prevBlock := catena.blocchi[len(catena.blocchi)-1]

nuovo := BuildBlock(dati, prevBlock.Hash)

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

}

  • Qui stiamo creando un metodo che ci consente di unire un blocco alla catena. Il metodo recupera il puntatore blockchain. Successivamente, accetta una stringa di dati. 
  • Chiamando chain.blocks, arriviamo al blocco precedente nella blockchain. Successivamente, abbiamo superato la lunghezza della blockchain [len(chain.blocks)-1].
  • Nella nuova variabile, chiamiamo la funzione BuildBlock e passiamo la stringa di dati e prevBlock.Hash.
  • Utilizzando la funzione append, aggiungendola a chain.blocks, alleghiamo quindi il nuovo blocco alla blockchain.

funz Inception() *Cryptoblock {

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

}

  • Il prossimo passo è creare una funzione chiamata Inception che descriverà il primo blocco della blockchain. E restituiremo un nuovo BuildBlock nella funzione, insieme ai dati nel primo blocco. Qui. Ho incorporato "Inception" e una fetta di byte che rappresenta un hash precedente vuoto. 

funz InitBlockChain() *BlockChain {

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

}

  • Per creare la prima blockchain, ho introdotto la funzione InitBlockChain. Qui sto solo restituendo il riferimento particolare alla BlockChain. Successivamente, costruiamo un array di Cryptoblock, dove effettuiamo una chiamata alla funzione Inception. 

funzione principale() {

catena := InitBlockChain()

chain.AddBlock ("Primo blocco dopo l'inizio")

chain.AddBlock ("Secondo blocco dopo l'inizio")

chain.AddBlock ("Terzo blocco dopo l'inizio")

per _, blocco := intervallo catena.blocchi {

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

fmt.Printf("Dati nel blocco: %s\n", block.Data)

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

}

}

  • Finalmente siamo arrivati ​​alla funzione principale. Come puoi vedere abbiamo chiamato InitBlockChain() e l'abbiamo assegnata alla variabile chain. 
  • Successivamente, stiamo aggiungendo blocchi alla catena tramite chain.AddBlock e passiamo i dati necessari. 
  • Successivamente, eseguiamo un ciclo for per verificare la blockchain. Quindi individuiamo ogni blocco e stampiamo i campi all'interno di ogni blocco. Digitiamo solo:

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

fmt.Printf("Dati nel blocco: %s\n", block.Data)

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

Produzione: 

Quindi, possiamo dire che il programma ha successo. Spero che tu sia stato in grado di capire l'implementazione del concetto di blockchain in Golang. Continua a esercitarti e sarai in grado di gestire progetti complessi. 

La tua cripto merita la migliore sicurezza. Prendi un Portafoglio hardware Ledger per soli $ 79!

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