23 มิถุนายน 2560

Published 6/23/2560 by with 0 comment

Blockchain เบื้องต้นด้วย Python

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปทดลองศึกษาและสร้าง blockchains เบื้องต้นเพื่อการศึกษาด้วย Python กันครับ


ก่อนอื่น ผู้อ่านควรมีความรู้เบื้องต้นเกี่ยวกับ blockchain ให้ศึกษา Blockchain จากบทความ "Blockchain คืออะไร? อธิบายแบบละเอียด แต่เข้าใจง่าย(มั้ง)" ที่ https://nuuneoi.com/blog/blog.php?read_id=900 ก่อนอ่านบทความนี้

Blockchain เบื้องต้นด้วย Python
หลักการของ blockchain แบบสั้น ๆ คือ ฐานข้อมูลแบบไม่อาศัยศูนย์กลาง โดยข้อมูลทุกข้อมูลจะถูกกระจายไปยังทุกคนที่ใช้ฐานข้อมูลนี้และไม่มีใครเป็นศูนย์กลางฐานข้อมูลนี้

บทความนี้จะใช้โค้ดจาก https://github.com/daneah/toyblocks เพื่อศึกษาหลักการ blockchain โดยจำลอง blockchain บนเครื่องที่รัน

ขั้นแรกให้ทำ โหลด https://github.com/daneah/toyblocks จาก https://github.com/daneah/toyblocks/archive/master.zip มาไว้ในเครื่องก่อน แตกไฟล์ แล้วเปิดคอมมาไลน์เข้าไปยังโฟลเดอร์ที่เก็บไฟล์

ทำการเรียกใช้งาน python ด้วยคำสั่ง python
แล้วเรียกใช้ด้วยคำสั่ง
>>> import block
>>> import blockchain

สมมติว่า เราต้องการสร้าง Block เพื่อเก็บข้อมูล "block1 ^^"
โดยข้อมูลที่ต้องการเก็บนี้ เปรียบเสมือน Transaction
ต้องใช้คำสั่ง
>>> block1 = block.Block('block1 ^^')

Blockchain จะสร้าง block1 โดยมีการหาค่า Hash ของข้อมูล แล้วนำค่าดังกล่าวใส่เข้าไปใน block1 ด้วย

ต่อมาสร้างฐานข้อมูล Blockchain ด้วย chain (ห่วงโซ่ block) ด้วยคำสั่ง
>>> chain = blockchain.Blockchain()

แล้วเพิ่ม block1 เข้าไปใน chain
>>> chain.add_block(block1)

แต่เมื่อเช็คสถานะการยืนยันของ block1

สถานะของ block1 กลับยังไม่ได้รับการยืนยัน โดยดูจากค่า Nonce: None เพราะต้องผ่าน Miner เพื่อยืนยันก่อนนำข้อมูลไปใช้ ทำการยืนยัน block1 โดยใช้คำสั่ง
>>> block1.mine()

block1 ได้ผ่าน Miner ยืนยันแล้ว

โดย Miner จะต้องผ่าน Proof of Work เพื่อหาค่ามายืนยัน block1 เมื่อได้ค่ามาแล้ว นั่นคือ 47786 ทำการจับค่านี้ลงกล่อง แล้วปิดกล่อง block1 เรียบร้อย

เมื่อเราเพิ่ม block อีก block ชื่อ block2 และ block3 เข้าไปใน chain

แล้วเมื่อเช็คข้อมูล block ใน chain ใช้คำสั่ง chain.blocks

จะเห็นได้ว่า ทุก block ที่ต่อกันจะมีการอ้างอิง block ก่อนหน้า ยกเว้น block1 (อันล่างสุด) จะไม่มีการอ้างอิง

จะเกิดอะไรขึ้น หากมีโจรแอบไปเปิด block2 แก้ไขข้อมูลภายใน

ผลคือ
>>> chain.block_is_broken(block2)
True

block2 พัง เพราะค่า Hash เปลี่ยนเนื่องจากมีการแก้ไขข้อมูล และไม่ได้รับการยืนยันโดย Miner
>>> print(chain.broken) 
True

เป็นผลทำให้ chain พังไปด้วย

เพราะ ค่า Hash ที่ block ต่อมา คือ block3 ไม่เจอค่า Hash ของ block2 ที่อ้างอิง

เราจึงต้องซ่อม block2 หรือซ่อม chain ด้วยคำสั่ง
>>> chain.repair_block(block2)
Repairing block 4007a33cc2b647e1a4c766ad0b5e2b2e
>>> chain.repair
>>> chain.block_is_broken(block2)
False
>>> print(chain.broken) 
False

เพียงเท่านี้ เราก็สามารถใช้ chain ต่อไปได้

จะเกิดอะไรขึ้น หากมีโจรแอบไปเปิด block2 แก้ไขข้อมูลภายใน แล้วโจรทำการยืนยันโดยโจรเป็น Miner เอง และผ่าน Proof of Work หาค่ามายืนยัน block2 ได้สำเร็จ

แม้ว่า พอเช็ค block2 ถึง block2 จะไม่พัง
>>> chain.block_is_broken(block2)
False

แต่ chain พัง เนื่องจาก block3 อ้างอิงค่า Hash ของ block2 ไม่พบ
>>> print(chain.broken) 
True

แม้ว่าโจรจะพยายามซ่อมทั้ง block2 , block3 และซ่อม chain ก็ตาม

แต่ไม่สามารถทำได้ เนื่องจากค่า Hash ที่เปลี่ยนไป ส่งผลทำให้ฐานข้อมูล Blockchain พังไปเลย

นี่คือเหตุผลว่าทำไม Blockchain ถึงปลอดภัยและและ Proof of Work ถึงสำคัญ เพราะไม่มีโอกาสที่จะไปแก้ไขข้อมูลในกล่อง block ใน chain โดยที่ไม่ทำ block หรือ chain พัง แทบจะเป็นไปไม่ได้เลย

หวังว่าบทความนี้จะช่วยทำให้ผู้อ่านเข้าใจ Blockchain ยิ่งขึ้นจากการปฎิบัติด้วยโค้ด Python

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)