ในบทความนี้ เราจะเน้นไปที่การพัฒนา 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/