Vybudujte blockchain v Golang od nuly

V tomto článku se zaměříme na vývoj Go blockchainu od nuly. Než však začneme, měli byste si být jisti, že jste obeznámeni se základními pojmy v Golangu. Pokud ne, pak je moudré, když si projdete předběžné koncepty a pak se vrátíte k blockchainu. 

Pojďme tedy rovnou k tématu. 

Počínaje Novým adresářem 

Pro začátek vytvoříme nový adresář. Předpokládejme, že tento adresář má název „blockchain“. Kód napíšeme do příkazového řádku (nebo pokud používáte macOS nebo Linux, musíte použít terminál). Zadáme tedy:

cd go-pracovní prostor 

blockchain mkdir 

cd blockchain 

kód .

Jakmile se otevře VS Code, vytvoříme v příkazovém řádku modul Go. jak to uděláme? No, píšeme:

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

Kódování v main.go 

Dále vytvoříme zdrojový soubor Go s názvem 'main.go' a napíšeme do něj kód. Nejprve si ale ujasněme, co je blockchain. A blockchain lze definovat jako veřejnou databázi, která je decentralizovaná a distribuovaná mezi několik vrstevníků. Blockchain umožňuje databázi samoopravovat se, i když uzel produkuje nepřesná data. 

Obvykle se blok na blockchainu skládá z dat, která sdílíme v databázi, hash a kryptografického hashe předchozího bloku. 

 Takže jste připraveni Pusťte se do vývoje blockchainu? Skvělý! Začněme. 

Programovací část 

V této části se podíváme do souboru main.go. 

hlavní balíček

import(

"bajty"

"crypto/sha256" 

"Fmt" 

)

zadejte Cryptoblock struct {

Hash [] bajt 

Data [] bajt 

PrevHash [] bajt 

}

  • Jak vidíte, struktura byla pouze vytvořena. 

func (c *Cryptoblock) BuildHash() {

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

hash := sha256.Sum256(podrobnosti)

c.Hash = hash[:]

}

  • Nyní zkonstruujeme metodu, která nám umožní generovat hash v závislosti na datech a předchozím hashe. Knihovnu „bajtů“ importujeme, protože ji budeme používat.
  • Dalším krokem je vytvoření proměnné s názvem detaily a použití datového typu bajty. Ke spojení řezů bajtů použijeme Join().

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

Zde bereme 2D řez bajtů, přenášíme c.Data a předchozí hash. Poté spojíme prázdný plátek bajtů. 

  • Následně vytváříme skutečný hash pomocí hašovací funkce sum256 na detailech. Můžeme to použít, protože budeme importovat knihovnu sha256. 
  • Dále vložíme vytvořený hash do pole Hash pro blok. 

func BuildBlock (datový řetězec, prevHash [] bajt) *Cryptoblock {

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

block.BuildHash()

návratový blok

  • Nyní vytvoříme funkci, která umožní vytvoření bloku. Funkce přijímá řetězec dat jako vstup, prevHash z předchozího bloku jako vstup a poté vypíše odkaz na Cryptoblock. Blok sestavíme pomocí konstruktoru bloků. 
  • &Cryptoblock funguje jako odkaz na blok. Pro pole Hash začleníme prázdný výsek bajtů. U datového pole vezmeme datový řetězec a převedeme ho na výseč bajtů. A začleňujeme prevHash do pole PrevHash. 
  • Nakonec zavoláme BuildHash() na bloku a vrátíme blok. 

zadejte BlockChain struct {

bloky []*Kryptoblok

}

  • Je vyžadován typ, který pomůže vyjádřit blockchain. A implementovali jsme strukturu, abychom toho dosáhli. Struktura typu BlockChain se skládá z pole ukazatelů na Cryptoblock.

func (řetězec *BlockChain) AddBlock(datový řetězec) {

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

new := BuildBlock(data, prevBlock.Hash)

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

}

  • Zde vytváříme metodu, která nám umožní připojit blok k řetězu. Metoda načte ukazatel blockchainu. Poté přijme datový řetězec. 
  • Voláním chain.blocks se dostaneme k předchozímu bloku v blockchainu. Dále jsme prošli délkou blockchainu [len(chain.blocks)-1].
  • V nové proměnné voláme funkci BuildBlock a předáváme datový řetězec a prevBlock.Hash.
  • Využitím funkce append, přidáním tohoto do chain.blocks, pak připojíme nový blok k blockchainu.

func Inception() *Cryptoblock {

return BuildBlock(“Počátek”, []byte{})

}

  • Dalším krokem je vytvoření funkce nazvané Inception, která bude popisovat první blok blockchainu. A ve funkci vrátíme nový BuildBlock spolu s daty v prvním bloku. Tady. Začlenil jsem „Počátek“ a část bajtů, která představuje prázdný předchozí hash. 

func InitBlockChain() *BlockChain {

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

}

  • Za účelem vytvoření prvního blockchainu jsem zavedl funkci InitBlockChain. Zde právě vracím konkrétní odkaz na BlockChain. Dále sestavíme pole Cryptoblock, kde zavoláme funkci Inception. 

func main () {

řetěz := InitBlockChain()

chain.AddBlock(“První blok po založení”)

chain.AddBlock(“Druhý blok po založení”)

chain.AddBlock(“Třetí blok po založení”)

for _, block := range chain.blocks {

fmt.Printf(“Předchozí hash: %x\n”, block.PrevHash)

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

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

}

}

  • Konečně jsme se dostali k hlavní funkci. Jak můžete vidět, zavolali jsme InitBlockChain() a přiřadili jsme ji proměnné řetězce. 
  • Dále přidáváme bloky do řetězce přes chain.AddBlock a předáváme potřebná data. 
  • Poté spustíme smyčku for pro kontrolu blockchainu. Poté vybereme každý blok a vytiskneme pole uvnitř každého bloku. Prostě napíšeme:

fmt.Printf(“Předchozí hash: %x\n”, block.PrevHash)

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

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

Výstup: 

Můžeme tedy říci, že program je úspěšný. Doufám, že jste byli schopni pochopit implementaci konceptu blockchainu v Golangu. Pokračujte ve cvičení a budete schopni zvládnout složité projekty. 

Vaše kryptoměna si zaslouží to nejlepší zabezpečení. Dostat Hardwarová peněženka Ledger za pouhých 79 $!

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