Adeiladu Blockchain yn Golang o Scratch

Yn yr erthygl hon, byddwn yn canolbwyntio ar ddatblygiad blockchain Go o'r dechrau. Fodd bynnag, cyn i ni ddechrau, dylech fod yn sicr eich bod yn gyfarwydd â'r cysyniadau sylfaenol yn Golang. Os na, yna mae'n ddoeth os ewch chi drwy'r cysyniadau rhagarweiniol ac yna dod yn ôl i blockchain. 

Felly, gadewch inni fynd yn syth at y pwnc. 

Dechreu gyda Chyfeirlyfr Newydd 

Byddwn yn adeiladu cyfeiriadur newydd i ddechrau. Gadewch inni dybio bod gan y cyfeiriadur hwn yr enw “blockchain.” Byddwn yn teipio'r cod yn y Command Prompt (neu os ydych chi'n defnyddio macOS neu Linux, mae'n rhaid i chi ddefnyddio'r Terminal). Felly, rydym yn teipio:

cd go-lle gwaith 

mkdir blockchain 

cd blockchain 

côd .

Wrth i'r Cod VS agor, byddwn yn creu modiwl Go yn y Command Prompt. Sut ydym ni'n gwneud hynny? Wel, rydyn ni'n teipio:

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

Codio yn main.go 

Nesaf, byddwn yn creu ffeil ffynhonnell Go o'r enw 'main.go' a byddwn yn teipio'r cod ynddo. Ond yn gyntaf gadewch inni ddeall beth yw blockchain. A blockchain gellir ei ddiffinio fel cronfa ddata gyhoeddus sy'n cael ei datganoli a'i dosbarthu ymhlith nifer o gymheiriaid. Mae Blockchain yn caniatáu i'r gronfa ddata hunan-gywiro, hyd yn oed os yw nod yn cynhyrchu data anghywir. 

Fel arfer, mae bloc ar blockchain yn cynnwys data rydyn ni'n ei rannu yn y gronfa ddata, hash, a stwnsh cryptograffig y bloc blaenorol. 

 Felly, a ydych yn barod ar gyfer Ewch datblygiad blockchain? Gwych! Gadewch i ni ddechrau. 

Rhan Rhaglennu 

Yn yr adran hon, byddwn yn edrych i mewn i'r ffeil main.go. 

prif becyn

mewnforio (

"beit"

“crypto/sha256” 

"Fmt" 

)

teipiwch strwythur Cryptoblock {

Hash [] beit 

Data [] beit 

PrevHash [] beit 

}

  • Fel y gwelwch, dim ond strwythur sydd wedi'i greu. 

func (c *Cryptoblock) BuildHash() {

manylion := bytes.Join([][] beit{c.Data, c.PrevHash}, []beit{}) 

hash := sha256.Sum256(manylion)

c.Hash = hash[ :]

}

  • Byddwn nawr yn adeiladu dull a fydd yn ein galluogi i gynhyrchu hash yn dibynnu ar y data a'r stwnsh blaenorol. Byddwn yn mewnforio'r llyfrgell “beit” oherwydd byddwn yn ei defnyddio.
  • Y cam nesaf yw creu newidyn o'r enw manylion a defnyddio'r bytes math o ddata. Byddwn yn defnyddio Join() i gysylltu'r tafelli o beit.

manylion := bytes.Join([][] beit{c.Data, c.PrevHash}, []beit{}) 

Yma, rydym yn cymryd sleisen 2D o beit, rydym yn trosglwyddo'r c.Data a'r hash blaenorol. Yna byddwn yn cyfuno'r sleisen wag o bytes. 

  • Yn dilyn hyn, rydym yn creu'r hash gwirioneddol gan gymryd help y swyddogaeth stwnsio swm256 ar y manylion. Gallwn ddefnyddio hwn gan y byddwn yn mewnforio'r llyfrgell sha256. 
  • Nesaf, rydyn ni'n gwthio'r hash a grëwyd i'r cae Hash ar gyfer y bloc. 

