كيفية بناء Blockchain بسيط للعملة المشفرة في Node.js

نشرت: 2022-03-10
ملخص سريع ↬ يوضح هذا البرنامج التعليمي كيفية إنشاء عملة مشفرة بسيطة ، تسمى smashingCoin ، باستخدام مفاهيم فئات JavaScript و Node.js. جربها - إنها أبسط مما تعتقد!

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

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

تقليديًا ، كانت Python هي لغة البرمجة الفعلية لتطوير blockchain. ومع ذلك ، مع انتشار هذه التكنولوجيا المدهشة ، زادت أيضًا خيارات التطوير - ولم يتم التخلي عن Node.js.

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

سأسمي هذه العملة المشفرة البسيطة smashingCoin .

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

يوصى بقراءة : فهم نزاهة الموارد الفرعية بواسطة درو ماكليلان

المتطلبات الأساسية

لمتابعة هذا البرنامج التعليمي بنجاح ، ستحتاج إلى ما يلي:

  • تم تثبيت Node.js على جهازك. يمكنك تحميل البرنامج من هنا؛
  • محرر كود ، مثل Visual Studio Code أو Sublime Text أو أي برنامج آخر.

هيا بنا نبدأ…

المزيد بعد القفز! أكمل القراءة أدناه ↓

ما هي البلوك تشين؟

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

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

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

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

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

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

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

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

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

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

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

لإنشاء عملة smashingCoin ، سأستخدم فئات JavaScript ، والتي تم تقديمها في ES6.

مستعد؟

دعونا نتسخ أيدينا ...

هذا هو رمز فئة CryptoBlock :

 const SHA256 = require('crypto-js/sha256'); class CryptoBlock{ constructor(index, timestamp, data, precedingHash=" "){ this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); } computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)).toString(); } }

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

index إنه رقم فريد يتتبع موقع كل كتلة في blockchain بأكمله.
timestamp يحتفظ بسجل لوقت حدوث كل معاملة مكتملة.
data يوفر بيانات حول المعاملات المكتملة ، مثل تفاصيل المرسل وتفاصيل المستلم والكمية التي تم التعامل معها.
precedingHash يشير إلى تجزئة الكتلة السابقة في blockchain ، وهو أمر مهم في الحفاظ على سلامة blockchain.

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

كما ترى ، قمت باستيراد مكتبة JavaScript crypto-js واستخدمت وحدة crypto-js/sha256 لحساب تجزئة كل كتلة. نظرًا لأن الوحدة تُرجع كائنًا رقميًا ، فقد استخدمت طريقة toString() لتحويلها إلى سلسلة.

لإضافة مكتبة crypto-js إلى مشروعك ، انتقل إلى Terminal وقم بتشغيل الأمر التالي لتثبيته باستخدام npm :

 npm install --save crypto-js

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

كيف تصنع بلوكشين

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

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

