ترميز blockchain: العديد من اللغات المختلفة التي تحتاجها!

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

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

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

قبل أن نبدأ ، دعنا نتحقق من بعض التحديات التي يواجهها مطور blockchain. ليس من السهل إنشاء وصيانة blockchain العامة بسبب عدد من الأسباب.

(قبل أن نواصل ، صرخة ضخمة لديفيد شوارتز لعنوانه الرئيسي فيما يتعلق باستخدام C ++ في تطوير برامج blockchain في CPPCON 2016.)

ترميز blockchain

تحدي صعوبة ترميز Blockchain # 1: الأمان

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

تحدي صعوبة ترميز Blockchain رقم 2: إدارة الموارد

من المهم مواكبة الشبكة. لا يمكنك أن تتخلف كثيراً ولا تواكب جميع متطلبات الشبكة. يجب أن تكون مجهزًا جيدًا للتعامل مع الاستفسارات البعيدة والمحلية.

تحدي صعوبة ترميز Blockchain # 3: الأداء

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

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

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

تدريب لتصبح مطور بلوكتشين

ابدأ تجربتك المجانية اليوم!

صعوبة ترميز Blockchain التحدي رقم 4: العزلة

ما هو السلوك الحتمي?

  • إذا كانت A + B = C ، فبغض النظر عن الظروف ، فإن A + B ستكون دائمًا مساوية لـ C. وهذا ما يسمى بالسلوك الحتمي.
  • وظائف التجزئة حتمية ، مما يعني أن تجزئة A ستظل دائمًا H (A).

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

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

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

لغة ترميز Blockchain # 1: C++

أولاً وقبل كل شيء ، دعونا نبدأ مع جدهم جميعًا ، دائم الخضرة ج++. تم إنشاء C ++ بواسطة Bjarne Stroustrup كامتداد للغة C. تم تصميم اللغة بحيث تتمتع بمرونة وكفاءة لغة سي ولكن مع بعض الاختلافات الرئيسية. أكبر اختلاف بين C و C ++ هو أنه بينما C موجهة نحو العمليات ، فإن C ++ موجهة للكائنات.

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

دعونا نلقي نظرة على أبسط برنامج C ++ في العالم. برنامج “Hello World”:

#يشمل

رئيسي()

{

كوت << "مرحبا بالعالم!"؛

العودة 0 ؛

}

سيطبع هذا الرمز “Hello World!”

إذن ، لماذا لا يزال الناس يستخدمون C ++ للترميز؟ بالتأكيد توجد لغات أكثر براقة الآن ، لماذا لا يزال الناس يصرون على العودة إلى C ++؟ لماذا يتم ترميز blockchain البيتكوين على C++?

حسنًا ، كما يحدث ، تحتوي C ++ على ميزات معينة تجعلها جذابة للغاية. (صرخ بيتر ويول وديفيد شوارتز للحصول على التفسير التالي).

الميزة رقم 1: التحكم في الذاكرة

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

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

من أجل تلبية كل هذه المتطلبات والأداء على أعلى مستوى ، فأنت بحاجة إلى تحكم صارم وكامل في استخدام وحدة المعالجة المركزية والذاكرة. يعطي C ++ ذلك لمستخدميه.

الميزة رقم 2: خيوط

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

الميزة رقم 3: نقل دلالات

أحد الجوانب الأكثر إثارة للاهتمام في C ++ هو نقل دلالات. يوفر نقل الدلالات طريقة لنقل المحتويات بين الكائنات بدلاً من نسخها تمامًا. دعونا نتحقق من الاختلافات بين نسخ الدلالات ونقل الدلالات. (البيانات التالية مأخوذة من إجابة بيتر ألكساندر في “Stackoverflow”).

نسخ دلالات:

  • تأكيد (ب == ج) ؛
  • أ = ب ؛
  • أكد (أ == ب && ب == ج) ؛

اذا ماذا يحدث هنا؟ تذهب قيمة b إلى a و b تظل كما هي في نهاية الأمر برمته.

الآن ، فكر في هذا.

نقل دلالات:

  • تأكيد (ب = ج) ؛
  • تحرك (أ ، ب) ؛
  • تأكيد (أ = ج) ؛

