Bumuo ng Blockchain sa Golang mula sa Scratch

Sa artikulong ito, pagtutuunan natin ng pansin ang pagbuo ng Go blockchain mula sa simula. Gayunpaman, bago tayo magsimula, dapat mong tiyakin na pamilyar ka sa mga pangunahing konsepto sa Golang. Kung hindi, kung gayon ito ay matalino kung dadaan ka sa mga paunang konsepto at pagkatapos ay babalik sa blockchain. 

Kaya, dumiretso tayo sa paksa. 

Nagsisimula sa isang Bagong Direktoryo 

Bubuo kami ng bagong direktoryo para magsimula. Ipagpalagay natin na ang direktoryo na ito ay may pangalang “blockchain.” Ita-type namin ang code sa Command Prompt (o kung gumagamit ka ng macOS o Linux, kailangan mong gamitin ang Terminal). Kaya, nagta-type kami:

cd go-workspace 

mkdir blockchain 

cd blockchain 

code .

Sa pagbukas ng VS Code, gagawa kami ng Go module sa Command Prompt. Paano natin ito gagawin? Well, nagta-type kami:

pumunta sa mod init github.com/golang-company/blockchain

Pag-coding sa main.go 

Susunod, gagawa kami ng Go source file na pinangalanang 'main.go' at ita-type namin ang code dito. Ngunit unahin muna natin kung ano ang blockchain. A blockchain maaaring tukuyin bilang isang pampublikong database na desentralisado at ipinamamahagi sa ilang mga kapantay. Pinapayagan ng Blockchain ang database na itama ang sarili, kahit na ang isang node ay gumagawa ng hindi tumpak na data. 

Karaniwan, ang isang block sa isang blockchain ay binubuo ng data na ibinabahagi namin sa database, isang hash, at ang cryptographic hash ng nakaraang block. 

 Kaya, handa ka na ba Pumunta sa pagbuo ng blockchain? Malaki! Magsimula na tayo. 

Bahagi ng Programming 

Sa seksyong ito, titingnan natin ang main.go file. 

pangunahing pakete

angkat (

"bytes"

“crypto/sha256” 

"Fmt" 

)

i-type ang Cryptoblock struct {

Hash [] byte 

Data [] byte 

PrevHash [] byte 

}

  • Tulad ng nakikita mo, ang isang struct ay nilikha lamang. 

func (c *Cryptoblock) BuildHash() {

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

hash := sha256.Sum256(mga detalye)

c.Hash = hash[ : ]

}

  • Gagawa kami ngayon ng isang paraan na magbibigay-daan sa amin na makabuo ng hash depende sa data at sa nakaraang hash. Dapat naming i-import ang "bytes" library dahil gagamitin namin ito.
  • Ang susunod na hakbang ay upang lumikha ng isang variable na tinatawag na mga detalye at gamitin ang mga byte ng uri ng data. Gagamitin namin ang Join() para ikonekta ang mga hiwa ng byte.

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

Dito, kumukuha kami ng 2D slice ng bytes, ipinapadala namin ang c.Data at ang nakaraang hash. Pagkatapos ay pagsasamahin namin ang walang laman na hiwa ng mga byte. 

  • Kasunod nito, ginagawa namin ang aktwal na hash na kumukuha ng tulong ng sum256 hashing function sa mga detalye. Magagamit natin ito dahil ii-import natin ang library ng sha256. 
  • Susunod, itulak namin ang nilikhang hash sa Hash field para sa block. 

