Tsim ib lub Blockchain hauv Golang los ntawm Scratch

Hauv tsab xov xwm no, peb yuav tsom mus rau Go blockchain kev txhim kho los ntawm kos. Txawm li cas los xij, ua ntej peb pib, koj yuav tsum paub tseeb tias koj paub cov ntsiab lus hauv Golang. Yog tias tsis yog, nws yog qhov zoo yog tias koj mus dhau cov ntsiab lus ua ntej thiab rov qab los rau blockchain. 

Yog li, cia peb mus ncaj nraim rau lub ncauj lus. 

Pib nrog Phau Ntawv Qhia Tshiab 

Peb yuav tsim ib phau ntawv tshiab los pib nrog. Cia peb xav tias phau ntawv no muaj lub npe "blockchain." Peb yuav ntaus tus lej hauv Command Prompt (lossis yog tias koj siv macOS lossis Linux, koj yuav tsum siv Terminal). Yog li, peb ntaus:

cd mus-workspace 

mkdir blockchain 

cd blockchain 

code.

Raws li VS Code qhib, peb yuav tsim ib qho Go module hauv Command Prompt. Peb yuav ua li cas? Zoo, peb ntaus:

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

Coding hauv main.go 

Tom ntej no, peb yuav tsim Go qhov ntaub ntawv npe hu ua 'main.go' thiab peb yuav ntaus tus lej hauv nws. Tab sis ua ntej cia peb nkag siab tias blockchain yog dab tsi. A blockchain tej zaum yuav raug txhais raws li ib tug pej xeem database uas yog decentralized thiab faib ntawm ob peb cov phooj ywg. Blockchain tso cai rau cov ntaub ntawv los kho tus kheej, txawm tias ib lub node tsim cov ntaub ntawv tsis raug. 

Feem ntau, ib qho thaiv ntawm blockchain muaj cov ntaub ntawv uas peb muab tso rau hauv cov ntaub ntawv, ib qho hash, thiab yav dhau los block's cryptographic hash. 

 Yog li, koj puas npaj txhij rau Mus rau blockchain txoj kev loj hlob? Zoo heev! Cia peb pib. 

Programming Part 

Hauv seem no, peb yuav saib mus rau hauv cov ntaub ntawv main.go. 

pob loj

ntshuam (

"bytes"

"crypto/sha256" 

"Fmt" 

)

hom Cryptoblock struct {

Hash [] byte 

Cov ntaub ntawv [] byte 

PrevHash [] byte 

}

  • Raws li koj tau pom, ib tug struct tsuas tau tsim. 

func (c * Cryptoblock) BuildHash() {

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

hash := sha256.Sum256(details)

c.Hash = hash[ : ]

}

  • Tam sim no peb yuav tsim ib txoj hauv kev uas yuav pab kom peb tsim tau tus hash nyob ntawm cov ntaub ntawv thiab cov hash yav dhau los. Peb yuav tsum import lub tsev qiv ntawv "bytes" vim tias peb yuav siv nws.
  • Cov kauj ruam tom ntej yog tsim kom muaj qhov sib txawv hu ua cov ntsiab lus thiab siv cov ntaub ntawv hom bytes. Peb yuav siv Join() los txuas cov hlais ntawm bytes.

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

Ntawm no, peb tab tom noj 2D daim ntawm bytes, peb xa cov c.Data thiab cov hash dhau los. Tom qab ntawd peb yuav muab cov khoob khoob ntawm bytes. 

  • Ua raws li qhov no, peb tab tom tsim qhov tseeb hash pab ntawm sum256 hashing muaj nuj nqi ntawm cov ntsiab lus. Peb tuaj yeem siv qhov no raws li peb yuav import lub tsev qiv ntawv sha256. 
  • Tom ntej no, peb thawb lub hash tsim rau hauv Hash teb rau qhov thaiv. 

