Zbuduj Blockchain w Golang od podstaw

W tym artykule skupimy się na rozwoju blockchain Go od podstaw. Zanim jednak zaczniemy, upewnij się, że znasz podstawowe pojęcia w Golangu. Jeśli nie, dobrze jest, jeśli przejdziesz przez wstępne koncepcje, a następnie wrócisz do blockchain. 

Przejdźmy więc od razu do tematu. 

Zaczynając od nowego katalogu 

Na początek zbudujemy nowy katalog. Załóżmy, że ten katalog ma nazwę „blockchain”. Wpiszemy kod w wierszu polecenia (lub jeśli używasz macOS lub Linux, musisz użyć Terminala). Tak więc wpisujemy:

cd go-obszar roboczy 

mkdir blockchain 

Blockchain CD 

kod .

Po otwarciu VS Code utworzymy moduł Go w wierszu polecenia. Jak to robimy? Cóż, wpisujemy:

przejdź mod init github.com/golang-company/blockchain

Kodowanie w main.go 

Następnie utworzymy plik źródłowy Go o nazwie „main.go” i wpiszemy w nim kod. Ale najpierw zrozummy, czym jest blockchain. A blockchain można zdefiniować jako publiczną bazę danych, która jest zdecentralizowana i rozproszona wśród kilku partnerów. Blockchain umożliwia samokorygowanie bazy danych, nawet jeśli węzeł generuje niedokładne dane. 

Zazwyczaj blok w łańcuchu bloków składa się z danych, które udostępniamy w bazie danych, skrótu i ​​skrótu kryptograficznego poprzedniego bloku. 

 Więc jesteś gotowy? Przejdź na rozwój blockchain? Świetny! Zacznijmy. 

Część programowania 

W tej sekcji przyjrzymy się plikowi main.go. 

pakiet główny

import(

„bajty”

„krypto/sha256” 

„Fmt” 

)

typ Cryptoblock struct {

Hash [] bajt 

Dane [] bajt 

PoprzedniHash [] bajt 

}

  • Jak widać, struktura została dopiero utworzona. 

func (c *Kryptoblok) BuildHash() {

szczegóły := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

hash := sha256.Sum256(szczegóły)

c.Hash = hasz[:]

}

  • Skonstruujemy teraz metodę, która pozwoli nam wygenerować hash w zależności od danych i poprzedniego hasha. Zaimportujemy bibliotekę „bytes”, ponieważ będziemy jej używać.
  • Następnym krokiem jest utworzenie zmiennej o nazwie details i użycie bajtów typu danych. Użyjemy Join(), aby połączyć kawałki bajtów.

szczegóły := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

Tutaj bierzemy wycinek 2D bajtów, przesyłamy c.Data i poprzedni hash. Następnie połączymy pusty kawałek bajtów. 

  • Następnie tworzymy rzeczywisty hash, korzystając z funkcji haszującej sum256 na szczegółach. Możemy to wykorzystać, ponieważ zaimportujemy bibliotekę sha256. 
  • Następnie wstawiamy utworzony hash do pola Hash dla bloku. 

func BuildBlock (ciąg danych, prevHash [] bajt) *Cryptoblock {

blok := &Cryptoblock{[]bajt{}, []bajt(dane), prevHash}

blok.BuildHash()

blok powrotu

  • Zbudujemy teraz funkcję umożliwiającą tworzenie Bloku. Funkcja akceptuje ciąg danych jako dane wejściowe, prevHash z poprzedniego bloku jako dane wejściowe, a następnie wyprowadza odwołanie do Cryptoblock. Blok zbudujemy za pomocą konstruktora bloku. 
  • &Cryptoblock działa jako odniesienie do bloku. W przypadku pola Hash wstawiamy pusty kawałek bajtów. W przypadku pola danych bierzemy ciąg danych i konwertujemy go na kawałek bajtów. I włączamy prevHash do pola PrevHash. 
  • Na koniec wywołujemy BuildHash() na bloku i zwracamy blok. 

typ Blockchain struct {

bloki []*Kryptoblok

}

  • Wymagany jest typ, który pomoże w wyrażaniu łańcucha bloków. I zaimplementowaliśmy strukturę, aby to osiągnąć. Struktura typu BlockChain składa się z tablicy wskaźników do Cryptoblock.

func (łańcuch *BlockChain) AddBlock(ciąg danych) {

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

nowy := BuildBlock(dane, prevBlock.Hash)

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

}

  • Tutaj tworzymy metodę, dzięki której możemy połączyć blok z łańcuchem. Metoda pobiera wskaźnik łańcucha bloków. Następnie akceptuje ciąg danych. 
  • Wywołując chain.blocks, przechodzimy do poprzedniego bloku w blockchain. Następnie przekazaliśmy długość łańcucha bloków [len(chain.blocks)-1].
  • W nowej zmiennej wywołujemy funkcję BuildBlock i przekazujemy ciąg danych oraz prevBlock.Hash.
  • Korzystając z funkcji append, dodając to do łańcucha.blocks, dołączamy nowy blok do łańcucha bloków.

func Incepcja() *Cryptoblock {

return BuildBlock("Incepcja", []bajt{})

}

  • Następnym krokiem jest utworzenie funkcji o nazwie Incepcja, która opisze pierwszy blok łańcucha bloków. I zwrócimy nowy BuildBlock w funkcji wraz z danymi w pierwszym bloku. Tutaj. Dołączyłem „Incepcja” i kawałek bajtów, który reprezentuje pusty poprzedni hash. 

func InitBlockChain() *BlockChain {

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

}

  • W celu stworzenia pierwszego blockchaina wprowadziłem funkcję InitBlockChain. Tutaj tylko zwracam szczególne odniesienie do BlockChain. Następnie budujemy tablicę Cryptoblock, w której wywołujemy funkcję Inception. 

funkcja główna() {

łańcuch := InitBlockChain()

chain.AddBlock("Pierwszy blok po inicjacji")

chain.AddBlock("Drugi blok po inicjacji")

chain.AddBlock("Trzeci blok po inicjacji")

dla _, blok := zakres łańcuch.bloki {

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

fmt.Printf("Dane w bloku: %s\n", blok.Dane)

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

}

}

  • Wreszcie dotarliśmy do głównej funkcji. Jak widać, wywołaliśmy metodę InitBlockChain() i przypisaliśmy ją do zmiennej łańcuchowej. 
  • Następnie dodajemy bloki do łańcucha poprzez chain.AddBlock i przekazujemy niezbędne dane. 
  • Następnie uruchamiamy pętlę for, aby sprawdzić łańcuch bloków. Następnie wyróżniamy każdy blok i drukujemy pola wewnątrz każdego bloku. Po prostu wpisujemy:

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

fmt.Printf("Dane w bloku: %s\n", blok.Dane)

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

Wyjście: 

Można więc powiedzieć, że program się udał. Mam nadzieję, że udało Ci się zrozumieć implementację koncepcji blockchain w Golangu. Po prostu ćwicz dalej, a będziesz w stanie poradzić sobie ze skomplikowanymi projektami. 

Twoje krypto zasługuje na najlepsze bezpieczeństwo. Weź Portfel sprzętowy Ledger za jedyne 79 USD!

Źródło: https://coinfomania.com/build-a-blockchain-in-golang/