تلخيص الجزء الأول

في الجزء الأول ، تعلمنا أساسيات بايثون. لقد تعلمنا كيف تعمل if-elif-else و loops في النظام. لقد تعلمنا بشكل أساسي كيفية عمل كود بسيط على بايثون. في هذا الجزء ، سنبدأ في إنشاء blockchain الخاص بنا. لذلك ، دون مزيد من اللغط ، فلنبدأ!

الدليل النهائي إلى Python و Blockchain: الجزء 2

إنشاء بلوكشين Python الخاص بنا: تقديم القوائم

حسنًا ، يكفي استخدام الأساسيات. الآن دعونا ننشئ blockchain الخاص بنا!

سنقوم بذلك من خلال تقديم القوائم. القوائم هي في الأساس مجموعة من البيانات التي يمكن أن تكون من أي نوع. يتم تعريفهم على النحو التالي:

List_name = [العنصر 1 ، العنصر 2 ، العنصر 3 …… عنصر n]

يمكن أن تكون العناصر ، كما أوضحنا من قبل ، من أي نوع بيانات. يمكن أن يكون عددًا صحيحًا أو عددًا عشريًا أو سلسلة أو حتى قائمة أخرى (سنستخدمها لاحقًا). دعونا نرى كيف سيعمل هذا. سنستخدم محطتنا لهذا:

بعض الأشياء التي يجب ملاحظتها من الكود أعلاه.

فكر في العناصر الفردية في القائمة على أنها كتل في blockchain. إنه ليس في الحقيقة الكثير من الامتداد ، من الواضح أننا سنجعل هذا أكثر تعقيدًا لاحقًا. تقوم القائمة نفسها بربط كل هذه البيانات معًا لإعطاء عنصر “السلسلة” من blockchain.

الآن ، هناك شيء آخر ستلاحظه وهو رقم الفهرس لكل عنصر. يحتوي العنصر الأول على فهرس 0. لهذا السبب ، عندما نريد طباعة العنصر الأول ، نقول “blockchain [0]”.

تعديل عناصر القائمة

القائمة التي لا يمكن تعديلها غير مجدية. أنت بحاجة إلى أحكام لإضافة وإزالة العناصر من القائمة. الآن ، نعلم أنه في blockchain الشبيه بالبيتكوين ، من المستحيل إزالة العناصر ، ومع ذلك ، ما زلنا نتعامل مع قائمة في الوقت الحالي.

لذا ، كيف سنفعل ذلك?

سنستخدم وظيفتين من وظائف القائمة:

  • ألحق()
  • البوب ​​()

تضيف وظيفة الإلحاق المزيد من العناصر إلى القائمة. لذا ، أعد قائمتنا القديمة:

blockchain = [1، 2، 5.6].

إذا أردنا إضافة “Blockgeeks” إليها ، فسنقول ببساطة: blockchain.append (“Blockgeeks”)

الآن عندما نطبعه ، فإنه يظهر:

[1 ، 2 ، 5.6 ، “Blockgeeks”]

الآن دعونا نحذف بعض البيانات.

لذلك ، سنستخدم وظيفة pop () ، والتي ستزيل العنصر الأخير من القائمة. لذا ، إذا قمنا بعمل blockchain.pop [] ، فسيتم الآن إزالة “Blockgeeks” وإظهار:

[1، 2، 5.6]

إضافة العناصر أثناء وقت التشغيل عبر الوظائف

الآن ، دعونا نحظى ببعض المرح.

سنستخدم وظيفة لإضافة عناصر إلى القائمة أثناء وقت التشغيل. ضع في اعتبارك هذا البرنامج:

blockchain = []

def add_list ():

   blockchain.append (3.2)

   طباعة (blockchain)

اضف قائمة()

اضف قائمة()

اضف قائمة()

لذلك ، حددنا وظيفة تسمى “add_list ()” والتي ستلحق 3.2 بقائمة blockchain في كل مرة يتم استدعاؤها. هل لاحظت كيف أعلنا عن القائمة الفارغة باستخدام blockchain = []؟ تم ذلك حتى نتمكن من توضيح كيفية إدخال البيانات من البداية.

لذا ، إذا قمنا بطباعتها ، فهذه هي الصورة. عدنا إلى Visual Studio Code بالمناسبة.

الدليل النهائي إلى Python و Blockchain: الجزء 2

إعطاء القائمة المزيد من الممتلكات المشابهة لـ Blockchain

حتى الآن تعاملنا إلى حد كبير مع قائمة عادية. ومع ذلك ، يجب أن يكون هناك اتصال عضوي أكثر بين الكتل.

السبب وراء اتصال الكتل ببعضها البعض في blockchain حقيقي هو أنها تتضمن بيانات الكتلة السابقة أيضًا. هذا هو بالضبط ما سنفعله من خلال إلحاق بيانات العنصر الأخير بالعنصر الأخير عبر قائمة متداخلة. في Python ، يمكنك الحصول على بيانات آخر القائمة باستخدام الفهرس [-1].

