สร้างบล็อกเชนใน Golang ตั้งแต่เริ่มต้น

ในบทความนี้ เราจะเน้นไปที่การพัฒนา Go blockchain ตั้งแต่เริ่มต้น อย่างไรก็ตาม ก่อนที่เราจะเริ่มต้น คุณควรแน่ใจว่าคุณคุ้นเคยกับแนวคิดพื้นฐานใน Golang หากไม่เป็นเช่นนั้น จะเป็นการฉลาดหากคุณผ่านแนวความคิดเบื้องต้นแล้วกลับมาที่บล็อคเชน 

ดังนั้นให้เราตรงไปที่หัวข้อ 

เริ่มต้นด้วยไดเร็กทอรีใหม่ 

เราจะสร้างไดเร็กทอรีใหม่เพื่อเริ่มต้น สมมุติว่าไดเร็กทอรีนี้มีชื่อ "blockchain" เราจะพิมพ์รหัสใน Command Prompt (หรือถ้าคุณใช้ macOS หรือ Linux คุณต้องใช้ Terminal) ดังนั้นเราจึงพิมพ์:

cd go-พื้นที่ทำงาน 

mkdir บล็อกเชน 

บล็อกเชนซีดี 

รหัส

เมื่อ VS Code เปิดขึ้น เราจะสร้างโมดูล Go ใน Command Prompt เราจะทำอย่างไร? เราพิมพ์ว่า:

ไป mod init github.com/golang-company/blockchain

การเข้ารหัสใน main.go 

ต่อไป เราจะสร้างไฟล์ต้นฉบับ Go ชื่อ 'main.go' และเราจะพิมพ์โค้ดลงไป แต่ก่อนอื่นให้เราเข้าใจว่า blockchain คืออะไร อา blockchain อาจถูกกำหนดให้เป็นฐานข้อมูลสาธารณะที่มีการกระจายอำนาจและกระจายในหมู่เพื่อนหลาย ๆ คน Blockchain ช่วยให้ฐานข้อมูลสามารถแก้ไขตัวเองได้ แม้ว่าโหนดจะสร้างข้อมูลที่ไม่ถูกต้องก็ตาม 

โดยปกติ บล็อกบนบล็อกเชนประกอบด้วยข้อมูลที่เราแชร์ในฐานข้อมูล แฮช และแฮชเข้ารหัสของบล็อกก่อนหน้า 

 แล้วคุณล่ะ พร้อมหรือยัง ไปพัฒนาบล็อคเชน? ยอดเยี่ยม! มาเริ่มกันเลย. 

ส่วนการเขียนโปรแกรม 

ในส่วนนี้เราจะดูที่ไฟล์ main.go 

แพ็คเกจหลัก

นำเข้า (

"ไบต์"

“คริปโต/sha256” 

"เอฟเอ็ม" 

)

พิมพ์ Cryptoblock struct {

แฮช [] ไบต์ 

ข้อมูล [] ไบต์ 

PrevHash [] ไบต์ 

}

  • อย่างที่คุณเห็น มีการสร้างโครงสร้างเท่านั้น 

func (c *Cryptoblock) BuildHash () {

รายละเอียด := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

แฮช := sha256.Sum256(รายละเอียด)

ค.แฮช = แฮช[ : ]

}

  • ตอนนี้เราจะสร้างวิธีการที่จะช่วยให้เราสร้างแฮชโดยขึ้นอยู่กับข้อมูลและแฮชก่อนหน้า เราจะนำเข้าไลบรารี "ไบต์" เพราะเราจะใช้มัน
  • ขั้นตอนต่อไปคือการสร้างตัวแปรที่เรียกว่ารายละเอียดและใช้ไบต์ชนิดข้อมูล เราจะใช้ Join() เพื่อเชื่อมต่อส่วนของไบต์

รายละเอียด := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

ที่นี่ เรากำลังแยกไบต์ 2 มิติ เราส่ง c.Data และแฮชก่อนหน้า จากนั้นเราจะรวมส่วนที่ว่างเปล่าของไบต์ 

  • ต่อไปนี้ เรากำลังสร้างแฮชจริงโดยใช้ฟังก์ชันแฮช sum256 ในรายละเอียด เราสามารถใช้สิ่งนี้ได้เนื่องจากเราจะนำเข้าไลบรารี sha256 
  • ต่อไป เราพุชแฮชที่สร้างลงในฟิลด์แฮชสำหรับบล็อก 

