Изградете блокчейн в Golang от нулата

В тази статия ще се съсредоточим върху разработката на Go blockchain от нулата. Въпреки това, преди да започнем, трябва да сте сигурни, че сте запознати с основните концепции в Golang. Ако не, тогава е разумно да преминете през предварителните концепции и след това да се върнете към блокчейн. 

И така, нека да преминем направо към темата. 

Започване с нова директория 

Като начало ще изградим нова директория. Да приемем, че тази директория има името „блокчейн“. Ще напишем кода в командния ред (или ако използвате macOS или Linux, трябва да използвате терминала). Така въвеждаме:

cd go-workspace 

mkdir блокчейн 

cd блокчейн 

код .

Когато кодът на VS се отвори, ние ще създадем Go модул в командния ред. Как да го направим? Е, пишем:

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

Кодиране в main.go 

След това ще създадем изходен файл на Go с име „main.go“ и ще напишем кода в него. Но първо нека разберем какво е блокчейн. А blockchain може да се дефинира като публична база данни, която е децентрализирана и разпределена между няколко партньора. Blockchain позволява на базата данни да се самокоригира, дори ако даден възел произвежда неточни данни. 

Обикновено един блок в блокчейн се състои от данни, които споделяме в базата данни, хеш и криптографския хеш на предишния блок. 

 И така, готови ли сте за Отидете на разработка на блокчейн? Страхотен! Да започваме. 

Част за програмиране 

В този раздел ще разгледаме файла main.go. 

Основен пакет

внос (

"байтове"

„крипто/sha256“ 

"Fmt" 

)

тип Cryptoblock struct {

Хеш [] байт 

Данни [] байт 

PrevHash [] байт 

}

  • Както можете да видите, структура само е създадена. 

func (c *Cryptoblock) BuildHash() {

подробности := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

хеш := sha256.Sum256(подробности)

c.Hash = хеш[ : ]

}

  • Сега ще конструираме метод, който ще ни позволи да генерираме хеш в зависимост от данните и предишния хеш. Ще импортираме библиотеката „байтове“, защото ще я използваме.
  • Следващата стъпка е да създадете променлива, наречена details, и да използвате типа данни байтове. Ще използваме Join(), за да свържем парчетата от байтове.

подробности := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

Тук вземаме 2D срез от байтове, предаваме c.Data и предишния хеш. След това ще комбинираме празния отрязък от байтове. 

  • След това създаваме действителния хеш, използвайки помощта на функцията за хеширане sum256 върху детайлите. Можем да използваме това, тъй като ще импортираме библиотеката sha256. 
  • След това избутваме създадения хеш в полето Хеш за блока. 

func BuildBlock (низ от данни, prevHash [] байт) *Cryptoblock {

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

block.BuildHash()

блок за връщане

  • Сега ще изградим функция, която позволява създаването на Block. Функцията приема низ от данни като вход, prevHash от предишния блок като вход и след това извежда препратка към Cryptoblock. Ще изградим блока с помощта на конструктора на блокове. 
  • &Криптоблокът действа като препратка към блока. За полето Hash ние включваме празен отрязък от байтове. За полето с данни вземаме низа с данни и го преобразуваме в отрязък от байтове. И ние включваме prevHash в полето PrevHash. 
  • Накрая извикваме BuildHash() на блока и връщаме блока. 

тип BlockChain struct {

блокове []*Криптоблок

}

  • Изисква се тип, който ще помогне при изразяването на блокчейна. И внедрихме структура, за да постигнем това. Типът BlockChain структура се състои от масив от указатели към Cryptoblock.

func (верига *BlockChain) AddBlock(низ от данни) {

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

ново := BuildBlock(данни, prevBlock.Hash)

chain.blocks = добавяне (chain.blocks, ново)

}

  • Тук създаваме метод, който ни позволява да присъединим блок към веригата. Методът извлича указателя на блокчейн. След това той приема низ от данни. 
  • Извиквайки chain.blocks, стигаме до предишния блок в блокчейна. След това предадохме дължината на блокчейна [len(chain.blocks)-1].
  • В новата променлива извикваме функцията BuildBlock и предаваме низ от данни и prevBlock.Hash.
  • Като използваме функцията за добавяне, добавяйки това към chain.blocks, ние след това прикрепяме новия блок към блокчейна.

func Inception() *Cryptoblock {

return BuildBlock(“Начало”, []byte{})

}

  • Следващата стъпка е да създадете функция, наречена Inception, която ще опише първия блок на блокчейна. И ние ще върнем нов BuildBlock във функцията, заедно с данните в първия блок. Тук. Включих „Inception“ и част от байтове, които представляват празен предишен хеш. 

func InitBlockChain() *BlockChain {

връщане &BlockChain{[]*Cryptoblock{Inception()}}

}

  • За да създам първата блокчейн, въведох функцията InitBlockChain. Тук просто връщам конкретната препратка към BlockChain. След това изграждаме масив от Cryptoblock, където извикваме функцията Inception. 

func main () {

верига := InitBlockChain()

chain.AddBlock(“Първи блок след създаването”)

chain.AddBlock(“Втори блок след началото”)

chain.AddBlock(“Трети блок след началото”)

за _, block := range chain.blocks {

fmt.Printf(“Предишен хеш: %x\n”, block.PrevHash)

fmt.Printf(“Данни в блок: %s\n”, block.Data)

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

}

}

  • Най-накрая стигнахме до основната функция. Както можете да видите, извикахме InitBlockChain() и го присвоихме на променливата верига. 
  • След това добавяме блокове към веригата чрез chain.AddBlock и предаваме необходимите данни. 
  • След това стартираме for цикъл, за да проверим за блокчейн. След това отделяме всеки блок и отпечатваме полетата във всеки блок. Просто пишем:

fmt.Printf(“Предишен хеш: %x\n”, block.PrevHash)

fmt.Printf(“Данни в блок: %s\n”, block.Data)

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

Изход: 

Така че можем да кажем, че програмата е успешна. Надявам се, че успяхте да разберете прилагането на концепцията за блокчейн в Golang. Просто продължавайте да практикувате и ще можете да се справяте със сложни проекти. 

Вашата криптовалута заслужава най-добрата сигурност. Получите Хардуерен портфейл на Ledger само за $79!

Източник: https://coinfomania.com/build-a-blockchain-in-golang/