ماذا يحصل هنا?

هل تستطيع أن ترى الفرق بين مجموعتي الأكواد?

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

الميزة رقم 4: تجميع تعدد الأشكال الزمني

ما هو تعدد الأشكال?

تذكر عندما أطلقنا على C ++ “لغة البرمجة الشيئية (OOP)”؟ يحدث تعدد الأشكال ليكون خاصية OOP. باستخدام تعدد الأشكال ، يمكنك استخدام ميزة معينة بأكثر من طريقة. في C ++ يمكن استخدام تعدد الأشكال بطريقتين:

  • تعدد الأشكال وقت الترجمة.
  • تشغيل تعدد الأشكال وقت.

هنا ، سنركز فقط على تعدد أشكال وقت الترجمة. هناك طريقتان لتطبيق C ++ تعدد أشكال وقت الترجمة:

  • وظيفة التحميل الزائد.
  • زيادة الحمولة على المشغل.

وظيفة التحميل الزائد:

يحدث التحميل الزائد للوظائف عندما يكون لديك العديد من الوظائف التي تحمل نفس الاسم ولكن مع مدخل مختلف للمعلمات.

ضع في اعتبارك هذا البرنامج:

#يشمل

استخدام اسم للمحطة؛

فئة أ

{

void func (int x) // أول مثيل للدالة يأخذ قيمة عدد صحيح واحد فقط

{

كوت<<x<<النهاية.

}

void func (double x) // المثال الثاني للدالة يأخذ قيمة مزدوجة واحدة فقط

{

كوت<<x<<النهاية.

}

void func (int x، int y) // يأخذ المثيل الثالث للدالة قيمتين صحيحتين

{

كوت<<س = ص<<النهاية.

}

}

انت مين()

{

الهدف 1 // صنع كائن واحد من الفئة أ

// الآن سنقوم باستدعاء الوظائف

obj1.func (2) ،

obj1.func (2.65) ؛

obj1.func (2،5) ،

العودة 0 ؛

}

الآن عند تشغيل هذه الوظيفة ، سيكون الإخراج:

  • 2
  • 2.65
  • 7

لذلك ، كما ترى ، تم استخدام نفس الوظيفة func () بثلاث طرق مختلفة.

المشغل الزائد:

في لغة ++ C ، يمكن أن يكون لنفس العامل أكثر من معنى.

  • على سبيل المثال. يمكن استخدام “+” للإضافة الرياضية والتسلسل.
  • التسلسل يعني في الأساس أخذ سلسلتين ودمجهما معًا.
  • إذن 3 + 4 = 7.

و

  • Block + geeks = Blockgeeks.
  • قام نفس المشغل بوظيفتين مختلفتين ، وهما التحميل الزائد للمشغل.

يساعد تعدد الأشكال في وقت الترجمة كثيرًا في تطوير blockchain. يساعد في وضع المسؤوليات بشكل منفصل في وظائف مختلفة ، وبالتالي تعزيز أداء النظام بأكمله.

الميزة رقم 5: عزل الكود

يحتوي C ++ على ميزات مساحة الاسم التي يمكن استيرادها من برنامج إلى آخر. يساعد Namespace في تجنب تضارب الأسماء. أيضًا ، نظرًا لأن C ++ بها فئات ، يمكن أن تعمل كحدود بين واجهات برمجة التطبيقات المختلفة وتساعد في جعل الفصل واضحًا.

الفئة في C ++ هي نوع محدد من قبل المستخدم أو بنية بيانات معلنة مع فئة الكلمات الرئيسية التي تحتوي على بيانات ووظائف كأعضائها. يمكنك الوصول إلى الوظائف المعلنة في الفصل بالتصريح عن كائنات من تلك الفئة المعينة.

الميزة رقم 6: النضج

اللغة ناضجة ويتم تحديثها بانتظام. هناك ما لا يقل عن 3 مجمعين صلبين ، كما يقول David Schwartz ، وتهدف الميزات الجديدة إلى حل المشكلات الحقيقية. تتوفر أدوات تصحيح الأخطاء والأدوات التحليلية بجميع أنواعها لكل شيء بدءًا من تحديد سمات الأداء إلى الكشف التلقائي عن المشكلات من جميع الأنواع. هذا يعني أن اللغة تنمو باستمرار لتضمين ميزات أحدث وأفضل.