func BuildBlock (สตริงข้อมูล prevHash [] ไบต์) *Cryptoblock {

บล็อก := &Cryptoblock{[]byte{}, []byte(data), prevHash}

block.BuildHash()

บล็อกส่งคืน

  • ตอนนี้เราจะสร้างฟังก์ชันที่ช่วยให้สามารถสร้าง Block ได้ ฟังก์ชันยอมรับสตริงของข้อมูลเป็นอินพุต prevHash จากบล็อกก่อนหน้าเป็นอินพุต แล้วส่งออกข้อมูลอ้างอิงไปยัง Cryptoblock เราจะสร้างบล็อกโดยใช้ตัวสร้างบล็อก 
  • &Cryptoblock ทำหน้าที่เป็นตัวอ้างอิงไปยังบล็อก สำหรับช่อง Hash เรารวมส่วนที่ว่างเปล่าของไบต์ สำหรับเขตข้อมูล Data เราจะนำสตริงข้อมูลมาแปลงเป็นส่วนของไบต์ และเรารวม prevHash ไว้ในฟิลด์ PrevHash 
  • สุดท้าย เราเรียก BuildHash() บนบล็อกและเราส่งคืนบล็อก 

พิมพ์โครงสร้าง BlockChain {

บล็อค []*Cryptoblock

}

  • จำเป็นต้องมีประเภทที่จะช่วยในการแสดงบล็อคเชน และเรานำโครงสร้างมาใช้เพื่อบรรลุสิ่งนี้ ประเภท BlockChain struct ประกอบด้วยอาร์เรย์ของตัวชี้ไปยัง Cryptoblock

func (โซ่ * BlockChain) AddBlock (สตริงข้อมูล) {

ก่อนหน้าBlock := chain.blocks[len(chain.blocks)-1]

ใหม่ := BuildBlock (ข้อมูล prevBlock.Hash)

chain.blocks = ผนวก (chain.blocks ใหม่)

}

  • ที่นี่ เรากำลังสร้างวิธีการที่ทำให้เราเข้าร่วมบล็อกกับเชนได้ วิธีการดึงตัวชี้บล็อกเชน ต่อไปนี้จะยอมรับสตริงข้อมูล 
  • เรียก chain.blocks เราไปที่บล็อกก่อนหน้าในบล็อกเชน ต่อไป เราผ่านความยาวของบล็อคเชน [len(chain.blocks)-1]
  • ในตัวแปรใหม่นี้ เรากำลังเรียกใช้ฟังก์ชัน BuildBlock และเรากำลังส่งสตริงข้อมูลและ prevBlock.Hash
  • ด้วยการใช้ฟังก์ชันผนวก เพิ่มสิ่งนี้ใน chain.blocks เราจะแนบบล็อกใหม่เข้ากับบล็อกเชน

func การเริ่มต้น () * Cryptoblock {

ส่งคืน BuildBlock("Inception", []byte{})

}

  • ขั้นตอนต่อไปคือการสร้างฟังก์ชันที่เรียกว่า Inception ซึ่งจะอธิบายบล็อคแรกของบล็อคเชน และเราจะส่งคืน BuildBlock ใหม่ในฟังก์ชันพร้อมกับข้อมูลในบล็อกแรก ที่นี่. ฉันได้รวม "Inception" และส่วนของไบต์ซึ่งแสดงถึงแฮชก่อนหน้าที่ว่างเปล่า 

func InitBlockChain() *บล็อคเชน {

ส่งคืน &BlockChain{[]*Cryptoblock{Inception()}}

}

  • เพื่อสร้างบล็อคเชนแรก ฉันได้แนะนำฟังก์ชัน InitBlockChain ที่นี่ ฉันแค่ส่งคืนการอ้างอิงเฉพาะไปยัง BlockChain ต่อไป เราสร้างอาร์เรย์ของ Cryptoblock ซึ่งเราจะเรียกใช้ฟังก์ชัน Inception 

ฟังก์ชั่นหลัก () {

เชน := InitBlockChain()

chain.AddBlock (“บล็อกแรกหลังก่อตั้ง”)

chain.AddBlock(“บล็อกที่สองหลังจากเริ่มก่อตั้ง”)

chain.AddBlock(“บล็อกที่สามหลังจากเริ่มก่อตั้ง”)

สำหรับ _, block := range chain.blocks {

fmt.Printf(“แฮชก่อนหน้า: %x\n”, block.PrevHash)

fmt.Printf("ข้อมูลในบล็อก: %s\n", block.Data)

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

}

}

  • ในที่สุดเราก็มาถึงหน้าที่หลักแล้ว อย่างที่คุณเห็นเราได้เรียก InitBlockChain() และเราได้กำหนดมันให้กับตัวแปรลูกโซ่ 
  • ต่อไป เรากำลังเพิ่มบล็อคให้กับ chain ผ่านทาง chain.AddBlock และเราส่งข้อมูลที่จำเป็น 
  • ต่อจากนี้ เราเรียกใช้ for loop เพื่อตรวจสอบ blockchain จากนั้นเราแยกแต่ละบล็อกออกและพิมพ์ฟิลด์ภายในแต่ละบล็อก เราเพียงแค่พิมพ์:

fmt.Printf(“แฮชก่อนหน้า: %x\n”, block.PrevHash)

fmt.Printf("ข้อมูลในบล็อก: %s\n", block.Data)

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

Output: 

ดังนั้นเราจึงสามารถพูดได้ว่าโปรแกรมประสบความสำเร็จ ฉันหวังว่าคุณจะสามารถเข้าใจการนำแนวคิดของ blockchain ไปใช้ใน Golang เพียงแค่ฝึกฝนต่อไป คุณก็จะสามารถจัดการกับโปรเจ็กต์ที่ซับซ้อนได้ 

การเข้ารหัสลับของคุณสมควรได้รับการรักษาความปลอดภัยที่ดีที่สุด ได้รับ กระเป๋าเงินฮาร์ดแวร์ Ledger เพียง $79!

ที่มา: https://coinfomania.com/build-a-blockchain-in-golang/