func BuildBlock (cov ntaub ntawv hlua, prevHash [] byte) * Cryptoblock {

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

block.BuildHash()

rov thaiv

  • Tam sim no peb yuav tsim ib qho kev ua haujlwm uas tso cai rau kev tsim Block. Lub luag haujlwm lees txais ib txoj hlua ntawm cov ntaub ntawv raws li cov tswv yim, prevHash los ntawm qhov thaiv dhau los ua cov tswv yim, thiab tom qab ntawd tso tawm cov ntaub ntawv siv rau Cryptoblock. Peb yuav tsim lub block siv lub block constructor. 
  • Lub & Cryptoblock ua raws li kev siv rau qhov thaiv. Rau Hash teb, peb suav nrog ib qho khoob ntawm bytes. Rau cov ntaub ntawv teb, peb muab cov ntaub ntawv txoj hlua thiab hloov nws mus rau hauv daim ntawm bytes. Thiab peb suav nrog prevHash rau hauv PrevHash teb. 
  • Thaum kawg, peb hu rau BuildHash() ntawm qhov thaiv thiab peb rov qab qhov thaiv. 

hom BlockChain struct {

blocks []* Cryptoblock

}

  • Ib hom uas yuav pab qhia txog blockchain yog xav tau. Thiab peb tau ua ib qho kev qhia kom ua tiav qhov no. Hom BlockChain struct yog tsim los ntawm ib qho array ntawm pointers rau Cryptoblock.

func (chain * BlockChain) AddBlock(cov ntaub ntawv hlua) {

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

tshiab := BuildBlock(data, prevBlock.Hash)

chain.blocks = append(chain.blocks, tshiab)

}

  • Ntawm no, peb tab tom tsim ib txoj hauv kev ua kom peb tuaj yeem koom nrog ib qho thaiv rau cov saw hlau. Txoj kev retrieves blockchain pointer. Tom qab qhov no, nws lees txais ib txoj hlua ntaub ntawv. 
  • Hu rau chain.blocks, peb tau mus rau yav dhau los thaiv hauv blockchain. Tom ntej no, peb dhau qhov ntev ntawm blockchain [len(chain.blocks)-1].
  • Hauv qhov hloov pauv tshiab, peb tab tom hu rau BuildBlock muaj nuj nqi thiab peb tab tom hla cov ntaub ntawv hlua thiab prevBlock.Hash.
  • Los ntawm kev siv lub append muaj nuj nqi, ntxiv qhov no mus rau chain.blocks, peb mam li muab cov tshiab thaiv rau blockchain.

func Inception() *Cryptoblock {

rov BuildBlock("Inception", []byte{})

}

  • Cov kauj ruam tom ntej yog los tsim ib txoj haujlwm hu ua Inception uas yuav piav qhia txog blockchain thawj zaug. Thiab peb yuav rov qab BuildBlock tshiab hauv kev ua haujlwm, nrog rau cov ntaub ntawv hauv thawj ntu. Ntawm no. Kuv tau teeb tsa "Inception" thiab ib daim ntawm bytes uas sawv cev rau qhov khoob dhau los. 

func InitBlockChain() *BlockChain {

rov qab &BlockChain{[]*Cryptoblock{Inception()}}

}

  • Txhawm rau tsim thawj blockchain, kuv tau qhia txog InitBlockChain muaj nuj nqi. Ntawm no, kuv tsuas yog xa rov qab qhov tshwj xeeb siv rau BlockChain. Tom ntej no, peb tsim ib qho array ntawm Cryptoblock, qhov twg peb hu rau Inception muaj nuj nqi. 

func lub ntsiab () {

chain := InitBlockChain()

chain.AddBlock("Thawj Thaiv tom qab Inception")

chain.AddBlock("Qhov thib ob thaiv tom qab pib")

chain.AddBlock("Tib Thib Peb Tom Qab Inception")

rau _, block := range chain.blocks {

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

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

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

}

}

  • Thaum kawg, peb tau tuaj txog ntawm lub luag haujlwm tseem ceeb. Raws li koj tuaj yeem pom peb tau hu ua InitBlockChain() thiab peb tau muab nws rau cov saw sib txawv. 
  • Tom ntej no, peb ntxiv blocks rau cov saw ntawm chain.AddBlock, thiab peb hla cov ntaub ntawv tsim nyog. 
  • Tom qab qhov no, peb khiav ib lub voj voog los kuaj xyuas qhov blockchain. Tom qab ntawd peb tso tawm txhua qhov thaiv thiab luam cov teb hauv txhua qhov thaiv. Peb tsuas yog ntaus ntawv:

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

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

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

Tso zis: 

Yog li, peb tuaj yeem hais tias qhov program ua tiav. Kuv vam tias koj tuaj yeem nkag siab qhov kev siv ntawm lub tswvyim ntawm blockchain hauv Golang. Cia li ua raws li xyaum ua thiab koj yuav muaj peev xwm lis intricate tej yaam num. 

Koj tus crypto tsim nyog tau txais kev ruaj ntseg zoo tshaj plaws. Tau ib Ledger hardware wallet tsuas yog $79 xwb!

Tau qhov twg los: https://coinfomania.com/build-a-blockchain-in-golang/