จะสร้าง Blockchain ด้วย Python ได้อย่างไร?

เผยแพร่แล้ว: 2021-11-03

คุณรู้หรือไม่ว่า Bitcoin ถูกสร้างขึ้นบน Blockchain? วันนี้เราจะมาสร้างบล็อคเชนด้วย Python ตั้งแต่เริ่มต้น

บล็อคเชนคืออะไร?

ในปี 2008 กระดาษ Bitcoin ถูกตีพิมพ์โดยบุคคลหรือกลุ่มที่ไม่รู้จักชื่อ Satoshi Nakamoto Bitcoin ออกมาเป็นเงินสดอิเล็กทรอนิกส์แบบเพียร์ทูเพียร์ที่อนุญาตการทำธุรกรรมโดยไม่ต้องผ่านสถาบันที่รวมศูนย์ (ธนาคาร) คนส่วนใหญ่ไม่ทราบว่าในรายงานฉบับเดียวกันนั้น Satoshi ได้กำหนดวิธีการจัดเก็บข้อมูลแบบกระจาย ซึ่งปัจจุบันรู้จักกันในชื่อ Blockchain

เทคโนโลยีบล็อคเชน
เทคโนโลยีบล็อคเชน

พูดง่ายๆ ก็คือ Blockchain เป็นบัญชีแยกประเภทดิจิทัลที่ใช้ร่วมกันและไม่เปลี่ยนรูป ซึ่งจัดเก็บธุรกรรมผ่านเครือข่ายคอมพิวเตอร์ที่มีการกระจายอำนาจ

เราสามารถแบ่ง Blockchain ออกเป็นสองคำง่ายๆ:

  • บล็อก: พื้นที่ที่เราจัดเก็บธุรกรรม
  • เชน: ชุดของเร็กคอร์ดที่เชื่อมโยง

สิ่งนี้กำหนด Blockchain เป็นห่วงโซ่ของบล็อกที่เชื่อมโยง โดยที่แต่ละบล็อกจัดเก็บธุรกรรมที่ทำด้วยพารามิเตอร์เฉพาะ

แต่ละบล็อกถูกสร้างขึ้นบนอีกบล็อกหนึ่ง สร้างห่วงโซ่ของบล็อกที่ไม่สามารถย้อนกลับได้ กล่าวอีกนัยหนึ่ง ทุกบล็อกขึ้นอยู่กับบล็อกอื่น สิ่งนี้กลายเป็นระบบที่แข็งแกร่งและไม่เปลี่ยนแปลงซึ่งทุกคนที่มีสิทธิ์ที่ถูกต้องสามารถตรวจสอบความสมบูรณ์ได้

Blockchain แนะนำชุดคุณสมบัติที่น่าสนใจ:

  • ประวัติศาสตร์ที่ไม่เปลี่ยนรูป
  • ความคงอยู่ของข้อมูล
  • ไม่มีข้อผิดพลาดกับข้อมูลที่เก็บไว้

ปัจจุบันระบบจำนวนมากพึ่งพา Blockchain เช่น cryptocurrencies การโอนสินทรัพย์ (NFTs) และอาจมีการลงคะแนนเสียงในอนาคตอันใกล้

เป็นมูลค่าการกล่าวขวัญว่า Python Blockchain ไม่จำเป็นต้องเป็นโปรแกรมที่ซับซ้อนที่มีโค้ดหลายพันบรรทัด หัวใจหลักของมันคือรายการธุรกรรมที่เชื่อมโยงถึงกัน

แน่นอนว่านี่เป็นคำอธิบายสั้นๆ แต่ถ้าคุณต้องการคำแนะนำฉบับเต็ม เราได้จัดทำบทแนะนำที่สมบูรณ์เกี่ยวกับ Blockchain สำหรับผู้เริ่มต้น ให้แน่ใจว่าได้ตรวจสอบออก

มาสร้าง Blockchain อย่างง่ายด้วย Python กันโดยไม่ชักช้า

การสร้างบล็อคเชนด้วย Python

ก่อนเริ่ม ให้กำหนดสิ่งที่เราจะทำในบทช่วยสอนนี้:

  • สร้างระบบ Blockchain อย่างง่ายที่เขียนด้วย Python
  • ใช้ Blockchain ของเรากับธุรกรรมที่กำหนดไว้ล่วงหน้าซึ่งแสดงเป็นสตริง
  • ทดสอบความไม่เปลี่ยนรูปของ Blockchain ของเรา

เราจะไม่ใช้ JSON แต่เป็นรายการ Python สิ่งนี้จะช่วยให้เราลดความซับซ้อนของกระบวนการและมุ่งเน้นไปที่การนำแนวคิดหลักของ Blockchain ไปใช้

