ສ້າງ Blockchain ໃນ Golang ຈາກ Scratch

ໃນບົດຄວາມນີ້, ພວກເຮົາຈະສຸມໃສ່ການພັດທະນາ Go blockchain ຕັ້ງແຕ່ເລີ່ມຕົ້ນ. ຢ່າງໃດກໍ່ຕາມ, ກ່ອນທີ່ພວກເຮົາຈະເລີ່ມຕົ້ນ, ທ່ານຄວນແນ່ໃຈວ່າທ່ານຄຸ້ນເຄີຍກັບແນວຄວາມຄິດພື້ນຖານໃນ Golang. ຖ້າບໍ່ແມ່ນ, ມັນຈະສະຫລາດຖ້າທ່ານຜ່ານແນວຄວາມຄິດເບື້ອງຕົ້ນແລະຫຼັງຈາກນັ້ນກັບຄືນສູ່ blockchain. 

ດັ່ງນັ້ນ, ໃຫ້ພວກເຮົາໄປກົງກັບຫົວຂໍ້. 

ເລີ່ມຕົ້ນດ້ວຍໄດເລກະທໍລີໃຫມ່ 

ພວກເຮົາຈະສ້າງໄດເລກະທໍລີໃຫມ່ເພື່ອເລີ່ມຕົ້ນດ້ວຍ. ໃຫ້ພວກເຮົາສົມມຸດວ່າໄດເລກະທໍລີນີ້ມີຊື່ "blockchain." ພວກເຮົາຈະພິມລະຫັດໃນ Command Prompt (ຫຼືຖ້າທ່ານໃຊ້ macOS ຫຼື Linux, ທ່ານຕ້ອງໃຊ້ Terminal). ດັ່ງນັ້ນ, ພວກເຮົາພິມ:

cd go-workspace 

mkdir blockchain 

cd blockchain 

ລະ​ຫັດ​.

ເມື່ອລະຫັດ VS ເປີດ, ພວກເຮົາຈະສ້າງໂມດູນ Go ໃນ Command Prompt. ພວກເຮົາເຮັດແນວນັ້ນໄດ້ແນວໃດ? ແລ້ວ, ພວກເຮົາພິມ:

ໄປ mod init github.com/golang-company/blockchain

ການຂຽນລະຫັດໃນ main.go 

ຕໍ່ໄປ, ພວກເຮົາຈະສ້າງໄຟລ໌ແຫຼ່ງ Go ທີ່ມີຊື່ວ່າ 'main.go' ແລະພວກເຮົາຈະພິມລະຫັດໃສ່ມັນ. ແຕ່ທໍາອິດໃຫ້ພວກເຮົາເຂົ້າໃຈວ່າ blockchain ແມ່ນຫຍັງ. ກ blockchain ອາດຈະຖືກກໍານົດເປັນຖານຂໍ້ມູນສາທາລະນະທີ່ມີການແບ່ງຂັ້ນຄຸ້ມຄອງແລະແຈກຢາຍໃນບັນດາເພື່ອນມິດຫຼາຍໆຄົນ. Blockchain ອະນຸຍາດໃຫ້ຖານຂໍ້ມູນແກ້ໄຂດ້ວຍຕົນເອງ, ເຖິງແມ່ນວ່າ node ກໍາລັງຜະລິດຂໍ້ມູນທີ່ບໍ່ຖືກຕ້ອງ. 

ໂດຍປົກກະຕິແລ້ວ, ຕັນໃນ blockchain ປະກອບດ້ວຍຂໍ້ມູນທີ່ພວກເຮົາແບ່ງປັນໃນຖານຂໍ້ມູນ, hash, ແລະ hash cryptographic ຂອງ block ທີ່ຜ່ານມາ. 

 ດັ່ງນັ້ນ, ເຈົ້າພ້ອມແລ້ວບໍ? ໄປພັດທະນາ blockchain? ຍິ່ງໃຫຍ່! ໃຫ້ເລີ່ມຕົ້ນ. 

