Стварыце блокчэйн у Golang з нуля

У гэтым артыкуле мы спынімся на распрацоўцы блокчейна Go з нуля. Аднак перш чым мы пачнем, вы павінны пераканацца, што знаёмыя з асноўнымі паняццямі Golang. Калі няма, тады будзе разумна, калі вы прагледзіце папярэднія канцэпцыі, а потым вернецеся да блокчейна. 

Такім чынам, пяройдзем адразу да тэмы. 

Пачынаючы з новага каталога 

Для пачатку мы створым новы каталог. Выкажам здагадку, што гэты каталог мае назву «блокчейн». Мы ўвядзем код у камандным радку (або, калі вы выкарыстоўваеце macOS або Linux, вы павінны выкарыстоўваць тэрмінал). Такім чынам, мы набіраем:

cd go-workspace 

Блокчейн mkdir 

cd blockchain 

код .

Калі код 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([][] байт{c.Data, c.PrevHash}, []байт{}) 

хэш:= sha256.Sum256(падрабязней)

c.Hash = хэш [:]

}

  • Цяпер мы створым метад, які дазволіць нам згенераваць хэш у залежнасці ад дадзеных і папярэдняга хэша. Мы імпартуем бібліятэку «bytes», таму што мы будзем яе выкарыстоўваць.
  • Наступным крокам з'яўляецца стварэнне зменнай пад назвай details і выкарыстанне тыпу дадзеных bytes. Мы будзем выкарыстоўваць Join(), каб злучыць фрагменты байтаў.

дэталі := bytes.Join([][] байт{c.Data, c.PrevHash}, []байт{}) 

Тут мы бярэм двухмерны зрэз байтаў, перадаем c.Data і папярэдні хэш. Затым мы аб'яднаем пусты фрагмент байтаў. 

  • Пасля гэтага мы ствараем фактычны хэш з дапамогай функцыі хэшавання sum256 у дэталях. Мы можам выкарыстоўваць гэта, калі будзем імпартаваць бібліятэку sha256. 
  • Далей мы запіхваем створаны хэш у поле Hash для блока. 

func BuildBlock (радок дадзеных, prevHash [] байт) *Cryptoblock {

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

block.BuildHash()

зваротны блок

  • Цяпер мы створым функцыю, якая дазваляе ствараць Block. Функцыя прымае радок дадзеных у якасці ўваходных дадзеных, prevHash з папярэдняга блока ў якасці ўваходных дадзеных, а затым выводзіць спасылку на Cryptoblock. Мы будзем будаваць блок з дапамогай канструктара блокаў. 
  • &Cryptoblock дзейнічае як спасылка на блок. Для поля Хэш мы ўключаем пусты фрагмент байтаў. Для поля даных мы бярэм радок даных і пераўтвараем яе ў зрэз байтаў. І мы ўключаем 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.
  • Выкарыстоўваючы функцыю append, дадаючы гэта ў chain.blocks, мы затым далучаем новы блок да блокчейна.

func Inception() *Cryptoblock {

return BuildBlock(“Пачатак”, []байт{})

}

  • Наступным крокам з'яўляецца стварэнне функцыі пад назвай Inception, якая будзе апісваць першы блок блокчейна. І мы вернем новы BuildBlock у функцыі разам з дадзенымі ў першым блоку. тут. Я ўключыў «Пачатак» і фрагмент байтаў, які прадстаўляе пусты папярэдні хэш. 

func InitBlockChain() *BlockChain {

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

}

  • Каб стварыць першы блокчейн, я ўвёў функцыю InitBlockChain. Тут я проста вяртаю канкрэтную спасылку на BlockChain. Далей мы будуем масіў Cryptoblock, у якім робім выклік функцыі Inception. 

func main () {

ланцуг := InitBlockChain()

chain.AddBlock(“Першы блок пасля стварэння”)

chain.AddBlock(“Другі блок пасля стварэння”)

chain.AddBlock(“Трэці блок пасля стварэння”)

для _, block := дыяпазон 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/