สิ่งที่คุณจะต้องทำตามบทช่วยสอนนี้:

  • การทำความเข้าใจคลาสและเมธอดใน Python
  • การใช้งานบรรทัดคำสั่งเบื้องต้น

การสร้างคลาสบล็อก

เปิดตัวแก้ไขโค้ดที่คุณชื่นชอบและสร้างไฟล์ main.py นี่จะเป็นไฟล์ที่เราจะใช้งานด้วย

ตอนนี้ นำเข้า hashlib ซึ่งเป็นโมดูลที่ช่วยให้เราสร้างข้อความที่เข้ารหัสทางเดียวได้ เทคนิคการเข้ารหัสเช่นการแฮชทำให้ Blockchain สร้างธุรกรรมที่ปลอดภัย

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

สำหรับตอนนี้ เพียงนำเข้าโมดูล hashlib ในตัว:

 # main.py file """ A simple Blockchain in Python """ import hashlib

โมดูลนี้มีอัลกอริธึมการแฮชส่วนใหญ่ที่คุณต้องการ จำไว้ว่าเราจะใช้ ฟังก์ชัน hashlib.sha256()

ตอนนี้ เข้าสู่ GeekCoinBlock ซึ่งเป็นชื่อบล็อกเชนดั้งเดิมของเรา

 class GeekCoinBlock: def __init__(self, previous_block_hash, transaction_list): self.previous_block_hash = previous_block_hash self.transaction_list = transaction_list self.block_data = f"{' - '.join(transaction_list)} - {previous_block_hash}" self.block_hash = hashlib.sha256(self.block_data.encode()).hexdigest()

ฉันรู้ว่าสิ่งนี้อาจส่งผลให้โค้ดไม่เป็นระเบียบ มาแยกย่อยแต่ละส่วนกันในหัวข้อถัดไป

คำอธิบาย GeekCoinBlock

ขั้นแรก เราสร้างคลาสชื่อ GeekCoinBlock ซึ่งเป็น wrapper สำหรับอ็อบเจกต์ที่จะมีลักษณะเฉพาะ (แอตทริบิวต์) และพฤติกรรม (เมธอด) บางอย่าง

จากนั้นเรากำหนด เมธอด __ init__ (เรียกอีกอย่างว่าคอนสตรัคเตอร์) ซึ่งจะถูกเรียกใช้ทุกครั้งที่สร้างอ็อบเจกต์ GeekCoinBlock

วิธีนี้มีสามพารามิเตอร์:

  • ตนเอง (ตัวอย่างของแต่ละวัตถุ)
  • Previous_block_hash (อ้างอิงถึงบล็อกก่อนหน้า)
  • transaction_list (รายการธุรกรรมที่ทำในบล็อกปัจจุบัน)

เราเก็บแฮชและรายการธุรกรรมก่อนหน้า และสร้างตัวแปรอินสแตนซ์ block_data เป็นสตริง สิ่งนี้ไม่ได้เกิดขึ้นกับ cryptocurrencies จริง ๆ ซึ่งเราจัดเก็บข้อมูลประเภทนั้นเป็นแฮชอื่น แต่เพื่อความเรียบง่าย เราจะจัดเก็บข้อมูลทุกบล็อกเป็นสตริง

สุดท้าย เราสร้าง block_hash ซึ่งบล็อกอื่น ๆ จะใช้เพื่อดำเนินการต่อ นี่คือสิ่งที่ hashlib มีประโยชน์ แทนที่จะสร้างฟังก์ชันแฮชแบบกำหนดเอง เราสามารถใช้ sha256 ที่ สร้างไว้ล่วงหน้าเพื่อสร้างบล็อกที่ไม่เปลี่ยนรูปได้

ฟังก์ชันนี้รับสตริงที่เข้ารหัส (หรือไบต์) เป็นพารามิเตอร์ นั่นเป็นเหตุผลที่เราใช้ เมธอด block_data.encode() หลังจากนั้น เราเรียก hexdigest() เพื่อส่งคืนข้อมูลที่เข้ารหัสในรูปแบบเลขฐานสิบหก

ฉันรู้ว่าทั้งหมดนี้สามารถครอบงำได้ ดังนั้นมาเล่นกับ hashlib บน Python shell กันดีกว่า

 In [1]: import hashlib In [2]: message = "Python is great" In [3]: h1 = hashlib.sha256(message.encode()) In [4]: h1 Out[4]: <sha256 ... object @ 0x7efcd55bfbf0> In [5]: h1.hexdigest() Out[5]: 'a40cf9cca ... 42ab97' In [6]: h2 = hashlib.sha256(b"Python is not great") In [7]: h2 Out[7]: <sha256 ... object @ 0x7efcd55bfc90> In [8]: h2.hexdigest() Out[8]: 'fefe510a6a ... 97e010c0ea34'

