Ndërtoni një Blockchain në Golang nga e para

Në këtë artikull, ne do të përqendrohemi në zhvillimin e blockchain Go nga e para. Sidoqoftë, përpara se të fillojmë, duhet të jeni të sigurt se jeni njohur me konceptet bazë në Golang. Nëse jo, atëherë është e mençur nëse kaloni nëpër konceptet paraprake dhe më pas ktheheni në blockchain. 

Pra, le të kalojmë direkt në temë. 

Duke filluar me një drejtori të re 

Ne do të ndërtojmë një direktori të re për të filluar. Le të supozojmë se kjo direktori ka emrin "blockchain". Ne do të shkruajmë kodin në Command Prompt (ose nëse jeni duke përdorur macOS ose Linux, duhet të përdorni Terminalin). Kështu, ne shkruajmë:

cd go-space pune 

mkdir blockchain 

cd blockchain 

kod .

Ndërsa hapet Kodi VS, ne do të krijojmë një modul Go në Command Prompt. Si ta bëjmë këtë? Epo, ne shkruajmë:

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

Kodimi në main.go 

Më pas, ne do të krijojmë një skedar burimor Go me emrin 'main.go' dhe do të shkruajmë kodin në të. Por së pari le të kuptojmë se çfarë është blockchain. A Blockchain mund të përkufizohet si një bazë të dhënash publike që është e decentralizuar dhe e shpërndarë midis disa kolegëve. Blockchain lejon bazën e të dhënave të korrigjohet vetë, edhe nëse një nyje prodhon të dhëna të pasakta. 

Zakonisht, një bllok në një blockchain përbëhet nga të dhënat që ne ndajmë në bazën e të dhënave, një hash dhe hash kriptografik i bllokut të mëparshëm. 

 Pra, a jeni gati për Shkoni në zhvillimin e blockchain? E shkëlqyeshme! Le të fillojmë. 

Pjesa e programimit 

Në këtë seksion, ne do të shqyrtojmë skedarin main.go. 

paketa kryesore

import (

"bajtë"

"crypto/sha256" 

"fmt" 

)

shkruani strukturën Cryptoblock {

Hash [] bajt 

Të dhënat [] bajt 

PrevHash [] bajt 

}

  • Siç mund ta shihni, një strukturë është krijuar vetëm. 

func (c *Cryptoblock) BuildHash() {

detaje := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

hash := sha256.Sum256(detajet)

c.Hash = hash[ : ]

}

  • Tani do të ndërtojmë një metodë që do të na mundësojë të gjenerojmë një hash në varësi të të dhënave dhe hash-it të mëparshëm. Ne do të importojmë bibliotekën “bytes” sepse do ta përdorim atë.
  • Hapi tjetër është krijimi i një ndryshoreje të quajtur detaje dhe përdorimi i bajteve të tipit të të dhënave. Ne do të përdorim Join() për të lidhur fetat e bajteve.

detaje := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

Këtu, ne po marrim një pjesë 2D të bajteve, ne transmetojmë c.Data dhe hash-in e mëparshëm. Pastaj do të kombinojmë pjesën e zbrazët të bajteve. 

  • Pas kësaj, ne po krijojmë ndihmën aktuale të hash-it të funksionit hash sum256 në detaje. Ne mund ta përdorim këtë pasi do të importojmë bibliotekën sha256. 
  • Më pas, ne e shtyjmë hash-in e krijuar në fushën Hash për bllokun. 