بسبب الميزات المذكورة أعلاه ، اختار Satoshi Nakamoto C ++ لتكون اللغة الأساسية لشفرة مصدر البيتكوين.

لغة ترميز Blockchain # 2: Javascript

التالي لدينا جافا سكريبت.

إلى جانب HTML و CSS ، تعد واحدة من التقنيات الأساسية الثلاثة في إنتاج محتوى شبكة الويب العالمية. عادةً ما يتم استخدام Javascript لإنشاء صفحات ويب تفاعلية للغاية. لذلك ، سنرى الآن كيفية إنشاء blockchain بسيط للغاية باستخدام Javascript. صيحة ضخمة لـ savjee.be للمحتوى الموجود في هذا القسم.

لنفترض أننا نريد إنشاء blockchain بسيط في Javascript. قبل أن نفعل ذلك ، هناك أشياء معينة نحتاج إلى معالجتها.

ما هو blockchain وكيف يعمل بالضبط … الشفرة الحكيمة?

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

ترميز blockchain: العديد من اللغات المختلفة التي تحتاجها!

الصورة مجاملة: لوري هارتيكا مقالة متوسطة

يتم توصيل كل كتلة بالكتلة السابقة عبر مؤشر التجزئة الذي يحتوي على تجزئة الكتلة السابقة. إذن ، كيف يجعل هذا السلسلة ثابتة?

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

ترميز blockchain: العديد من اللغات المختلفة التي تحتاجها!

مجرد تغيير الحرف الأول “T” من الحالة العلوية إلى الحالة الصغيرة أدى إلى تغيير تجزئة الإخراج بشكل كبير.

إذن ، كيف يؤثر ذلك على blockchain?

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

لذا ، كيف نصنع كتلة؟ مما تتكون الكتلة البسيطة؟ في عملتنا الرقمية البسيطة التي سنصنعها (دعنا نسميها “BlockGeeksCoin”) ، ستحتوي كل كتلة على المعلومات التالية:

  • الفهرس: لمعرفة رقم الكتلة.
  • الطابع الزمني: لمعرفة وقت الإنشاء.
  • البيانات: البيانات الموجودة داخل الكتلة.
  • الهاش السابق: تجزئة الكتلة السابقة.
  • الهاش: تجزئة الكتلة الحالية.

قبل أن نواصل. تحتاج إلى فهم بعض المصطلحات التي سنستخدمها في برنامجنا:

  • هذه: يتم استدعاء الكلمة الأساسية “this” داخل دالة وتمكنك من الوصول إلى القيم الموجودة داخل كائن معين يستدعي تلك الوظيفة المحددة.
  • البناء: المُنشئ هو وظيفة خاصة يمكن أن تساعد في إنشاء كائن وتهيئته داخل الفصل. كل فئة مقصورة على مُنشئ واحد فقط.

الآن بعد أن تم ذلك ، فلنبدأ في عمل الحظر.

خلق الكتلة

const SHA256 = تتطلب ("تشفير- js / sha256") ؛

كتلة فئة

{

المُنشئ (فهرس ، طابع زمني ، بيانات ، تجزئة سابقة = ”)

{

this.index = index؛

this.previousHash = previousHash؛

this.timestamp = الطابع الزمني ؛

this.data = بيانات ؛

this.hash = this.calculateHash () ؛

}

حساب تجزئة ()

{

إرجاع SHA256 (this.index + this.previousHash + this.timestamp + JSON.stringify (this.data)). toString () ؛

}

}

تحليل الكود

حسنًا ، هذا هنا خارج الكتلة. لذلك ، في السطر الأول من الكود أطلقنا عليه اسم مكتبة crypto-js لأن وظيفة التجزئة sha256 غير متوفرة في JavaScript.

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

في الكتلة ، نأخذ كل المحتويات ونقوم بتجزئتها للحصول على تجزئة تلك الكتلة المعينة. نحن نستخدم وظيفة JSON.stringify لتحويل بيانات الكتلة إلى سلسلة لتجزئةها.