لذلك إذا كانت blockchain تحتوي على [1 ، 2 ، 3] ، فإن blockchain [-1] يمنحك 3.

على أي حال ، دعنا نتحقق من الكود ، سنستخدم وظيفة الإدخال () للحصول على قيمة عنصر blockchain من المستخدم.

element1 = إدخال ("أعط العنصر الأول من blockchain ")

blockchain = [element1]

def add_list ():

   blockchain.append ([blockchain [-1] ، 3.2])

   طباعة (blockchain)

اضف قائمة()

اضف قائمة()

اضف قائمة()

لذلك ، عند طباعة هذا الآن ، ستحصل على:

الدليل النهائي إلى Python و Blockchain: الجزء 2

حسنًا ، لقد قمنا حتى الآن بإضفاء بعض السمات على blockchain الخاص بنا ، ولكن ما زلنا لا نملك أي شيء قريب من نموذج العمل لدينا. لا تقلق من أن يتم حلها قريبًا.

الاقتراب من بلوكشين عاملة

blockchain = []

“”” القسم 1 “””

def get_last_value ():

   """ استخراج العنصر الأخير من قائمة blockchain """

   العودة (blockchain [-1])

def add_value (transaction_amount، last_transaction = [1]):

   blockchain.append ([last_transaction، transaction_amount])

“”” القسم 2 “””

def get_transaction_value ():

   user_value = float (إدخال (“أدخل مبلغ معاملتك”))

   إرجاع user_value

def get_user_choice ():

   user_input = المدخلات ("يرجى إعطاء اختيارك هنا: ")

   إرجاع user_input

“”” القسم 3 “””

def print_block ():

   للكتلة في blockchain:

       مطبعة("ها هو كتلك")

       طباعة (كتلة)

“”” القسم 4 “””

def check_chain ():

   الفهرس = 0

   صالح = صحيح

   للكتلة في blockchain:

       إذا كان الفهرس == 0:

           الفهرس + = 1

           استمر

       كتلة elif [0] == blockchain [الفهرس – 1]:

           صالح = صحيح

       آخر:

           صالح = خطأ

           فترة راحة

       الفهرس + = 1

   عودة صالحة

“” “القسم 5” “”

tx_amount = get_transaction_value ()

add_value (tx_amount)

احيانا صحيح:

   مطبعة("إختر خيار")

   طباعة (“اختر 1 لإضافة معاملة جديدة”)

   طباعة (“اختر 2 لطباعة blockchain”)

   طباعة (“اختر 3 إذا كنت تريد معالجة البيانات”)

   طباعة (“اختر أي شيء آخر إذا كنت تريد الإنهاء”)

   user_choice = get_user_choice ()

   

   إذا كان user_choice == 1:

       tx_amount = get_transaction_value ()

       add_value (tx_amount، get_last_value ())

   

   elif user_choice == 2:

       print_block ()

   

   elif user_choice == 3:

       if len (blockchain) >= 1:

           blockchain [0] = 2

   

   آخر:

       فترة راحة

   

   إذا لم يتم التحقق من السلسلة ():

       طباعة (“معالجة بلوكتشين”)

       فترة راحة

نعم ، نعلم أن هذه كتلة ضخمة من التعليمات البرمجية ، ومع ذلك ، فقد قسمنا كل شيء إلى أقسام مختلفة لمساعدتك على فهم ما يحدث وكل جزء من الكود.

ما حاولنا القيام به هنا هو إنشاء blockchain نموذج أولي لا يعتمد على التصريح الثابت. بمعنى ، يمكن للمستخدمين أن يملأوا البيانات أثناء وقت التشغيل. لهذا السبب ، إذا رأيت السطر الأول من الكود ، فسترى أننا بدأنا بلوكشين فارغ.

حسنًا ، فلنبدأ بالنظر في الأقسام.

ملحوظة: نقترح نسخ الكود أعلاه ولصقه والاحتفاظ به مفتوحًا في نافذة جديدة أو في ملف مستند. سنستمر في الإشارة إلى جزء مختلف من الكود في الشرح أدناه ، وسيكون من الأسهل بالنسبة لك تتبعها.

القسم 1

def get_last_value ():

   """ استخراج العنصر الأخير من قائمة blockchain """

   العودة (blockchain [-1])

def add_value (transaction_amount، last_transaction = [1]):

   blockchain.append ([last_transaction، transaction_amount])

لذلك ، هذا القسم الأول يجب أن تكون على دراية جيدة به الآن. نحن نقوم بأمرين هنا:

  • استخراج العنصر الأخير من blockchain
  • إلحاق العنصر الأخير مع العنصر الحالي في الكتلة إلى blockchain.

ألق نظرة على الوسائط في دالة add_value:

  • Last_transaction
  • قيمة التحويل

مبلغ المعاملة هو قيمة المعاملة التي سيتم وضعها في blockchain. من ناحية أخرى ، فإن متغير last_transaction هو قيمة المعاملة في الكتلة الأخيرة التي سيتم وضعها في الكتلة الجديدة.

إذن ، لماذا نقوم بتهيئة last_transaction إلى [1]?

