В тази статия ще се съсредоточим върху разработката на 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/