func BuildBlock (vargu i të dhënave, prevHash [] byte) *Cryptoblock {

bllok := &Cryptoblock{[]byte{}, []byte(të dhëna), prevHash}

bllok.BuildHash()

blloku i kthimit

  • Tani do të ndërtojmë një funksion që mundëson krijimin e Bllokut. Funksioni pranon një varg të dhënash si hyrje, prevHash nga blloku i mëparshëm si hyrje dhe më pas nxjerr një referencë për Cryptoblock. Ne do të ndërtojmë bllokun duke përdorur konstruktorin e bllokut. 
  • &Cryptoblock vepron si referencë për bllokun. Për fushën Hash, ne përfshijmë një pjesë të zbrazët të bajteve. Për fushën e të dhënave, ne marrim vargun e të dhënave dhe e shndërrojmë atë në një copë bajt. Dhe ne inkorporojmë prevHash në fushën PrevHash. 
  • Së fundi, ne thërrasim BuildHash() në bllok dhe e kthejmë bllokun. 

shkruani strukturën BlockChain {

blloqe []*Cryptoblock

}

  • Kërkohet një lloj që do të ndihmojë në shprehjen e blockchain. Dhe ne zbatuam një strukturë për ta arritur këtë. Struktura e tipit BlockChain përbëhet nga një grup treguesish drejt Cryptoblock.

func (zinxhiri *BlockChain) AddBlock (vargu i të dhënave) {

prevBlock := zinxhir.blloqe[len(zinxhir.blloqe)-1]

i ri := BuildBlock (të dhënat, prevBlock.Hash)

chain.blocks = shtoj (zinxhir.blloqe, të reja)

}

  • Këtu, ne po krijojmë një metodë që na mundëson të bashkojmë një bllok në zinxhir. Metoda merr treguesin e blockchain. Pas kësaj, ai pranon një varg të dhënash. 
  • Duke thirrur chain.blocks, arrijmë te blloku i mëparshëm në blockchain. Më pas, kaluam gjatësinë e zinxhirit të bllokut [len(zinxhir.blloqe)-1].
  • Në variablin e ri, ne po thërrasim funksionin BuildBlock dhe po kalojmë vargun e të dhënave dhe prevBlock.Hash.
  • Duke shfrytëzuar funksionin e shtojcës, duke e shtuar këtë në chain.blocks, ne më pas bashkojmë bllokun e ri në zinxhirin e bllokut.

func Inception() *Cryptoblock {

ktheje BuildBlock ("Fillimi", []byte{})

}

  • Hapi tjetër është krijimi i një funksioni të quajtur Inception që do të përshkruajë bllokun e parë të blockchain. Dhe ne do të kthejmë një BuildBlock të ri në funksion, së bashku me të dhënat në bllokun e parë. Këtu. Unë kam inkorporuar "Inception" dhe një pjesë të bajteve që përfaqëson një hash të mëparshëm bosh. 

func InitBlockChain() *BlockChain {

ktheje &BlockChain{[]*Cryptoblock{Inception()}}

}

  • Për të krijuar blockchain-in e parë, unë kam prezantuar funksionin InitBlockChain. Këtu, unë thjesht po kthej referencën e veçantë për BlockChain. Më pas, ne ndërtojmë një grup të Cryptoblock, ku bëjmë një thirrje në funksionin Inception. 

func kryesore () {

zinxhir := InitBlockChain()

chain.AddBlock ("Blloku i parë pas fillimit")

chain.AddBlock ("Blloku i dytë pas fillimit")

chain.AddBlock ("Blloku i tretë pas fillimit")

për _, bllok := varg zinxhir.blloqe {

fmt.Printf(“Hashi i mëparshëm: %x\n”, bllok.PrevHash)

fmt.Printf(“Të dhënat në bllok: %s\n”, bllok.Të dhënat)

fmt.Printf(“Hash: %x\n”, bllok.Hash)

}

}

  • Më në fund, kemi arritur në funksionin kryesor. Siç mund ta shihni, ne kemi thirrur InitBlockChain() dhe ia kemi caktuar variablit chain. 
  • Më pas, ne po shtojmë blloqe në zinxhir përmes chain.AddBlock, dhe kalojmë të dhënat e nevojshme. 
  • Pas kësaj, ne ekzekutojmë një lak për të kontrolluar për blockchain. Më pas veçojmë çdo bllok dhe shtypim fushat brenda secilit bllok. Ne thjesht shkruajmë:

fmt.Printf(“Hashi i mëparshëm: %x\n”, bllok.PrevHash)

fmt.Printf(“Të dhënat në bllok: %s\n”, bllok.Të dhënat)

fmt.Printf(“Hash: %x\n”, bllok.Hash)

output: 

Pra, mund të themi se programi është i suksesshëm. Shpresoj se keni qenë në gjendje të kuptoni zbatimin e konceptit të blockchain në Golang. Thjesht vazhdoni të praktikoni dhe do të jeni në gjendje të trajtoni projekte të ndërlikuara. 

Kriptoma juaj meriton sigurinë më të mirë. Të marrë një Portofoli harduer Ledger për vetëm 79 dollarë!

Burimi: https://coinfomania.com/build-a-blockchain-in-golang/