อย่างที่คุณเห็น การเปลี่ยนแปลงเล็กน้อยในอินพุต เช่น "Python ดีมาก" เป็น "Python ไม่ดี" สามารถสร้าง hash ที่แตกต่างกันโดยสิ้นเชิง ทั้งหมดนี้เกี่ยวข้องกับความสมบูรณ์ของ Blockchain หากคุณแนะนำการเปลี่ยนแปลงเล็กน้อยในบล็อคเชน แฮชของมันจะเปลี่ยนไปอย่างมาก นี่คือเหตุผลที่คำว่า “คุณไม่สามารถทำลายบล็อคเชนได้” เป็นความจริง

ใช้คลาสบล็อกของเรา

เราจะสร้างคลาส Blockchain ทั้งหมดในภายหลัง แต่ตอนนี้ ลองใช้คลาส Block ของเราเพื่อสร้างบล็อกเชน (Blockchain)

ในไฟล์เดียวกัน ให้สร้างธุรกรรมสองรายการซึ่งประกอบด้วยสตริงอย่างง่ายที่จัดเก็บไว้ในตัวแปร เช่น

 class GeekCoinBlock: ... t1 = "Noah sends 5 GC to Mark" t2 = "Mark sends 2.3 GC to James" t3 = "James sends 4.2 GC to Alisson" t4 = "Alisson sends 1.1 GC to Noah"

แน่นอน GC หมายถึง GeekCoin

ตอนนี้ สร้างบล็อคแรกของบล็อคเชนของเราโดยใช้คลาส GeekCoinBlock และพิมพ์คุณลักษณะของมัน คำนึงว่าพารามิเตอร์ previous_hash ของบล็อกกำเนิด (บล็อกแรกที่นำหน้าบล็อกอื่น ๆ ) มักจะมีบางสตริงโดยพลการหรือกัญชาในกรณีนี้“firstblock.”

 block1 = GeekCoinBlock('firstblock', [t1, t2]) print(f"Block 1 data: {block1.block_data}") print(f"Block 1 hash: {block1.block_hash}")

จากนั้นเราจะทำเช่นเดียวกันกับบล็อกที่สอง แต่ผ่านกัญชาบล็อกแรกเป็นอาร์กิวเมนต์ previous_hash

 block2 = GeekCoinBlock(block1.block_hash, [t3, t4]) print(f"Block 2 data: {block2.block_data}") print(f"Block 2 hash: {block2.block_hash}")

มาเรียกใช้และวิเคราะห์ผลลัพธ์ที่เราได้รับจากโค้ดชิ้นนี้ อีกครั้ง พิมพ์เทอร์มินัลของคุณ:

 ❯ python main.py Block 1 data: Noah sends 5 GC to Mark - Mark sends 2.3 GC to James - firstblock Block 1 hash: 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 hash: 448c4306caf7f6937b0307f92f27fbea3bb73b3470363dee5026a1209dadcfa8

สำหรับตอนนี้ คุณจะเห็นเฉพาะข้อความและแฮช 64 อักขระ แต่กลไกของ Blockchain จะกลับมาทำงานอีกครั้ง

คุณเริ่มต้นด้วยบล็อกกำเนิด ซึ่งเป็นฐานของบล็อกอื่นๆ ทั้งหมด

ใครๆ ก็สามารถตรวจสอบความถูกต้องของห่วงโซ่ได้ และนั่นคือสาเหตุที่ Blockchain เป็นระบบที่ปลอดภัย ตัวอย่างเช่น หากเราแก้ไขเนื้อหาของธุรกรรมเล็กน้อย ให้พูดว่า:

 t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James"

เราเห็นการเปลี่ยนแปลงอย่างมากในแฮชของบล็อก

 Block 1 data: Noah sends 5 GC to Mark - Mark sends 3.2 GC to James - firstblock Block 1 hash: 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 hash: 569b977306ce88b53e001dca7ba00c03a51c60d6df4650e7657dcd136f2da0ac

คุณสามารถดูโครงการปัจจุบันได้ใน repo GitHub นี้

การเข้ารหัส Blockchain

มันไม่ฉลาดนักที่จะยึดความสมบูรณ์ของระบบของเราบนตัวแปรที่เข้ารหัสด้วยมือ ดังนั้นเราจึงต้องการแนวทางอื่น

เรามีบล๊อก ถึงเวลาสร้างคลาสที่รวมพวกเขาเข้ากับบล็อกเชน