حسنًا ، لدينا الكتلة جاهزة وجيدة للذهاب. الآن دعنا نربط الكتل معًا في blockchain.

إنشاء blockchain

فئة Blockchain

{

// القسم 1 تكوين كتلة التكوين

البناء()

{

this.chain = [this.createGenesisBlock ()] ؛

}

createGenesisBlock ()

{

العودة بلوك جديد (0, "01/01/2017", "كتلة التكوين", "0") ؛

}

// القسم 2 إضافة كتل جديدة

getLatestBlock ()

{

إرجاع this.chain [this.chain.length – 1] ؛

}

addBlock (newBlock) {

newBlock.previousHash = this.getLatestBlock (). hash؛

newBlock.hash = newBlock.calculateHash () ،

this.chain.push (newBlock) ؛

}

// القسم 3 التحقق من صحة السلسلة

isChainValid ()

{

لـ (اسمح أنا = 1 ؛ أنا < this.chain.length. أنا ++)

{

const currentBlock = this.chain [i] ؛

const previousBlock = this.chain [i – 1] ؛

إذا (currentBlock.hash! == currentBlock.calculateHash ()) {

عودة كاذبة؛

}

إذا (currentBlock.previousHash! == previousBlock.hash)

{

عودة كاذبة؛

}

}

العودة صحيح

}

}

تحليل الكود

حسنًا ، هناك الكثير من الأشياء التي تحدث في السلسلة أعلاه ، دعنا نقسمها إلى أقسام.

القسم 1: التكوين

ما هي كتلة التكوين?

إن Genesis block هو أول كتلة من blockchain ، والسبب في كونه مميزًا هو أنه بينما يشير كل bock إلى الكتلة السابقة له ، فإن genesis block لا يشير إلى أي شيء. لذلك ، في اللحظة التي يتم فيها إنشاء سلسلة جديدة ، يتم استدعاء كتلة التكوين على الفور. يمكنك أيضًا رؤية وظيفة “createGenesisBlock ()” حيث قدمنا ​​بيانات الكتلة يدويًا:

createGenesisBlock ()

{

إرجاع الكتلة الجديدة (0، “01/01/2017”، “Genesis block”، “0”)؛

}

الآن بعد أن قمنا ببناء كتلة التكوين ، فلنقم ببناء بقية السلسلة.

القسم 2: إضافة القوالب

أولاً ، سنحتاج إلى معرفة آخر كتلة في blockchain حاليًا. لذلك نستخدم وظيفة getLatestBlock ().

getLatestBlock ()

{

إرجاع this.chain [this.chain.length – 1] ؛

}

الآن بعد أن حددنا أحدث كتلة ، دعنا نرى كيف سنضيف كتل جديدة.

addBlock (newBlock) {

newBlock.previousHash = this.getLatestBlock (). hash؛

newBlock.hash = newBlock.calculateHash () ،

this.chain.push (newBlock) ؛

}

اذا ماذا يحدث هنا؟ كيف نضيف الكتل؟ كيف نتحقق مما إذا كانت الكتلة المحددة صالحة أم لا?

تذكر محتويات الكتلة?

تحتوي الكتلة على تجزئة اليمين للكتلة السابقة?

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

ترميز blockchain: العديد من اللغات المختلفة التي تحتاجها!

الصورة مجاملة: لوري هارتيكا مقالة متوسطة

إذا تطابقت هاتان القيمتان ، فهذا يعني أن الكتلة الجديدة شرعية ويتم إضافتها إلى blockchain.

القسم 3: التحقق من صحة السلسلة

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

نحن نستخدم حلقة “for” للانتقال من الكتلة 1 إلى الكتلة الأخيرة. كتلة التكوين هي الكتلة 0.

لـ (اسمح أنا = 1 ؛ أنا < this.chain.length. أنا ++)

{

const currentBlock = this.chain [i] ؛

const previousBlock = this.chain [i – 1] ؛

في هذا الجزء من الكود ، نحدد مصطلحين ، الكتلة الحالية والكتلة السابقة. والآن سنجد ببساطة تجزئة هاتين القيمتين.

إذا (currentBlock.hash! == currentBlock.calculateHash ()) {

عودة كاذبة؛

}

إذا (currentBlock.previousHash! == previousBlock.hash)

{

عودة كاذبة؛

}

}