ພາກສ່ວນການຂຽນໂປລແກລມ 

ໃນພາກນີ້, ພວກເຮົາຈະເບິ່ງເຂົ້າໄປໃນໄຟລ໌ main.go. 

ຊຸດຫຼັກ

ນໍາເຂົ້າ (

"ໄບຕ໌"

"crypto/sha256" 

"fmt" 

)

ປະເພດ Cryptoblock struct {

Hash [] byte 

ຂໍ້ມູນ [] byte 

PrevHash [] byte 

}

  • ດັ່ງທີ່ທ່ານສາມາດເຫັນໄດ້, ໂຄງສ້າງພຽງແຕ່ຖືກສ້າງຂື້ນ. 

func (c *Cryptoblock) BuildHash() {

ລາຍລະອຽດ := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

hash := sha256.Sum256(ລາຍລະອຽດ)

c.Hash = hash[ : ]

}

  • ໃນປັດຈຸບັນພວກເຮົາຈະສ້າງວິທີການທີ່ຈະຊ່ວຍໃຫ້ພວກເຮົາສາມາດສ້າງ hash ຂຶ້ນກັບຂໍ້ມູນແລະ hash ທີ່ຜ່ານມາ. ພວກເຮົາຈະນໍາເຂົ້າຫ້ອງສະຫມຸດ "bytes" ເພາະວ່າພວກເຮົາຈະໃຊ້ມັນ.
  • ຂັ້ນຕອນຕໍ່ໄປແມ່ນການສ້າງຕົວແປທີ່ເອີ້ນວ່າລາຍລະອຽດແລະນໍາໃຊ້ຂໍ້ມູນປະເພດ bytes. ພວກເຮົາຈະໃຊ້ Join() ເພື່ອເຊື່ອມຕໍ່ slices ຂອງ bytes.

ລາຍລະອຽດ := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

ທີ່ນີ້, ພວກເຮົາກໍາລັງກິນ 2D slice ຂອງ bytes, ພວກເຮົາສົ່ງ c.Data ແລະ hash ທີ່ຜ່ານມາ. ຫຼັງຈາກນັ້ນ, ພວກເຮົາຈະສົມທົບການ slice ຫວ່າງເປົ່າຂອງ bytes. 

  • ປະຕິບັດຕາມນີ້, ພວກເຮົາກໍາລັງສ້າງ hash ຕົວຈິງການຊ່ວຍເຫຼືອຂອງ sum256 hashing function ກ່ຽວກັບລາຍລະອຽດ. ພວກເຮົາສາມາດໃຊ້ສິ່ງນີ້ໄດ້ຍ້ອນວ່າພວກເຮົາຈະນໍາເຂົ້າຫ້ອງສະຫມຸດ sha256. 
  • ຕໍ່ໄປ, ພວກເຮົາຍູ້ hash ທີ່ສ້າງຂຶ້ນເຂົ້າໄປໃນຊ່ອງ Hash ສໍາລັບຕັນ. 