يتم ذلك فقط لتجنب حدوث خطأ أثناء وقت التشغيل. فكر في هذا ، إذا كنا نتعامل مع الكتلة الأولى من blockchain ، فلن يكون لها أي “last_transaction” أليس كذلك؟ ستحتاج إلى مجموعتين على الأقل من أجل وجود مفهوم “last_transaction”. لهذا السبب ، من أجل إزالة احتمال حدوث أي خطأ في الكتلة الأولى ، تتم تهيئة last_transaction إلى [1].

القسم 2

def get_transaction_value ():

   user_value = float (إدخال (“أدخل مبلغ معاملتك”))

   إرجاع user_value

def get_user_choice ():

   user_input = المدخلات ("يرجى إعطاء اختيارك هنا: ")

   إرجاع user_input

دعونا نسمي هذا القسم قسم الإدخال. لدينا وظيفتان هنا:

  • get_transaction_value ()
  • get_user_choice ()

في الوظيفة الأولى ، نطلب من المستخدم إدخال قيمة مبلغ المعاملة الذي يريد إدخاله في blockchain. تذكر الآن أن دالة input () ترجع قيمة سلسلة. لذلك ، نستخدم الدالة float () لتغيير هذا الرقم إلى رقم عائم.

في الوظيفة الثانية ، سنطلب من المستخدم إدخال اختياره.

الآن ، قد تتساءل ، “ما هو الخيار الذي تتحدث عنه؟”

حسنًا ، خذ القسم 5. على وجه التحديد حلقة while. هل ترى الخيار الذي نطلبه هناك?

مطبعة("إختر خيار")

طباعة (“اختر 1 لإضافة معاملة جديدة”)

طباعة (“اختر 2 لطباعة blockchain”)

طباعة (“اختر 3 إذا كنت تريد معالجة البيانات”)

طباعة (“اختر أي شيء آخر إذا كنت تريد الإنهاء”)

لذلك ، تُستخدم وظيفة get_user_choice () في الاختيار من المستخدم للمساعدة في فهم ما يريدون القيام به.

القسم 3

def print_block ():

   للكتلة في blockchain:

       مطبعة("ها هو كتلك")

       طباعة (كتلة)

هذا قسم مباشر جدا. نحن نستخدم حلقة for لطباعة كل كتلة من blockchain.

القسم 4

def check_chain ():

   الفهرس = 0

   صالح = صحيح

   للكتلة في blockchain:

       إذا كان الفهرس == 0:

           الفهرس + = 1

           استمر

       كتلة elif [0] == blockchain [الفهرس – 1]:

           صالح = صحيح

       آخر:

           صالح = خطأ

           فترة راحة

       الفهرس + = 1

   عودة صالحة

الآن هذا شيء لم نفعله حتى الآن.

في هذا القسم ، نتحقق من صلاحية blockchain. بالضبط ما نعنيه بذلك.

كما تعلم ، يجب أن تكون blockchain غير قابلة للتغيير. نظرًا لأننا لا نستخدم أي وظائف تجزئة حتى الآن ، فلنستخدم شيئًا آخر لإظهار أنه تم العبث بالسلسلة. هذا هو السبب في أننا نستخدم في هذه الوظيفة وظيفة التحقق من السلسلة.

لذا ، ماذا نفعل هنا?

أولاً ، لدينا متغيرين:

  • الفهرس = العداد الذي سنستخدمه لتصفح الكتل في blockchain
  • صالح = متغير منطقي والذي سيعيد True أو False كقيمة نهائية لهذه الوظيفة

بعد ذلك ، نستخدم حلقة for للانتقال عبر blockchain ، على غرار القسم السابق حيث استخدمنا حلقة لطباعة الكتل. داخل الحلقة ، نستخدم ثلاث عبارات شرطية ، دعنا ننتقل إلى كل منها:

إذا كان القسم الفرعي

هذا يتحقق إذا كان الفهرس 0 أم لا. إذا كان الأمر كذلك ، فإن المؤشر يزيد بمقدار 1

القسم الفرعي إليف

هذا هو الجزء الذي نتحقق فيه من حدوث بعض العبث أم لا. لفهم كيفية عمل ذلك ، تخيل هذا السيناريو.

الدليل النهائي إلى Python و Blockchain: الجزء 2

لذلك ، كما ترى ، فإن العنصر الأول في Block B هو محتويات الكتلة السابقة. لذلك ، في هذا القسم الفرعي ، نتحقق مما إذا كان العنصر الأول من الكتلة يساوي عناصر الكتلة السابقة. إذا كانت هذه الوظيفة صحيحة وإلا فإنها ترجع خطأ.

القسم 5

tx_amount = get_transaction_value ()

add_value (tx_amount)