العودة صحيح

}

إذا كانت “الهاش السابق” للكتلة الحالية لا تساوي “الهاش” للكتلة السابقة ، فإن هذه الوظيفة ستعيد False ، وإلا ستعيد صحيح.

باستخدام blockchain

الآن ، سنستخدم blockchain أخيرًا لإنشاء BlockGeeksCoin الخاص بنا.

  • دع BlockGeeksCoin = new Blockchain () ؛
  • BlockGeeksCoin.addBlock (new Block (1، “20/07/2017” ، {amount: 4})) ؛
  • BlockGeeksCoin.addBlock (new Block (2، “20/07/2017” ، {amount: 8})) ؛

وهذا كل شيء!

إذن ما حدث هنا?

أنشأنا عملة مشفرة جديدة على أساس blockchain وأطلقنا عليها اسم BlockGeeksCoin. من خلال استدعاء هذا الكائن الجديد ، قمت بتنشيط المُنشئ ، والذي بدوره أنشأ كتلة Genesis تلقائيًا.

لقد قمنا ببساطة بإضافة كتلتين إضافيتين إليها وأعطيناهم بعض البيانات.

الأمر بهذه البساطة.

(شكرا لك savjee.be على الشرح المذهل والبسيط.)

لغة ترميز Blockchain # 3: Python

أنشأ المبرمج الهولندي Guido van Rossum لغة Python في عام 1991. وتستند لغة Python على فلسفة بسيطة: البساطة والبساطة. واحدة من أكثر الطرق الملحوظة التي أدمجوا بها البساطة في لغتهم هي استخدام المسافات البيضاء للدلالة على كتل التعليمات البرمجية بدلاً من الأقواس المتعرجة أو الكلمات الرئيسية. دعونا نرى ما يعنيه هذا.

دعونا نتحقق من برنامج “hello world” البسيط.

طباعة (“مرحبًا بالعالم!”)

نعم ، هذا كل شيء!

قارن ذلك ببرنامج C ++ “hello world”.

ترى كم هو أقل تعقيدا بالمقارنة؟ ماذا عن القيام بشيء أكثر تعقيدًا؟ لنفترض أننا نضيف رقمين ونطبع النتيجة.

العدد 1 = 1.5

عدد 2 = 6.3

المجموع = تعويم (num1) + عائم (عدد 2)

طباعة (“مجموع {0} و {1} هو {2}”. (num1، num2، sum))

وهذا كل شيء.

سيكون ناتج هذا البرنامج:

  • مجموع 1.5 و 6.3 هو 7.8

لذا ، فلننتقل إلى ما قبل. كيف سنقوم ببرمجة blockchain بأكمله باستخدام Python؟ البيانات والرموز التالية مأخوذة من مقالة جيرالد ناش في Medium.

خلق الكتلة

أولاً ، دعونا نجعل الحظر الخاص بنا:

استيراد hashlib كما التجزئة

كتلة الفصل:

def __init __ (ذاتي ، فهرس ، طابع زمني ، بيانات ، تجزئة سابقة):

الفهرس الذاتي = الفهرس

self.timestamp = الطابع الزمني

self.data = البيانات

self.previous_hash = previous_hash

self.hash = self.hash_block ()

def hash_block (ذاتي):

sha = hasher.sha256 ()

sha.update (str (فهرس ذاتي) +

str (self.timestamp) +

str (بيانات ذاتية) +

str (self.previous_hash))

عودة sha.hexdigest ()

تحليل الكود

نبدأ باستيراد مكتبة التجزئة لاستخدام اختصارات SHA 256 (تمامًا مثل جافا سكريبت).

كما في السابق ، الكتلة لها نفس القيمة:

  • فهرس.
  • الطابع الزمني.
  • البيانات.
  • التجزئة السابقة.
  • تجزئة.

مرة واحدة ضد ذلك ، نقوم بملء قيم التجزئة عبر وظيفة ، كما كان من قبل.

إنشاء كتلة التكوين

الآن ، دعنا ننشئ كتلة التكوين:

