كيفية إنشاء Blockchain باستخدام Python؟
نشرت: 2021-11-03هل تعلم أن Bitcoin مبني على قمة Blockchain؟ سنقوم اليوم ببناء Blockchain باستخدام Python من البداية.
ما هو Blockchain؟
في عام 2008 تم نشر ورقة البيتكوين من قبل شخص أو مجموعة غير معروفة يُدعى ساتوشي ناكاموتو. ظهرت Bitcoin كإصدار من نظير إلى نظير للنقد الإلكتروني الذي سمح بالمعاملات دون المرور عبر مؤسسات مركزية (بنوك). لا يعرف معظم الناس أنه في نفس الورقة ، حدد ساتوشي طريقة موزعة لتخزين المعلومات ، تُعرف في الوقت الحاضر باسم Blockchain.

ببساطة ، Blockchain عبارة عن دفتر أستاذ رقمي مشترك وغير قابل للتغيير يخزن المعاملات عبر شبكة لامركزية من أجهزة الكمبيوتر.
يمكننا تقسيم Blockchain إلى فترتين بسيطتين:
- الكتلة: مساحة حيث نقوم بتخزين المعاملات
- سلسلة: مجموعة من السجلات المرتبطة
يعرّف هذا Blockchain على أنه سلسلة من الكتل المرتبطة ، حيث تخزن كل كتلة معاملة تم إجراؤها باستخدام معلمات محددة.
تم بناء كل كتلة فوق كتلة أخرى ، مما يؤدي إلى إنشاء سلسلة من الكتل لا رجعة فيها. بمعنى آخر ، كل كتلة تعتمد على أخرى. يتحول هذا إلى نظام قوي وغير قابل للتغيير حيث يمكن لأي شخص لديه الأذونات الصحيحة مراجعة النزاهة.
تقدم Blockchain مجموعة مثيرة للاهتمام من الميزات:
- ثبات التاريخ
- ثبات المعلومات
- لا توجد أخطاء في البيانات المخزنة
تعتمد الكثير من الأنظمة حاليًا على Blockchain ، مثل العملات المشفرة ، ونقل الأصول (NFTs) ، وربما في المستقبل القريب ، التصويت.
من الجدير بالذكر أن Python Blockchain يجب ألا يكون برنامجًا معقدًا يحتوي على آلاف الأسطر من التعليمات البرمجية. في جوهرها ، ستكون قائمة المعاملات المرتبطة ببعضها البعض.
بالطبع ، كان هذا شرحًا موجزًا ، ولكن إذا كنت تريد دليلًا كاملاً ، فقد أنتجنا برنامجًا تعليميًا كاملاً عن Blockchain للمبتدئين. تأكد من التحقق من ذلك.
بدون مزيد من التأخير ، لنقم ببناء Blockchain بسيط باستخدام Python.
بناء Blockchain باستخدام Python
قبل البدء ، دعنا نحدد ما سنفعله في هذا البرنامج التعليمي:
- قم ببناء نظام Blockchain بسيط مكتوب بلغة Python
- استخدم Blockchain الخاص بنا مع المعاملات المحددة مسبقًا التي يتم تمثيلها كسلاسل
- اختبر ثبات Blockchain الخاص بنا
لن نستخدم JSON لكن قوائم بايثون. سيتيح لنا ذلك تبسيط العملية والتركيز على تطبيق المفاهيم الأساسية لـ Blockchain.
ما عليك اتباع هذا البرنامج التعليمي:
- فهم الطبقات والطرق في بايثون
- الاستخدام الأساسي لسطر الأوامر
إنشاء فئة البلوك
افتح محرر الكود المفضل لديك وأنشئ ملف main.py. سيكون هذا هو الملف الذي سنعمل معه.
الآن ، قم باستيراد hashlib ، وهو وحدة تتيح لنا إنشاء رسائل مشفرة أحادية الاتجاه. تقنيات التشفير مثل التجزئة تجعل Blockchain ينشئ معاملات آمنة.
دالة التجزئة هي خوارزمية تأخذ بعض البيانات (عادة ما تكون سلسلة مشفرة) وتعيد معرفًا فريدًا ، يُسمى غالبًا "ملخص" أو "توقيع". هذا الجزء الأخير حيوي. مع وظيفة التجزئة ، ينتج عن اختلاف طفيف في الإدخال معرفًا مختلفًا جذريًا كمخرج. سنرى هذا في العمل لاحقًا.
في الوقت الحالي ، ما عليك سوى استيراد وحدة التجزئة المدمجة:
# main.py file """ A simple Blockchain in Python """ import hashlibتتضمن هذه الوحدة معظم خوارزميات التجزئة التي ستحتاج إليها. فقط ضع في اعتبارك أننا سنستخدم وظيفة hashlib.sha256 () .
الآن ، دعنا ندخل إلى GeekCoinBlock ، اسم blockchain الأصلي تمامًا.
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 ، وهي عبارة عن غلاف للكائنات التي سيكون لها خصائص (سمات) وسلوكيات (طرق) معينة.
ثم نحدد طريقة __ init__ (تسمى أيضًا المُنشئ) ، والتي يتم استدعاؤها في كل مرة يتم فيها إنشاء كائن GeekCoinBlock.
هذه الطريقة لها ثلاث معاملات:
- self (مثيل كل كائن)
- previous_block_hash (إشارة إلى الكتلة السابقة)
- transaction_list (قائمة المعاملات التي تمت في الكتلة الحالية).
نقوم بتخزين قائمة التجزئة والمعاملات السابقة وننشئ block_data متغير مثيل كسلسلة. لا يحدث هذا مع العملات المشفرة الحقيقية ، حيث نقوم بتخزين هذا النوع من البيانات كتجزئة أخرى ، ولكن لأغراض البساطة ، سنخزن كل كتلة من البيانات كسلسلة.
أخيرًا ، قمنا بإنشاء block_hash ، والذي ستستخدمه الكتل الأخرى لمواصلة السلسلة. وهنا يأتي دور الهشلب. بدلاً من إنشاء وظيفة تجزئة مخصصة ، يمكننا استخدام sha256 المبني مسبقًا لإنشاء كتل غير قابلة للتغيير.
تستقبل هذه الوظيفة سلاسل مشفرة (أو بايت) كمعلمات. لهذا السبب نستخدم طريقة block_data.encode () . بعد ذلك ، نسمي hexdigest () لإعادة البيانات المشفرة إلى تنسيق سداسي عشري.
أعلم أن كل هذا يمكن أن يكون مربكًا ، لذلك دعونا نلعب مع hashlib على قشرة Python.
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 is great" إلى "Python is not great" يمكن أن ينتج عنه تجزئة مختلفة تمامًا. كل هذا له علاقة بسلامة Blockchain. إذا أدخلت بعض التغييرات الطفيفة في blockchain ، فستتغير التجزئة الخاصة بها بشكل كبير. هذا هو السبب في صحة القول المأثور "لا يمكنك إفساد Blockchain".
استخدام فئة Block لدينا
سنقوم ببناء فئة 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
الآن ، قم ببناء الكتلة الأولى من Blockchain الخاصة بنا باستخدام فئة GeekCoinBlock وطباعة سماتها. ضع في اعتبارك أن معلمة هاش السابقة لكتلة التكوين (الكتلة الأولى التي تسبق الكتل الأخرى) ستكون دائمًا عبارة عن سلسلة أو تجزئة عشوائية ، في هذه الحالة ، "الكتلة الأولى".
block1 = GeekCoinBlock('firstblock', [t1, t2]) print(f"Block 1 data: {block1.block_data}") print(f"Block 1 hash: {block1.block_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يمكنك رؤية المشروع الحالي على GitHub repo.
ترميز Blockchain
ليس من الذكاء أن نبني تكامل نظامنا على متغيرات مشفرة يدويًا ، لذلك نحن بحاجة إلى نهج آخر.
لدينا الكتل. حان الوقت لبناء فصل دراسي ينضم إليهم في 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 - يطبع سلسلة الكتل بحلقة for
- last_block - خاصية تتيح لنا الوصول إلى العنصر الأخير في السلسلة. استخدمناه في طريقة create_block_from_transaction .
دعونا نختبر هذا Blockchain.
# 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 بسيطًا من البداية.
يمكنك الآن تقوية ثبات Blockchain من خلال استخدام أدوات تحديد الهوية وتنفيذ ميزات أخرى مثل إثبات العمل أو التعدين أو أي مفهوم آخر أوضحناه في مقالة أساسيات تعدين البيتكوين.
استنتاج
Blockchain هي التقنية الكامنة وراء Bitcoin و Etherium وكل عملة مشفرة أخرى. في هذه المقالة ، تعلمت كيفية إنشاء Blockchain باستخدام Python باستخدام خوارزميات التجزئة مثل sha256 والفئات والكائنات.
التحدي الذي تواجهه هو إنشاء نظام تعدين ، ولماذا لا تقوم بتنفيذه باستخدام واجهة برمجة تطبيقات REST باستخدام أطر عمل مثل Django أو Flask.
كثير من الناس يجنون ثروات من العملات المشفرة. فقط تخيل ما يمكنك فعله إذا قمت بإنشاء واحدة بنفسك.
استمر في الترميز!