هذا هو رمز فئة CryptoBlockchain :

 class CryptoBlockchain{ constructor(){ this.blockchain = [this.startGenesisBlock()]; } startGenesisBlock(){ return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock(){ return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; newBlock.hash = newBlock.computeHash(); this.blockchain.push(newBlock); } }

اسمحوا لي أن أتحدث عن أدوار كل من الطرق المساعدة التي تشكل فئة CryptoBlockchain .

1. طريقة البناء

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

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

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

على العكس من ذلك ، في حالة هذه الكتلة الأولية ، ليس لديها أي كتلة سابقة للإشارة إليها. لذلك ، عادةً ما يتم ترميز كتلة التكوين في blockchain. بهذه الطريقة ، يمكن إنشاء الكتل اللاحقة عليه. عادة ما تحتوي على فهرس 0.

لقد استخدمت طريقة startGenesisBlock() لإنشاء كتلة التكوين. لاحظ أنني قمت بإنشائه باستخدام فئة CryptoBlock التي تم إنشاؤها مسبقًا وقمت بتمرير index timestamp data ومعلمات Hash precedingHash .

3. الحصول على أحدث بلوك

يساعد الحصول على أحدث كتلة في blockchain في ضمان تجزئة نقاط الكتلة الحالية إلى تجزئة الكتلة السابقة - وبالتالي الحفاظ على سلامة السلسلة.

لقد استخدمت طريقة obtainLatestBlock() لاستردادها.

4. إضافة كتل جديدة

لقد استخدمت طريقة addNewBlock() لإضافة كتلة جديدة إلى السلسلة. لتحقيق ذلك ، قمت بتعيين التجزئة السابقة للكتلة الجديدة لتكون مساوية لتجزئة الكتلة الأخيرة في السلسلة - وبالتالي ضمان أن السلسلة مقاومة للعبث.

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

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

اختبار Blockchain

الآن ، دعنا نختبر blockchain البسيط الخاص بنا ونرى ما إذا كان يعمل.

ها هو الكود:

 let smashingCoin = new CryptoBlockchain(); smashingCoin.addNewBlock(new CryptoBlock(1, "01/06/2020", {sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50})); smashingCoin.addNewBlock(new CryptoBlock(2, "01/07/2020", {sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100}) ); console.log(JSON.stringify(smashingCoin, null, 4));

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

إذا قمت بتشغيل الكود على الجهاز ، فإليك الإخراج الذي سأحصل عليه:

كيف تبدو blockchain تحت الغطاء
اختبار لمعرفة ما إذا كانت blockchain الخاصة بنا تعمل. (معاينة كبيرة)

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

كيفية التحقق من سلامة Blockchain

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

لذلك ، للتحقق من سلامة blockchain ، سأضيف طريقة checkChainValidity() إلى فئة CryptoBlockchain .

تعد Hash أمرًا بالغ الأهمية لضمان صلاحية وأمن blockchain لأن أي تغيير في محتويات الكتلة سيؤدي إلى إنتاج تجزئة جديدة تمامًا ، وإبطال blockchain.

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

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

ها هو الكود:

 checkChainValidity(){ for(let i = 1; i < this.blockchain.length; i++){ const currentBlock = this.blockchain[i]; const precedingBlock= this.blockchain[i-1]; if(currentBlock.hash !== currentBlock.computeHash()){ return false; } if(currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; }

كيفية إضافة إثبات العمل

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

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

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

يبدأ ضمان تجزئة كل كتلة بعدد الأصفار كما هو محدد في مستوى difficulty يتطلب قدرًا كبيرًا من قوة الحوسبة. كلما ارتفع مستوى الصعوبة ، زاد الوقت المستغرق لتعدين الكتل الجديدة.

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

ها هو الكود:

 proofOfWork(difficulty){ while(this.hash.substring(0, difficulty) !==Array(difficulty + 1).join("0")){ this.nonce++; this.hash = this.computeHash(); } }

وإليك طريقة computeHash() المحدثة مع تضمين المتغير nonce :

 computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)+this.nonce).toString(); }

بالإضافة إلى ذلك ، لتنفيذ إثبات آلية العمل في إنشاء كتل جديدة ، سأدرجها في طريقة addNewBlock() :

 addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); }

تغليف

هذا هو الكود الكامل لبناء عملة معماة smashingCoin باستخدام Node.js:

 const SHA256 = require("crypto-js/sha256"); class CryptoBlock { constructor(index, timestamp, data, precedingHash = " ") { this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); this.nonce = 0; } computeHash() { return SHA256( this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data) + this.nonce ).toString(); } proofOfWork(difficulty) { while ( this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0") ) { this.nonce++; this.hash = this.computeHash(); } } } class CryptoBlockchain { constructor() { this.blockchain = [this.startGenesisBlock()]; this.difficulty = 4; } startGenesisBlock() { return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock() { return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock) { newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); } checkChainValidity() { for (let i = 1; i < this.blockchain.length; i++) { const currentBlock = this.blockchain[i]; const precedingBlock = this.blockchain[i - 1]; if (currentBlock.hash !== currentBlock.computeHash()) { return false; } if (currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; } } let smashingCoin = new CryptoBlockchain(); console.log("smashingCoin mining in progress...."); smashingCoin.addNewBlock( new CryptoBlock(1, "01/06/2020", { sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50 }) ); smashingCoin.addNewBlock( new CryptoBlock(2, "01/07/2020", { sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100 }) ); console.log(JSON.stringify(smashingCoin, null, 4));

إذا قمت بتشغيل الكود على الجهاز ، فإليك الإخراج الذي سأحصل عليه:

ناتج إنشاء عملة معماة بسيطة في Node.js
أخيرًا ، عملتنا المشفرة smashingCoin ! (معاينة كبيرة)

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

خاتمة

هذا هو! هذه هي الطريقة التي يمكنك بها بناء blockchain بسيط للعملات المشفرة باستخدام Node.js.

بطبيعة الحال ، فإن عملة smashingCoin المشفرة بعيدة عن الاكتمال. في الواقع ، إذا قمت بإصداره دون إجراء المزيد من التحسينات ، فمن غير المرجح أن يلبي متطلبات السوق الحالية لعملة رقمية آمنة وموثوقة وبديهية - مما يجعلك الشخص الوحيد الذي يستخدمها!

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

إذا كان لديك أي تعليقات أو أسئلة ، يرجى نشرها أدناه.

مزيد من الموارد

  • "Blockchain 101" ، CoinDesk
  • "بيتكوين: نظام نقدي إلكتروني من نظير إلى نظير" ساتوشي ناكاموتو ، Bitcoin.org