استيراد التاريخ والوقت كتاريخ

def create_genesis_block ():

كتلة الإرجاع (0، date.datetime.now ()، “Genesis Block”، “0”)

تحليل الكود

لقد قمنا باستيراد التاريخ والوقت لوضع الطابع الزمني.

لقد أنشأنا ببساطة كتلة التكوين وأعطيناها يدويًا بعض البيانات للعمل معها. قيمة التجزئة السابقة هي “0” لأنها لا تشير إلى أي كتلة أخرى.

إنشاء باقي الكتل

الآن دعونا نحدد كيف سيتم إنشاء الكتل اللاحقة.

def next_block (last_block):

this_index = last_block.index + 1

this_timestamp = date.datetime.now ()

this_data = "مهلا! كتلة ايم " + str (this_index)

this_hash = last_block.hash

كتلة العودة (this_index، this_timestamp، this_data، this_hash)

تحليل الكود

لذا ، كيف سنحدد قيم كل جزء من البيانات داخل كل كتلة?

مؤشر الكتلة هو ببساطة فهرس الكتلة الأخيرة + 1.

الطابع الزمني هو التاريخ والوقت الحاليين.

بيانات الكتلة هي رسالة بسيطة: “مرحبًا! كتلة ايم “.

تجزئة نحسبها باستخدام الوظيفة التي حددناها مسبقًا.

وفي النهاية ، نعيد كل هذه القيم إلى الكتلة.

إنشاء blockchain

أخيرًا ، دعنا ننشئ blockchain.

blockchain = [create_genesis_block ()]

previous_block = blockchain [0]

num_of_blocks_to_add = 15

بالنسبة لـ i في النطاق (0 ، عدد_الكتل_إضافة):

block_to_add = next_block (الكتلة السابقة)

blockchain.append (block_to_add)

Previous_block = block_to_add

# أخبر الجميع عنها!

مطبعة "تمت إضافة Block # {} إلى blockchain!".التنسيق (block_to_add.index)

مطبعة "تجزئة: {} n".التنسيق (block_to_add.hash)

تحليل الكود

أولاً ، نقوم بإنشاء قالب التكوين ونعطي قيمته لـ “الكتلة السابقة”.

ثم نحدد عدد الكتل المراد إضافتها ، في هذا المثال سنذهب مع 15.

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

هذا ما سيبدو عليه الإخراج:

ترميز blockchain: العديد من اللغات المختلفة التي تحتاجها!

الصورة مجاملة: مقال جيرالد ناش ميديوم

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

اللغة # 4: الصلابة

أخيرًا ، نأتي إلى Solidity. بالنسبة لأي شخص يريد تعلم كيفية إنشاء DAPPs (التطبيقات اللامركزية) أو الدخول في لعبة ICO ، فإن تعلم Solidity أمر لا بد منه. لدينا بالفعل دليل مفصل يمكنك قراءته هنا. ومع ذلك ، سنقدم لك هنا نظرة عامة أساسية. تم تطوير Solidity بواسطة Gavin Wood و Christian Reitwiessner و Alex Beregszaszi و Yoichi Hirai والعديد من المساهمين السابقين في ethereum لتمكين كتابة العقود الذكية على منصات blockchain مثل Ethereum.

Solidity هي لغة مخففة بشكل مقصود ، مكتوبة بشكل فضفاض مع بناء جملة مشابه جدًا لـ ECMAScript (Javascript). هناك بعض النقاط الرئيسية التي يجب تذكرها من مستند Ethereum Design Rationale ، وهي أننا نعمل ضمن نموذج مكدس وذاكرة بحجم كلمة تعليمات 32 بايت ، حيث يتيح لنا EVM (جهاز Ethereum Virtual) الوصول إلى البرنامج ” المكدس “الذي يشبه مساحة التسجيل حيث يمكننا أيضًا لصق عناوين الذاكرة لجعل حلقة / قفزة عداد البرنامج (للتحكم في البرنامج المتسلسل) ، و” ذاكرة “مؤقتة قابلة للتوسيع و” تخزين “دائم يتم كتابته فعليًا في blockchain ، والأهم من ذلك ، يتطلب EVM حتمية تامة في العقود الذكية.

