У гэтым артыкуле мы спынімся на распрацоўцы блокчейна 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/