func BuildBlock (data string, prevHash [] byte) *Cryptoblock {

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

block.BuildHash()

balik block

  • Bubuo na kami ngayon ng isang function na nagbibigay-daan sa paglikha ng Block. Tumatanggap ang function ng isang string ng data bilang input, prevHash mula sa nakaraang block bilang input, at pagkatapos ay naglalabas ng reference sa Cryptoblock. Bubuo kami ng block gamit ang block constructor. 
  • Ang &Cryptoblock ay nagsisilbing reference sa block. Para sa Hash field, isinasama namin ang isang walang laman na slice ng mga byte. Para sa Data field, kinukuha namin ang string ng data at iko-convert ito sa slice of bytes. At isinasama namin ang prevHash sa field ng PrevHash. 
  • Panghuli, tinatawag namin ang BuildHash() sa block at ibinabalik namin ang block. 

i-type ang BlockChain struct {

hinaharangan []*Cryptoblock

}

  • Ang isang uri na makakatulong sa pagpapahayag ng blockchain ay kinakailangan. At nagpatupad kami ng isang struct upang magawa ito. Ang uri ng BlockChain struct ay binubuo ng isang hanay ng mga pointer sa Cryptoblock.

func (chain *BlockChain) AddBlock(data string) {

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

bago := BuildBlock(data, prevBlock.Hash)

chain.blocks = idugtong(chain.blocks, bago)

}

  • Dito, gumagawa kami ng paraan na nagbibigay-daan sa amin na sumali sa isang bloke sa chain. Kinukuha ng pamamaraan ang blockchain pointer. Kasunod nito, tumatanggap ito ng string ng data. 
  • Ang pagtawag sa chain.blocks, makarating tayo sa nakaraang block sa blockchain. Susunod, naipasa namin ang haba ng blockchain [len(chain.blocks)-1].
  • Sa bagong variable, tinatawagan namin ang BuildBlock function at ipinapasa namin ang string ng data at prevBlock.Hash.
  • Sa pamamagitan ng paggamit ng append function, pagdaragdag nito sa chain.blocks, ikakabit namin ang bagong block sa blockchain.

func Inception() *Cryptoblock {

ibalik ang BuildBlock("Inception", []byte{})

}

  • Ang susunod na hakbang ay lumikha ng isang function na tinatawag na Inception na maglalarawan sa unang block ng blockchain. At magbabalik kami ng bagong BuildBlock sa function, kasama ang data sa unang block. Dito. Isinama ko ang "Inception" at isang slice ng byte na kumakatawan sa isang walang laman na nakaraang hash. 

func InitBlockChain() *BlockChain {

ibalik ang &BlockChain{[]*Cryptoblock{Inception()}}

}

  • Upang lumikha ng unang blockchain, ipinakilala ko ang InitBlockChain function. Dito, ibinabalik ko lang ang partikular na sanggunian sa BlockChain. Susunod, bumuo kami ng hanay ng Cryptoblock, kung saan tumatawag kami sa function ng Inception. 

func main () {

chain := InitBlockChain()

chain.AddBlock("Unang Pag-block pagkatapos ng Pagsisimula")

chain.AddBlock("Second Block after Inception")

chain.AddBlock("Third Block pagkatapos ng Inception")

para sa _, block := range chain.blocks {

fmt.Printf(“Nakaraang Hash: %x\n”, block.PrevHash)

fmt.Printf(“Data sa Block: %s\n”, block.Data)

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

}

}

  • Sa wakas, nakarating na kami sa pangunahing function. Tulad ng nakikita mo tinawag namin ang InitBlockChain() at itinalaga namin ito sa chain variable. 
  • Susunod, nagdaragdag kami ng mga bloke sa chain sa pamamagitan ng chain.AddBlock, at ipinapasa namin ang kinakailangang data. 
  • Kasunod nito, nagpapatakbo kami ng for loop upang suriin ang blockchain. Pagkatapos ay iisa-isa namin ang bawat bloke at i-print ang mga patlang sa loob ng bawat bloke. Type lang namin:

fmt.Printf(“Nakaraang Hash: %x\n”, block.PrevHash)

fmt.Printf(“Data sa Block: %s\n”, block.Data)

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

output: 

Kaya, masasabi nating matagumpay ang programa. Sana ay naunawaan mo ang pagpapatupad ng konsepto ng blockchain sa Golang. Ipagpatuloy mo lang ang pagsasanay at kakayanin mo ang mga masalimuot na proyekto. 

Ang iyong crypto ay nararapat sa pinakamahusay na seguridad. Kumuha ng Ledger hardware wallet sa halagang $79 lang!

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