احيانا صحيح:

   مطبعة("إختر خيار")

   طباعة (“اختر 1 لإضافة معاملة جديدة”)

   طباعة (“اختر 2 لطباعة blockchain”)

   طباعة (“اختر 3 إذا كنت تريد معالجة البيانات”)

   طباعة (“اختر أي شيء آخر إذا كنت تريد الإنهاء”)

   user_choice = get_user_choice ()

   

   إذا كان user_choice == 1:

       tx_amount = get_transaction_value ()

       add_value (tx_amount، get_last_value ())

   

   elif user_choice == 2:

       print_block ()

   

   elif user_choice == 3:

       if len (blockchain) >= 1:

           blockchain [0] = 2

   

   آخر:

       فترة راحة

   

   إذا لم يتم التحقق من السلسلة ():

       طباعة (“معالجة بلوكتشين”)

       فترة راحة

إذن ، هذا قسم طويل ، ولهذا سنحتاج إلى فصله إلى أقسام فرعية مختلفة (مرة أخرى).

القسم الفرعي 1: التهيئة

tx_amount = get_transaction_value ()

add_value (tx_amount

نبدأ بتهيئة الكتلة الأولى من blockchain. نحصل على قيمة مبلغ المعاملة (tx_amount) ثم ندخل القيمة في كتلة blockchain.

القسم الفرعي 2: الاختيار

احيانا صحيح:

   مطبعة("إختر خيار")

   طباعة (“اختر 1 لإضافة معاملة جديدة”)

   طباعة (“اختر 2 لطباعة blockchain”)

   طباعة (“اختر 3 إذا كنت تريد معالجة البيانات”)

   طباعة (“اختر أي شيء آخر إذا كنت تريد الإنهاء”)

   user_choice = get_user_choice ()

حسنًا ، القسم الفرعي 1 فصاعدًا ، سيتم تنفيذ جميع الأقسام الفرعية الأخرى داخل حلقة while. لذا ، فإن أول شيء نقوم به هو منح المستخدمين خيارًا لاختيار ما يريدون فعله بالضبط:

  • أضف معاملة جديدة
  • اطبع blockchain
  • التلاعب بالبيانات
  • قم بإنهاء العملية

بعد ذلك ، يخزن user_choice بيانات المستخدم

القسم الفرعي 3: if-elif-elif-else

لذلك ، بناءً على الاختيار ، لدينا 4 احتمالات. يبدو الرمز كما يلي:

إذا كان user_choice == 1:

       tx_amount = get_transaction_value ()

       add_value (tx_amount، get_last_value ())

   

   elif user_choice == 2:

       print_block ()

   

   elif user_choice == 3:

       if len (blockchain) >= 1:

           blockchain [0] = 2

   آخر:

       فترة راحة

  • أولاً ، نضيف المعاملة إلى blockchain. نقوم بملء المدخلات من المستخدم وتخزينها في tx_amount. بمجرد أن نحصل على قيمة المعاملة ، نضيف ذلك ، إلى جانب قيمة العناصر من الكتلة الأخيرة إلى blockchain
  • ثانيًا ، نستدعي وظيفة الطباعة لطباعة blockchain
  • ثالثًا ، وظيفة التلاعب. لقد قمنا بدمج هذا فقط لنوضح لك كيف ستتفاعل blockchain إذا تم التلاعب بالبيانات. لذا ، ما يحدث هنا هو أننا قمنا بتغيير العنصر الأول من blockchain إلى 2. هذا يعمل فقط إذا كان blockchain يحتوي على أكثر من عنصر واحد (شرط if يتحقق ذلك)

    تحقق من القسم الفرعي التالي لمعرفة ما سيحدث بعد ذلك

  • الجزء الأخير بسيط جدًا. إذا أرسل المستخدم خيارًا آخر ، فسيتم تنشيط كتلة else التي تستخدم ببساطة “break” للخروج من حلقة while

القسم الفرعي 4: مكالمة تحقق

إذا لم يتم التحقق من السلسلة ():

       طباعة (“معالجة بلوكتشين”)

       فترة راحة

إذا اختار المستخدم التعامل مع blockchain ، فإن هذا القسم الفرعي سيتأثر. تذكر الآن ، أن عملية التحقق من السلسلة () ترجع قيمة منطقية:

  • صحيح
  • خطأ شنيع

ترجع عملية التحقق من السلسلة () خطأ إذا تم إجراء معالجة.

الآن ، يستخدم هذا القسم الفرعي ليس الكلمة الأساسية ، والتي تحول False إلى True. يؤدي هذا بدوره إلى تنشيط وظيفة الطباعة داخل كتلة if لطباعة “معالجة Blockchain”.

مخرجات البرنامج

حسنًا ، نحن الآن نعرف كيف يعمل البرنامج. دعونا نتحقق من النواتج.

الدليل النهائي إلى Python و Blockchain: الجزء 2

لذا ، لاستعراض ما فعلناه أعلاه

أدخلنا 3 قيم في blockchain الخاصة بنا: 23.5 و 43 و 1 و 5.89

ثم قمنا بطباعة blockchain الذي يعطي هذا:

الدليل النهائي إلى Python و Blockchain: الجزء 2

حاولنا بعد ذلك معالجة blockchain الخاص بنا عن طريق تغيير البيانات ، لكن نظام التحقق المدمج لدينا اكتشف ذلك وقدم هذا الناتج:

الدليل النهائي إلى Python و Blockchain: الجزء 2

حسنًا ، لدينا هيكل جيد جدًا تم وضعه حتى الآن. ومع ذلك ، ما زلنا بحاجة إلى الدمج تجزئة وإثبات العمل في كودنا. لذلك ، نظرًا لأننا نعرف بالفعل ما هي القوائم ، فلنتعرف على المجموعات والقواميس.

المجموعات والقواميس

المجموعات والقواميس هي هياكل بيانات جنبًا إلى جنب مع القوائم. دعونا نقارن هذه الثلاثة ومعرفة كيفية عملها.

الدليل النهائي إلى Python و Blockchain: الجزء 2

تتشابه Tuples مع القوائم ، ومع ذلك ، لا يمكن تحريرها بمجرد إنشائها. من ناحية أخرى ، تحتوي القواميس على معرّفات فريدة مثل NAME1 و NAME2 في مثالنا أعلاه قيم المتجر. يمكن تحريرها بمجرد إنشائها.

سنستخدم هياكل البيانات هذه في blockchain الجديد والمحسن الخاص بنا.

قد تتساءل ، “ما الهدف من القيام بذلك؟”

حسنًا ، تحتوي المعاملات والكتل وما إلى ذلك على الكثير من البيانات الوصفية التي يجب تخزينها. فكر في جميع البيانات الوصفية التي يمكن تخزينها في المعاملة:

  • معرف المرسل
  • معرف المستلم
  • تاريخ الصفقة
  • قيمة التحويل

تساعدنا إضافة كل هذه البيانات في تتبع معاملاتنا.

إضافة ميزات التعدين وإثبات العمل

لذا ، فإن أول شيء يتعين علينا القيام به هو إضافة ميزات التعدين وإثبات العمل. التعدين هو العملية التي يقوم من خلالها المعدنون بحل الألغاز الصعبة من الناحية المشفرة للعثور على كتل لإضافتها إلى blockchain. بالنسبة لتعدين هذه الكتل ، يحصل المعدنون على مكافأة تسمى مكافأة الكتلة.

من ناحية أخرى ، إثبات العمل هو طريقة التعدين والإجماع المستخدمة في العديد من العملات المشفرة مثل البيتكوين. سنستخدم إثبات العمل في blockchain الخاص بنا.

إذا أردنا تلخيص كيفية عمل بروتوكول إثبات العمل مع blockchain.

  • يقوم عمال المناجم بحل ألغاز التشفير من أجل “تعدين” كتلة من أجل إضافتها إلى blockchain.
  • تتطلب هذه العملية قدرًا هائلاً من الطاقة والاستخدام الحسابي. تم تصميم الألغاز بطريقة تجعلها صعبة ومرهقة للنظام.
  • عندما يحل عامل منجم اللغز ، فإنه يعرض كتلته على الشبكة للتحقق منها.
  • التحقق مما إذا كانت الكتلة تنتمي إلى السلسلة أم لا هي عملية بسيطة للغاية.

حسنًا ، فلنلقِ نظرة على الكود الخاص بنا:

“”” القسم 1 “””

استيراد hashlib

استيراد json

المكافأة = 10.0

genesis_block = {

   “تجزئة_سابقة”: “,

   “الفهرس”: 0,

   ‘عملية تجارية’: [],

   “nonce”: 23

}

blockchain = [genesis_block]

open_transactions = []

المالك = ‘Blockgeeks’

def hash_block (كتلة):

   إرجاع hashlib.sha256 (json.dumps (block) .encode ()). hexdigest ()

“”” القسم 2 “””

def valid_proof (المعاملات ، last_hash ، nonce):

   guess = (str (المعاملات) + str (last_hash) + str (nonce)). encode ()

   guess_hash = hashlib.sha256 (guess) .hexdigest ()

   طباعة (guess_hash)

   إرجاع guess_hash [0: 2] == ’00’

def pow ():

   last_block = blockchain [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   في حين أنه غير صالح (open_transactions، last_hash، nonce):

       nonce + = 1

   عودة nonce

“”” القسم 3 “””

def get_last_value ():

   """ استخراج العنصر الأخير من قائمة blockchain """

   العودة (blockchain [-1])

def add_value (المستلم ، المرسل = المالك ، المبلغ = 1.0):

   المعاملة = {‘المرسل’: المرسل,

   “المستلم”: المستلم,

   “المبلغ”: amount}

   open_transactions.append (معاملة)

“”” القسم 4 “””

def Mine_block ():

   last_block = blockchain [-1]

   hashed_block = hash_block (last_block)

   nonce = pow ()

   Rew_transaction = {

           ‘المرسل’: ‘التعدين’,

           “المستلم”: المالك,

           “المبلغ”: مكافأة

       }

   open_transactions.append (Rew_transaction)

   كتلة = {

       “Previous_hash”: hashed_block,

       “الفهرس”: len (blockchain),

       “معاملة”: open_transactions,

       “nonce”: nonce

   }

   blockchain.append (كتلة)

“” “القسم 5” “”

def get_transaction_value ():

   tx_recipient = input (‘أدخل مستلم المعاملة:’)

   tx_amount = float (إدخال (“أدخل مبلغ المعاملة”))

   إرجاع tx_recipient ، tx_amount

def get_user_choice ():

   user_input = المدخلات ("يرجى إعطاء اختيارك هنا: ")

   إرجاع user_input

“” “القسم 6” “”

def print_block ():

   للكتلة في blockchain:

       مطبعة("ها هو كتلك")

       طباعة (كتلة)

“” “القسم 7” “”

احيانا صحيح:

   مطبعة("إختر خيار")

   طباعة (“اختر 1 لإضافة معاملة جديدة”)

   طباعة (“اختر 2 لتعدين كتلة جديدة”)

   طباعة (“اختر 3 لطباعة blockchain”)

   طباعة (“اختر أي شيء آخر إذا كنت تريد الإنهاء”)

   user_choice = get_user_choice ()

   

   إذا كان user_choice == 1:

       tx_data = get_transaction_value ()

       المستلم ، المبلغ = tx_data

       add_value (المستلم ، المبلغ = المبلغ)

       طباعة (open_transactions)

   elif user_choice == 2:

       my_block ()

   elif user_choice == 3:

       print_block ()

   

   آخر:

       فترة راحة

حسنًا ، فلنحلل الشفرة.

القسم 1

استيراد hashlib

استيراد json

المكافأة = 10.0

genesis_block = {

   “تجزئة_سابقة”: “,

   “الفهرس”: 0,

   ‘عملية تجارية’: [],

   “nonce”: 23

}

blockchain = [genesis_block]

open_transactions = []

المالك = ‘Blockgeeks’

def hash_block (كتلة):

   إرجاع hashlib.sha256 (json.dumps (block) .encode ()). hexdigest ()

أول شيء نقوم به هنا هو استيراد مكتبات التجزئة. نحن نستورد على وجه التحديد:

  • hashlib: لاستخدام وظائف التجزئة الخاصة بهم
  • json: نحتاج إلى هذه الحزمة لتحويل الكتلة من قاموس إلى سلسلة.

بعد ذلك ، نعلن عن “المكافأة” ، وهو متغير عالمي سيخزن مكافأة كتلة التعدين التي سنمنحها لعمال التعدين لدينا مقابل تعدين كتلة.

التالي لدينا كتلة التكوين لدينا. تعتبر كتلة التكوين هي أول كتلة في blockchain. نحن نستخدم 4 بيانات وصفية في مجموعتنا:

  • Previous_hash: يخزن تجزئة الكتلة السابقة. ستكون هذه سلسلة فارغة لأن كتلة التكوين لن تحتوي على أي تجزئة سابقة.
  • فهرس: هذا هو فهرس الكتلة في blockchain. نظرًا لأن كتلة التكوين هي الكتلة الأولى ، يتم تهيئة فهرسها إلى 0. تذكر في مصطلحات البرمجة ، أن العنصر الأول في القائمة يقع في الموضع 0
  • عملية: المعاملة التي يتم تخزينها داخل blockchain. نظرًا لعدم وجود أي منها ، فهي قائمة فارغة.
  • نونس: سنشرح هذا لاحقًا. تمت تهيئته إلى 23 وهي قيمة وهمية.

بعد تهيئة كتلة التكوين ، تتم إضافتها إلى blockchain في الخطوة التالية عبر blockchain = [genesis_block].

Open_transactions: قائمة تدير جميع المعاملات المعلقة في blockchain. إنها قائمة فارغة في البداية.

نظرًا لأننا المالك والمرسل لهذه المعاملة ، فقد بدأنا هذا الحق في البداية

التالي لدينا وظيفة التجزئة hash_block ()

داخلها نعيد تجزئة الكتلة باستخدام هذا التعبير:

hashlib.sha256 (json.dumps (block) .encode ()). hexdigest ()

لذلك ، دعونا نرى ما نقوم به هنا:

  • استخدام خوارزمية التجزئة sha256 من hashlib.
  • يتم تشغيل وظيفة json.dumps وتحول الكتلة التي هي قاموس إلى سلسلة بتنسيق json. ومع ذلك ، لا يستطيع الهشليب قراءة ذلك ، لذا لدينا ….
  • وظيفة التشفير (). هذا يحول سلسلة json المنسقة إلى سلسلة UTF-8 يمكن قراءتها بواسطة hashlib.
  • ناتج hashlib هو تجزئة بايت. لذا استخدمنا في النهاية طريقة () hexdigest لتحويلها إلى سلسلة نصية عادية.

القسم 2

def valid_proof (المعاملات ، last_hash ، nonce):

   guess = (str (المعاملات) + str (last_hash) + str (nonce)). encode ()

   guess_hash = hashlib.sha256 (guess) .hexdigest ()

   طباعة (guess_hash)

   إرجاع guess_hash [0: 2] == ’00’

def pow ():

   last_block = blockchain [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   في حين أنه غير صالح (open_transactions، last_hash، nonce):

       nonce + = 1

   عودة nonce

في القسم 2 ، لدينا وظيفتان:

  • صالح_بروف
  • وظيفة الأسرى

صالح_بروفيل ()

def valid_proof (المعاملات ، last_hash ، nonce):

   guess = (str (المعاملات) + str (last_hash) + str (nonce)). encode ()

   guess_hash = hashlib.sha256 (guess) .hexdigest ()

   طباعة (guess_hash)

   إرجاع guess_hash [0: 2] == ’00’

إذن ، الدالة valid_proof () لها ثلاث وسيطات:

  • المعاملات: المعاملات التي تتم داخل الكتلة
  • آخر تجزئة: تجزئة الكتلة الأخيرة
  • نونس

حسنًا ، ما هو nonce بالضبط؟ قبل ذلك بوقت طويل ، نحتاج إلى معرفة ما تعنيه الصعوبة. “الصعوبة” هي فكرة جعل التعدين صعبًا قدر الإمكان. إذا لم يكن التعدين صعبًا ، فسيتم ضخ جميع العملات المعدنية في النظام بسهولة ، مما يجعلها عديمة الفائدة تمامًا.

لذا ، فإن الطريقة التي نحسب بها تجزئة النظام هي من خلال تسلسل المعاملات ، وتجزئة الكتلة الأخيرة و nonce في سلسلة واحدة ثم تجزئتها. لا يُقبل التجزئة إلا إذا كان أول حرفين منها أصفارًا.

هكذا نجلب الصعوبة. من المستحيل التنبؤ بكيفية ظهور التجزئة وسيكون الأمر بمثابة سحب محظوظ. لهذا السبب ، من الصعب للغاية الحصول على تجزئة تبدأ بنمط معين (مثل 2 0 ثانية).

ترجع الدالة True إذا كان البرنامج يحتوي على تجزئة صالحة و False إذا لم يكن كذلك.

وظيفة الأسرى ()

بعد ذلك لدينا إثبات العمل أو وظيفة pow ().

def pow ():

   last_block = blockchain [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   في حين أنه غير صالح (open_transactions، last_hash، nonce):

       nonce + = 1

   عودة nonce

هذه الوظيفة واضحة جدًا:

  • أولاً ، نقوم باستخراج الكتلة الأخيرة من blockchain ووضعها في last_block
  • نقوم بعد ذلك بتجزئة الكتلة الأخيرة ووضعها في آخر تجزئة
  • تستمر حلقات while في العمل حتى ترجع الدالة valid_proof TRUE. (ال ليس تحويل سيحول TRUE إلى FALSE وبالتالي يخرج من الحلقة)
  • ثم يتم إرجاع nonce.

القسم 3

def get_last_value ():

   """ استخراج العنصر الأخير من قائمة blockchain """

   العودة (blockchain [-1])

def add_value (المستلم ، المرسل = المالك ، المبلغ = 1.0):

   المعاملة = {‘المرسل’: المرسل,

   “المستلم”: المستلم,

   “المبلغ”: amount}

   open_transactions.append (معاملة)

في هذا القسم لدينا وظيفتان مرة أخرى:

  • get_last_value
  • إضافة قيمة

get_last_value ()

هذا واحد بسيط جدا. يستخرج آخر كتلة من blockchain.

إضافة قيمة()

تأخذ الوظيفة البيانات الوصفية للمعاملة ، وهي:

  • اسم المرسل
  • اسم المستلم
  • مبلغ الصفقة

بعد ذلك ، يتم إلحاق المعاملة بقائمة open_transactions.

القسم 4

def Mine_block ():

   last_block = blockchain [-1]

   hashed_block = hash_block (last_block)

   nonce = pow ()

   Rew_transaction = {

           ‘المرسل’: ‘التعدين’,

           “المستلم”: المالك,

           “المبلغ”: مكافأة

       }

   open_transactions.append (Rew_transaction)

   كتلة = {

       “Previous_hash”: hashed_block,

       “الفهرس”: len (blockchain),

       “معاملة”: open_transactions,

       “nonce”: nonce

   }

   blockchain.append (كتلة)

في هذا القسم لدينا وظيفة واحدة ، وهي الدالة Mine_block () التي ستمكنك من تعدين الكتل

لذلك ، في هذه الوظيفة ، سيحدث ما يلي:

  • قم باستخراج الكتلة الأخيرة من blockchain وضعها في last_block
  • تجزئة الكتلة الأخيرة
  • استخدم الدالة pow () لاستخراج nonce
  • قم بإنشاء معاملة مكافأة تمنح عامل المناجم ، أي لنا مبلغ المكافأة الذي حددناه سابقًا (10.0 عملات معدنية)
  • يتم إلحاق Rew_transaction بقائمة open_transaction
  • أخيرًا ، مع nonce الجديد المعتمد ، لدينا أخيرًا كتلة جديدة ، مما يساعدنا في الحصول على البيانات الوصفية للكتلة الجديدة,
  • يتم إلحاق الكتلة الجديدة بـ blockchain

القسم 5

def get_transaction_value ():

   tx_recipient = input (‘أدخل مستلم المعاملة:’)

   tx_amount = float (إدخال (“أدخل مبلغ المعاملة”))

   إرجاع tx_recipient ، tx_amount

def get_user_choice ():

   user_input = المدخلات ("يرجى إعطاء اختيارك هنا: ")

   إرجاع user_input

في هذا القسم لدينا وظيفتان:

  • get_transaction_value ()
  • get_user_choice ()

# 1 get_transaction_value ()

تأخذ هذه الوظيفة البيانات الوصفية للمعاملة مثل اسم المستلم ومقدار المعاملة.

في نفس الوقت ، ألق نظرة على بيان الإرجاع.

إرجاع tx_recipient ، tx_amount

تقوم هذه الوظيفة بإرجاع tuple (تحدثنا عن tuple قبل التذكر؟)

# 2 get_user_choice

تأخذ هذه الوظيفة أساسًا في اختيار المستخدم وتعيده. يشبه هذا إلى حد كبير وظيفة get_user_choice () في البرنامج السابق.

القسم 6

def print_block ():

   للكتلة في blockchain:

       مطبعة("ها هو كتلك")

       طباعة (كتلة)

على غرار البرنامج الأخير ، هذه هي وظيفة الطباعة التي تطبع blockchain.

القسم السابع

احيانا صحيح:

   مطبعة("إختر خيار")

   طباعة (“اختر 1 لإضافة معاملة جديدة”)

   طباعة (“اختر 2 لتعدين كتلة جديدة”)

   طباعة (“اختر 3 لطباعة blockchain”)

   طباعة (“اختر أي شيء آخر إذا كنت تريد الإنهاء”)

   user_choice = get_user_choice ()

   

   إذا كان user_choice == 1:

       tx_data = get_transaction_value ()

       المستلم ، المبلغ = tx_data

       add_value (المستلم ، المبلغ = المبلغ)

       طباعة (open_transactions)

   elif user_choice == 2:

       my_block ()

   elif user_choice == 3:

       print_block ()

   

   آخر:

       فترة راحة

هذا مشابه أيضًا للبرنامج الأخير. يحصل المستخدم على خيار إما:

  • أدخل معاملة
  • منجم كتلة
  • اطبع blockchain

دعنا الآن نتحقق من مخرجات البرنامج.

مخرجات البرنامج

أولاً وقبل كل شيء ، دعنا نختار الخيار 2 وقم بتعدين الكتلة. عند القيام بذلك ، نحصل على كتلة التجزئة التالية:

الدليل النهائي إلى Python و Blockchain: الجزء 2

يبدو هذا محيرًا للعقل ، حتى تولي اهتمامًا أكبر قليلاً وتحقق من التجزئة الأخيرة:

“001f946e8c2172affa830ef27761270aab2de515ffac8ae90e5de95b48dc366c”

هل ترى ما الذي يميز هذا التجزئة?

تذكر الصعوبة التي وضعناها في وقت سابق؟ كنا نبحث على وجه التحديد عن تجزئة تبدأ بـ “00”. لهذا السبب ، مر الكمبيوتر عبر تجزئة متعددة عن طريق تغيير nonce حتى تعثر أخيرًا على تجزئة استوفت معايير الصعوبة المحددة.

حسنًا ، فلنقم الآن بإضافة معاملة. لنفترض أنني أرغب في إرسال Sam ، 2.4 قطعة نقدية ، سنختار الخيار 1 ونحصل على الناتج التالي:

الدليل النهائي إلى Python و Blockchain: الجزء 2

انتبه إلى السطر الأخير. إنه يظهر المعاملتين اللتين قمنا بهما حتى الآن.

انتظر … عمليتين؟ لقد فعلنا حق واحد فقط?

ليس تماما. تذكر أننا قمنا بتعدين كتلة قبل هذا أليس كذلك؟ لذلك تظهر معاملة مكافأة الكتلة هنا أيضًا.

أخيرًا ، دعنا نطبع blockchain.

الدليل النهائي إلى Python و Blockchain: الجزء 2

إذن ، لدينا كتلتان:

  • أولاً ، لدينا كتلة التكوين التي أعلناها عن أنفسنا. كان nonce شيئًا نضعه في أنفسنا ، أي 23
  • بعد ذلك ، لدينا الكتلة الثانية ، والتي تتضمن صفقة التعدين والمعاملة التي أجريناها بأنفسنا مع “Sam”. قيمة nonce للكتلة هي 93

خاتمة

لذا ، ها أنت ذا. لدينا على الأقل نوعا ما من العمل blockchain مشفرة عبر بايثون. إذا كنت مهتمًا بمعرفة المزيد ، فيرجى متابعة البحث الخاص بك. نشعر أن Python هي لغة يجب أن تتقنها إذا كنت ترغب في تطويرها. إنها لغة ممتعة للغاية وسهلة التعلم ويمكن أن تفتح الأبواب لفرص غير محدودة.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me