func BuildBlock (llinyn data, prevHash [] beit) *Cryptoblock {

bloc := &Cryptoblock{[]beit{}, []beit(data), prevHash}

bloc.BuildHash()

bloc dychwelyd

  • Byddwn nawr yn adeiladu swyddogaeth sy'n galluogi creu Bloc. Mae'r swyddogaeth yn derbyn llinyn o ddata fel mewnbwn, prevHash o'r bloc blaenorol fel mewnbwn, ac yna'n allbynnu cyfeiriad at Cryptoblock. Byddwn yn adeiladu'r bloc gan ddefnyddio'r constructor bloc. 
  • Mae'r &Cryptoblock yn gweithredu fel cyfeiriad at y bloc. Ar gyfer cae Hash, rydym yn ymgorffori sleisen wag o beit. Ar gyfer maes Data, rydym yn cymryd y llinyn data a'i drawsnewid yn sleisen o beit. Ac rydym yn ymgorffori prevHash i faes PrevHash. 
  • Yn olaf, rydyn ni'n galw'r BuildHash () ar y bloc ac rydyn ni'n dychwelyd y bloc. 

teipiwch strwythur BlockChain {

blociau [] * Cryptoblock

}

  • Mae angen math a fydd yn helpu i fynegi'r blockchain. Ac fe wnaethom weithredu strwythur i gyflawni hyn. Mae'r math BlockChain struct yn cynnwys amrywiaeth o awgrymiadau i Cryptoblock.

func (cadwyn *BlockChain) AddBlock (llinyn data) {

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

newydd := BuildBlock(data, prevBlock.Hash)

chain.blocks = atodi(chain.blocks, newydd)

}

  • Yma, rydym yn creu dull sy'n ein galluogi i ymuno â bloc i'r gadwyn. Mae'r dull yn adfer y pwyntydd blockchain. Yn dilyn hyn, mae'n derbyn llinyn data. 
  • Gan alw chain.blocks, rydym yn cyrraedd y bloc blaenorol yn y blockchain. Nesaf, aethom ni heibio hyd y blockchain [len(chain.blocks)-1].
  • Yn y newidyn newydd, rydym yn galw'r swyddogaeth BuildBlock ac rydym yn pasio llinyn data a prevBlock.Hash.
  • Trwy ddefnyddio'r swyddogaeth atodiad, gan ychwanegu hwn at y chain.blocks, rydym wedyn yn atodi'r bloc newydd i'r blockchain.

func Cychwyn() *Cryptoblock {

dychwelyd BuildBlock("Inception", []beit{})

}

  • Y cam nesaf yw creu swyddogaeth o'r enw Inception a fydd yn disgrifio bloc cyntaf y blockchain. A byddwn yn dychwelyd BuildBlock newydd yn y swyddogaeth, ynghyd â'r data yn y bloc cyntaf. Yma. Rwyf wedi ymgorffori “Inception” a thafell o beit sy'n cynrychioli stwnsh blaenorol gwag. 

func InitBlockChain() *BlockChain {

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

}

  • Er mwyn creu'r blockchain cyntaf, rwyf wedi cyflwyno'r swyddogaeth InitBlockChain. Yma, rwy'n dychwelyd y cyfeiriad penodol at y BlockChain yn unig. Nesaf, rydym yn adeiladu amrywiaeth o Cryptoblock, lle rydym yn gwneud galwad i'r swyddogaeth Inception. 

prif func () {

cadwyn := InitBlockChain()

chain.AddBlock("Bloc Cyntaf ar ôl Cychwyn")

chain.AddBlock("Ail Floc ar ôl Cychwyn")

chain.AddBlock("Trydydd Bloc ar ôl Cychwyn")

am _, bloc := range chain.blocks {

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

fmt.Printf("Data mewn Bloc: %s\n", bloc.Data)

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

}

}

  • Yn olaf, rydym wedi cyrraedd y brif swyddogaeth. Fel y gallwch weld rydym wedi galw'r InitBlockChain () ac rydym wedi ei neilltuo i'r newidyn cadwyn. 
  • Nesaf, rydym yn ychwanegu blociau i'r gadwyn trwy chain.AddBlock, ac rydym yn pasio'r data angenrheidiol. 
  • Yn dilyn hyn, rydym yn rhedeg am ddolen i wirio am y blockchain. Yna rydyn ni'n tynnu sylw at bob bloc ac yn argraffu'r meysydd y tu mewn i bob bloc. Rydyn ni'n teipio:

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

fmt.Printf("Data mewn Bloc: %s\n", bloc.Data)

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

Allbwn: 

Felly, gallwn ddweud bod y rhaglen yn llwyddiannus. Rwy'n gobeithio eich bod wedi gallu deall gweithrediad y cysyniad o blockchain yn Golang. Daliwch ati i ymarfer a byddwch yn gallu delio â phrosiectau cymhleth. 

Mae eich crypto yn haeddu'r diogelwch gorau. Gael Waled caledwedd cyfriflyfr am ddim ond $79!

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