เริ่มต้นด้วยการลบธุรกรรมก่อนหน้าและบล็อกวัตถุ จากนั้นใช้รหัสด้านล่าง

 # main.py class Blockchain: def __init__(self): self.chain = [] self.generate_genesis_block() def generate_genesis_block(self): self.chain.append(GeekCoinBlock("0", ['Genesis Block'])) def create_block_from_transaction(self, transaction_list): previous_block_hash = self.last_block.block_hash self.chain.append(GeekCoinBlock(previous_block_hash, transaction_list)) def display_chain(self): for i in range(len(self.chain)): print(f"Data {i + 1}: {self.chain[i].block_data}") print(f"Hash {i + 1}: {self.chain[i].block_hash}\n") @property def last_block(self): return self.chain[-1]

นี่เป็นโค้ดชิ้นใหญ่อีกครั้ง มาทำลายแต่ละส่วนกัน:

  • self.chain — รายการที่บล็อกทั้งหมดถูกบันทึก เราสามารถเข้าถึงแต่ละบล็อกผ่านดัชนีรายการ
  • generate_genesis_block - ผนวกกำเนิดหรือบล็อกแรกที่ห่วงโซ่ แฮชก่อนหน้าของบล็อกคือ “0” และรายการธุรกรรมเป็นเพียง “Genesis Block”
  • create_block_from_transaction — สิ่งนี้ทำให้เราสามารถผนวกบล็อกเข้ากับเชนด้วยรายการธุรกรรมเท่านั้น การสร้างบล็อกด้วยตนเองทุกครั้งที่เราต้องการบันทึกธุรกรรมจะเป็นเรื่องที่น่ารำคาญมาก
  • display_chain — พิมพ์ chain ของบล็อกด้วย for loop
  • last_block — คุณสมบัติที่ช่วยให้เราเข้าถึงองค์ประกอบสุดท้ายของห่วงโซ่ เราใช้มันในวิธี create_block_from_transaction

มาทดสอบบล็อคเชนนี้กัน

 # main.py import hashlib class GeekCoinBlock: ... class Blockchain: ... t1 = "George sends 3.1 GC to Joe" t2 = "Joe sends 2.5 GC to Adam" t3 = "Adam sends 1.2 GC to Bob" t4 = "Bob sends 0.5 GC to Charlie" t5 = "Charlie sends 0.2 GC to David" t6 = "David sends 0.1 GC to Eric" myblockchain = Blockchain() myblockchain.create_block_from_transaction([t1, t2]) myblockchain.create_block_from_transaction([t3, t4]) myblockchain.create_block_from_transaction([t5, t6]) myblockchain.display_chain()

ตอนนี้ เรียกใช้ไฟล์ main.py

 Data 1: Genesis Block - 0 Hash 1: 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Data 2: George sends 3.1 GC to Joe - Joe sends 2.5 GC to Adam - 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Hash 2: 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Data 3: Adam sends 1.2 GC to Bob - Bob sends 0.5 GC to Charlie - 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Hash 3: 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Data 4: Charlie sends 0.2 GC to David - David sends 0.1 GC to Eric - 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Hash 4: 869df2f03c9860767d35b30a46233fbeea89a3000ae5019d1491e3829d1ab929

ยินดีด้วย! คุณเพิ่งสร้าง Python Blockchain อย่างง่ายตั้งแต่เริ่มต้น

ตอนนี้คุณสามารถเสริมความแข็งแกร่งให้กับความไม่เปลี่ยนรูปของบล็อคเชนโดยใช้ตัวรับและตัวตั้งค่า และใช้คุณสมบัติอื่นๆ เช่น การพิสูจน์การทำงาน การขุด หรือแนวคิดอื่นๆ ที่เราได้อธิบายไว้ในบทความพื้นฐานของการขุด Bitcoin

บทสรุป

Blockchain เป็นเทคโนโลยีที่อยู่เบื้องหลัง Bitcoin, Etherium และสกุลเงินดิจิตอลอื่น ๆ ทั้งหมด ในบทความนี้ คุณได้เรียนรู้วิธีสร้างบล็อคเชนด้วย Python โดยใช้อัลกอริทึมแฮช เช่น sha256 คลาส และอ็อบเจกต์

ความท้าทายของคุณคือการสร้างระบบการขุด และทำไมไม่ลองใช้งานกับ REST API โดยใช้เฟรมเวิร์กอย่าง Django หรือ Flask

หลายคนกำลังสร้างโชคชะตาจากเงินดิจิตอล ลองนึกภาพว่าคุณจะทำอะไรได้บ้างถ้าคุณสร้างมันขึ้นมาด้วยตัวเอง

เก็บรหัส!