لذلك ، قبل المتابعة ، دعنا نتحقق من مثال عقد Solidity الأساسي. (رموز مأخوذة من جيثب).

دعونا نجري حلقة while في الصلابة:

عقد BasicIterator

{

منشئ العنوان // حجز واحد "تبوك"-اكتب بقعة

uint8 [10] أعداد صحيحة ؛ // حجز مساحة تخزين لـ 10 أعداد صحيحة بدون إشارة 8 بت في مصفوفة

وظيفة BasicIterator ()

{

الخالق = msg.sender ؛

uint8 س = 0 ؛

// القسم 1: تعيين القيم

بينما (x < عدد صحيح طول) {

أعداد صحيحة [س] = س ؛

x ++ ؛

}}

دالة getSum () عوائد ثابتة (uint) {

uint8 sum = 0 ؛

uint8 س = 0 ؛

// القسم 2: إضافة الأعداد الصحيحة في المصفوفة.

بينما (x < عدد صحيح طول) {

المجموع = مجموع + أعداد صحيحة [س] ؛

x ++ ؛

}

مبلغ العائد

}

// القسم 3: فسخ العقد

قتل وظيفة ()

{

إذا (msg.sender == منشئ)

{

انتحار (مبتكر) ؛

}

}

}

لذا ، دعونا نحلل.

القسم 1: تعيين القيم

في الخطوة الأولى ، نقوم بملء مصفوفة تسمى “أعداد صحيحة” تأخذ 10 أعداد صحيحة بدون إشارة 8 بت. الطريقة التي نقوم بها هي عبر حلقة while. دعونا نلقي نظرة على ما يحدث داخل حلقة while.

بينما (x < عدد صحيح طول) {

أعداد صحيحة [س] = س ؛

x ++ ؛

}

تذكر ، لقد قمنا بالفعل بتعيين قيمة “0” للعدد الصحيح x. تنتقل حلقة while من 0 إلى عدد صحيح. الأعداد الصحيحة هي دالة ترجع السعة القصوى للمصفوفة. لذا ، إذا قررنا أن المصفوفة ستحتوي على 10 أعداد صحيحة ، فإن arrayname.length ستعيد القيمة 10. في الحلقة أعلاه ، قيمة x تتراوح من 0 إلى 9 (<10) ويخصص قيمة نفسه لمصفوفة الأعداد الصحيحة أيضًا. لذلك ، في نهاية الحلقة ، سيكون للأعداد الصحيحة القيمة التالية:

0،1،2،3،4،5،6،7،8،9.

القسم 2: إضافة محتوى المصفوفة

داخل دالة getSum () سنضيف محتويات المصفوفة نفسها. الطريقة التي يتم بها القيام بذلك هي تكرار نفس حلقة while كما هو مذكور أعلاه واستخدام المتغير “sum” لإضافة محتويات المصفوفة.

القسم الثالث: فسخ العقد

تؤدي هذه الوظيفة إلى إنهاء العقد وإرسال الأموال المتبقية في العقد مرة أخرى إلى منشئ العقد.

عندما سئل عن الإلهام والدافع وراء خلق الصلابة ، قال الدكتور جافين وودز:

“كان من المفترض أن تكون [Solidity] أداة متطورة لتطوير العقود التي يمكن أن توفر للمطورين والمستخدمين في النهاية معلومات جيدة حول ما فعله الكود. للمساعدة في ذلك ، ابتكرت NatSpec ، وهو تنسيق توثيق مناسب للعقد ، وجعلته مواطنًا من الدرجة الأولى في Solidity. لقد اقترحت أيضًا مجموعة فرعية رسمية من لغة التدقيق (لم يتم تنفيذها بعد) من أجل تعظيم أنواع ضمانات الصحة التي يمكن إجراؤها.

لقد قدمت الأحداث كمواطن من الدرجة الأولى إلى لغة Solidity من أجل تقديم فكرة تجريدية لطيفة لـ LOGs مماثلة في شكلها للمكالمات الوظيفية. جاء الإلهام لذلك من “إشارات” نظام كيو تي للكائنات الفوقية.

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

ترميز Blockchain: الخاتمة

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

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
map