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/