func BuildBlock (ສາຍຂໍ້ມູນ, prevHash [] byte) *Cryptoblock {

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

block.BuildHash()

ບລັອກກັບຄືນ

  • ດຽວນີ້ພວກເຮົາຈະສ້າງຟັງຊັນທີ່ຊ່ວຍໃຫ້ການສ້າງ Block ໄດ້. ຟັງຊັນຮັບສາຍຂໍ້ມູນເປັນການປ້ອນຂໍ້ມູນ, prevHash ຈາກບລັອກກ່ອນໜ້າເປັນການປ້ອນຂໍ້ມູນ, ແລະຫຼັງຈາກນັ້ນສົ່ງຜົນການອ້າງອີງເຖິງ Cryptoblock. ພວກເຮົາຈະສ້າງບລັອກໂດຍໃຊ້ຕົວສ້າງຕັນ. 
  • The &Cryptoblock ເຮັດຫນ້າທີ່ເປັນການອ້າງອີງເຖິງບລັອກ. ສໍາລັບຊ່ອງຂໍ້ມູນ Hash, ພວກເຮົາລວມເອົາຊ່ອງຫວ່າງຂອງ bytes. ສໍາລັບພາກສະຫນາມຂໍ້ມູນ, ພວກເຮົາເອົາສາຍຂໍ້ມູນແລະປ່ຽນເປັນ slice ຂອງ bytes. ແລະພວກເຮົາລວມ prevHash ເຂົ້າໄປໃນພາກສະຫນາມ PrevHash. 
  • ສຸດທ້າຍ, ພວກເຮົາໂທຫາ BuildHash () ໃນບລັອກແລະພວກເຮົາສົ່ງຄືນບລັອກ. 

ປະເພດ BlockChain struct {

ບລັອກ []*Cryptoblock

}

  • ປະເພດທີ່ຈະຊ່ວຍໃນການສະແດງ blockchain ແມ່ນຕ້ອງການ. ແລະພວກເຮົາໄດ້ປະຕິບັດໂຄງສ້າງເພື່ອເຮັດສໍາເລັດນີ້. ປະເພດຂອງ BlockChain struct ແມ່ນປະກອບດ້ວຍອາເຣຂອງຕົວຊີ້ໄປຫາ Cryptoblock.

func (ຕ່ອງໂສ້ *BlockChain) AddBlock(ສາຍຂໍ້ມູນ) {

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

ໃຫມ່ := BuildBlock(ຂໍ້ມູນ, prevBlock.Hash)

chain.blocks = append(chain.blocks, ໃຫມ່)

}

  • ນີ້, ພວກເຮົາກໍາລັງສ້າງວິທີການເຮັດໃຫ້ພວກເຮົາສາມາດເຂົ້າຮ່ວມຕັນກັບຕ່ອງໂສ້. ວິທີການດຶງຕົວຊີ້ blockchain. ປະຕິບັດຕາມນີ້, ມັນຍອມຮັບສາຍຂໍ້ມູນ. 
  • ໂທຫາ chain.blocks, ພວກເຮົາໄປຫາຕັນທີ່ຜ່ານມາໃນ blockchain. ຕໍ່ໄປ, ພວກເຮົາຜ່ານຄວາມຍາວຂອງ blockchain [len(chain.blocks)-1].
  • ໃນຕົວແປໃຫມ່, ພວກເຮົາກໍາລັງໂທຫາຟັງຊັນ BuildBlock ແລະພວກເຮົາກໍາລັງຖ່າຍທອດຂໍ້ມູນ string ແລະ prevBlock.Hash.
  • ໂດຍການນໍາໃຊ້ຫນ້າທີ່ເພີ່ມເຕີມ, ເພີ່ມນີ້ໃສ່ chain.blocks, ຫຼັງຈາກນັ້ນພວກເຮົາຕິດຕັນໃຫມ່ກັບ blockchain.

func Inception() *Cryptoblock {

ກັບຄືນ BuildBlock(“Inception”, []byte{})

}

  • ຂັ້ນຕອນຕໍ່ໄປແມ່ນການສ້າງຫນ້າທີ່ທີ່ເອີ້ນວ່າ Inception ທີ່ຈະອະທິບາຍເຖິງບລັອກທໍາອິດຂອງ blockchain. ແລະພວກເຮົາຈະກັບຄືນ BuildBlock ໃຫມ່ໃນຫນ້າທີ່, ພ້ອມກັບຂໍ້ມູນໃນບລັອກທໍາອິດ. ທີ່ນີ້. ຂ້ອຍໄດ້ລວມເອົາ "ການເລີ່ມຕົ້ນ" ແລະບາງສ່ວນຂອງ bytes ເຊິ່ງເປັນຕົວແທນຂອງ hash ທີ່ຜ່ານມາຫວ່າງເປົ່າ. 

func InitBlockChain() *BlockChain {

ກັບຄືນ &BlockChain{[]*Cryptoblock{Inception()}}

}

  • ເພື່ອສ້າງ blockchain ທໍາອິດ, ຂ້າພະເຈົ້າໄດ້ນໍາສະເຫນີຫນ້າທີ່ InitBlockChain. ທີ່ນີ້, ຂ້າພະເຈົ້າພຽງແຕ່ກັບຄືນການອ້າງອີງໂດຍສະເພາະກັບ BlockChain. ຕໍ່ໄປ, ພວກເຮົາສ້າງ array ຂອງ Cryptoblock, ບ່ອນທີ່ພວກເຮົາໂທຫາຫນ້າທີ່ເລີ່ມຕົ້ນ. 

func main() {

ລະບົບຕ່ອງໂສ້ := InitBlockChain()

chain.AddBlock(“ບຼັອກທຳອິດຫຼັງການເລີ່ມຕົ້ນ”)

chain.AddBlock(“ບລັອກທີສອງຫຼັງຈາກການເລີ່ມຕົ້ນ”)

chain.AddBlock(“ທ່ອນ​ທີ​ສາມ​ຫຼັງ​ຈາກ​ການ​ເລີ່ມ​ຕົ້ນ”)

ສໍາລັບ _, block := range chain.blocks {

fmt.Printf(“Hash ກ່ອນໜ້າ: %x\n”, block.PrevHash)

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

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

}

}

  • ໃນທີ່ສຸດ, ພວກເຮົາໄດ້ມາຮອດຫນ້າທີ່ຕົ້ນຕໍ. ດັ່ງທີ່ເຈົ້າສາມາດເຫັນໄດ້ວ່າພວກເຮົາໄດ້ເອີ້ນວ່າ InitBlockChain() ແລະພວກເຮົາໄດ້ມອບຫມາຍໃຫ້ຕົວແປຂອງລະບົບຕ່ອງໂສ້. 
  • ຕໍ່ໄປ, ພວກເຮົາກໍາລັງເພີ່ມບລັອກຜ່ານລະບົບ chain.AddBlock, ແລະພວກເຮົາຜ່ານຂໍ້ມູນທີ່ຈໍາເປັນ. 
  • ປະຕິບັດຕາມນີ້, ພວກເຮົາດໍາເນີນການສໍາລັບ loop ເພື່ອກວດສອບ blockchain ໄດ້. ຫຼັງຈາກນັ້ນ, ພວກເຮົາແຍກແຕ່ລະຕັນແລະພິມພາກສະຫນາມພາຍໃນແຕ່ລະຕັນ. ພວກເຮົາພຽງແຕ່ພິມ:

fmt.Printf(“Hash ກ່ອນໜ້າ: %x\n”, block.PrevHash)

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

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

ຜົນໄດ້ຮັບ: 

ດັ່ງນັ້ນ, ພວກເຮົາສາມາດເວົ້າໄດ້ວ່າໂຄງການແມ່ນປະສົບຜົນສໍາເລັດ. ຂ້າພະເຈົ້າຫວັງວ່າທ່ານຈະສາມາດເຂົ້າໃຈການປະຕິບັດແນວຄວາມຄິດຂອງ blockchain ໃນ Golang ໄດ້. ພຽງແຕ່ສືບຕໍ່ປະຕິບັດແລະທ່ານຈະສາມາດຈັດການກັບໂຄງການ intricate. 

crypto ຂອງເຈົ້າສົມຄວນໄດ້ຮັບຄວາມປອດໄພທີ່ດີທີ່ສຸດ. ໄດ້ຮັບ ກ Ledger hardware wallet ພຽງ $79!

ທີ່ມາ: https://coinfomania.com/build-a-blockchain-in-golang/