Blockchain: ماذا يجب أن نبني PoC؟

عيون خائفة ، وحكة الأيدي!

في المقالات السابقة ، اكتشفنا التقنيات التي بنيت عليها الكتل الحجرية ( ماذا يجب أن نبني سلسلة مفاتيح ل؟ ) والحالات التي يمكن تنفيذها بمساعدتهم ( ما الذي يجب أن نبني حالة؟ ). حان وقت العمل بيديك! لتنفيذ الطيارين و PoC (إثبات الفكرة) ، أفضل استخدام السحب لأن يمكن الوصول إليها من أي مكان في العالم ، وفي كثير من الأحيان ، لا يتعين عليك قضاء بعض الوقت على التثبيت الشاق للبيئة ، لأن هناك تكوينات محددة مسبقا. لذلك ، دعونا نفعل شيئًا بسيطًا ، على سبيل المثال ، شبكة لتحويل العملات المعدنية بين المشاركين ونطلق عليها Citcoin بشكل متواضع. لهذا الغرض ، سوف نستخدم سحابة IBM ونسيج Hyperledger العالمي blockchain. أولاً ، دعنا نرى لماذا يطلق على Hyperledger Fabric اسم blockchain العالمي.

صورة

Hyperledger Fabric - كتلة عالمية


بشكل عام ، نظام المعلومات العالمي هو:

  • مجموعة من الخوادم ومجموعة البرامج الأساسية التي تقوم بتنفيذ منطق الأعمال ؛
  • واجهات للتفاعل مع النظام ؛
  • وسائل التسجيل والمصادقة والترخيص للأجهزة / الأشخاص ؛
  • قاعدة بيانات تخزين البيانات التشغيلية والأرشيف:

صورة

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

Hyperledger النسيج العمارة


يُظهر الرسم التخطيطي بنية Hyperledger Fabric:

صورة

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

القناة - هيكل منطقي يوحد الأقران في مجموعات ، أي تم تعيين Blockchain. يمكن أن تقوم Hyperledger Fabric بمعالجة عدة كتل في وقت واحد مع منطق أعمال مختلف.

موفر خدمات العضوية (MSP) هو المرجع المصدق (CA) لإصدار الهوية وتعيين الأدوار. لإنشاء عقدة ، تحتاج إلى التفاعل مع MSP.

عقد الأقران - التحقق من المعاملات ، وتخزين blockchain ، وتنفيذ العقود الذكية والتفاعل مع التطبيقات. أقرانهم لديهم هوية (شهادة رقمية) تصدر MSP. على عكس شبكة Bitcoin أو Etherium ، حيث تكون جميع العقد متساوية ، تلعب العقد Hyperledger Fabric أدوارًا مختلفة:

  • يمكن أن يدعم النظير النظير (EP) وتنفيذ العقود الذكية.
  • نظير الالتزام (CP) - فقط حفظ البيانات على blockchain وتحديث "الحالة العالمية".
  • Anchor Peer (AP) - إذا شاركت العديد من المنظمات في blockchain ، فسيتم استخدام أقرانهم الرئيسيين للتواصل بينهم. يجب أن يكون لدى كل منظمة واحد أو أكثر من أقرانها. بمساعدة AP ، يمكن لأي نظير في المنظمة الحصول على معلومات حول جميع أقرانه في المنظمات الأخرى. يستخدم بروتوكول القيل والقال لمزامنة المعلومات بين نقاط الوصول.
  • Leader Peer - إذا كان لدى المنظمة العديد من الأقران ، فسيحصل زعيم النظير فقط على كتل من خدمة الطلب ويعطيها للزملاء الآخرين. يمكن تعيين الزعيم بشكل ثابت أو اختياره ديناميكيًا من قبل أقرانه في المنظمة. كما يستخدم بروتوكول القيل والقال لمزامنة معلومات القائد.

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

دفتر الأستاذ - يتكون من blockchain "Blockchain" وقاعدة البيانات "حالة Word" ، التي تخزن الحالة الحالية للأصول. تستخدم الدولة العالمية LevelDB أو CouchDB.

عقد ذكي - باستخدام العقود الذكية ، يتم تنفيذ منطق الأعمال للنظام. في Hyperledger Fabric ، تسمى العقود الذكية chaincode. بمساعدة chaincode ، يتم تحديد الأصول والمعاملات فوقها. في التحدث بلغة تقنية ، تعتبر العقود الذكية وحدات برمجية يتم تنفيذها بلغات برمجة JS أو Go.

سياسة المصادقة - بالنسبة لكل سلسلة سلاسل ، يمكنك تحديد عدد السياسات ومن الذي تتوقع منه تأكيدات للمعاملة. إذا لم يتم تعيين السياسة ، فسيتم استخدامها افتراضيًا: "يجب تأكيد المعاملة من قبل أي عضو في أي مؤسسة في القناة". أمثلة على السياسات:

  • يجب على أي مسؤول في المنظمة تأكيد المعاملة ؛
  • يجب أن يؤكد أي عضو أو عميل في المنظمة ؛
  • يجب تأكيد أي منظمة نظير.

طلب الخدمة - حزم المعاملات في كتل ويرسل الزملاء إلى القناة. يضمن تسليم الرسائل إلى جميع أقرانه على الشبكة. بالنسبة للأنظمة الصناعية ، يستخدم وسيط رسائل Kafka لتطوير واختبار Solo .

CallFlow


صورة

  • يتفاعل التطبيق مع Hyperledger Fabric باستخدام Go أو Node.js أو Java SDK؛
  • ينشئ العميل معاملة tx ويرسلها إلى أقرانه الداعمين ؛
  • يتحقق Peer من توقيع العميل ، ويكمل المعاملة ، ويرسل توقيع المصادقة مرة أخرى إلى العميل. يتم تنفيذ Chaincode فقط على النظير الداعم ، ويتم إرسال نتيجة تنفيذه إلى جميع أقرانه. تسمى خوارزمية العمل - إجماع (PBFT (عملي البيزنطي خطأ التسامح) الإجماع. يختلف عن BFT الكلاسيكي في إرسال الرسالة والتأكيد ليس متوقعًا من جميع المشاركين ، ولكن من مجموعة محددة فقط ؛
  • بعد تلقي العميل لعدد الردود المطابقة لسياسة المصادقة ، يرسل المعاملة إلى خدمة الطلب ؛
  • طلب الخدمة يشكل كتلة ويرسلها إلى جميع أقرانه الملتزمين. توفر خدمة الطلب كتابة متسلسلة للكتل ، والتي تستثني ما يسمى شوكة دفتر الأستاذ ( انظر قسم "الشوك" ) ؛
  • يتلقى الأقران كتلة ، والتحقق من سياسة التصديق مرة أخرى ، وكتابة الكتلة إلى blockchain وتغيير الحالة في DB "الدولة العالمية".

أي اتضح فصل الأدوار بين العقد. هذا يوفر قابلية التوسع والأمن blockchain:

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

لمزيد من المعلومات حول الحلول المعمارية لشركة Hyperledger Fabric ولماذا تعمل بهذه الطريقة ، انظر هنا: أصول الهندسة المعمارية أو هنا: Hyperledger Fabric: نظام التشغيل الموزع للعقود المسموح بها .

لذلك ، Hyperledger Fabric هو نظام عالمي بحق يمكنك من خلاله:

  • تنفيذ منطق الأعمال التعسفي باستخدام آلية العقد الذكية ؛
  • كتابة واستقبال البيانات من قاعدة بيانات blockchain بتنسيق JSON ؛
  • توفير والتحقق من الوصول إلى API باستخدام شهادة المرجع.

الآن وبعد أن توصلنا إلى تفاصيل نسيج Hyperledger ، دعونا أخيرًا نفعل شيئًا مفيدًا!

توسيع Blockchain


بيان المشكلة


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

صورة

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

آي بي إم سحابة


نقوم بإنشاء حساب في سحابة IBM . لاستخدام النظام الأساسي blockchain ، تحتاج إلى ترقيته إلى Pay-As-You-Go. هذه العملية قد لا تكون سريعة ، لأن تطلب IBM معلومات إضافية وتتحقق منها يدويًا. من الجانب الإيجابي ، يمكنني القول أن لدى IBM مواد تدريب جيدة تتيح لك نشر Hyperledger Fabric في السحابة الخاصة بهم. أعجبتني السلسلة التالية من المقالات والأمثلة:


فيما يلي لقطات شاشة لمنصة IBM Blockchain. هذه ليست تعليمات لإنشاء blockchain ، ولكن ببساطة عرضا توضيحا لنطاق المهمة. لذلك ، لأغراضنا ، نقوم بإنشاء منظمة واحدة:

صورة

في ذلك نقوم بإنشاء العقد: Orderer CA و Org1 CA و Orderer Peer:

صورة

نبدأ المستخدمين:

صورة

أنشئ قناة واسميها citcoin:

صورة

في جوهرها ، القناة عبارة عن كتلة سلسلة ، لذلك تبدأ بـ صفر كتلة (كتلة سفر التكوين):

صورة

كتابة عقد ذكي


/* * Citcoin smart-contract v1.5 for Hyperledger Fabric * (c) Alexey Sushkov, 2019 */ 'use strict'; const { Contract } = require('fabric-contract-api'); const maxAccounts = 5; class CitcoinEvents extends Contract { async instantiate(ctx) { console.info('instantiate'); let emptyList = []; await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList))); } // Get all accounts async GetAccounts(ctx) { // Get account list: let accounts = '{}' let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { accounts = JSON.parse(accountsData.toString()); } else { throw new Error('accounts not found'); } return accountsData.toString() } // add a account object to the blockchain state identifited by their name async AddAccount(ctx, name, balance) { // this is account data: let account = { name: name, balance: Number(balance), type: 'account', }; // create account: await ctx.stub.putState(name, Buffer.from(JSON.stringify(account))); // Add account to list: let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { let accounts = JSON.parse(accountsData.toString()); if (accounts.length < maxAccounts) { accounts.push(name); await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(accounts))); } else { throw new Error('Max accounts number reached'); } } else { throw new Error('accounts not found'); } // return object return JSON.stringify(account); } // Sends money from Account to Account async SendFrom(ctx, fromAccount, toAccount, value) { // get Account from let fromData = await ctx.stub.getState(fromAccount); let from; if (fromData) { from = JSON.parse(fromData.toString()); if (from.type !== 'account') { throw new Error('wrong from type'); } } else { throw new Error('Accout from not found'); } // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balances if ((from.balance - Number(value)) >= 0 ) { from.balance -= Number(value); to.balance += Number(value); } else { throw new Error('From Account: not enought balance'); } await ctx.stub.putState(from.name, Buffer.from(JSON.stringify(from))); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "SendFrom", from: from.name, to: to.name, balanceFrom: from.balance, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('SendFrom', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } // get the state from key async GetState(ctx, key) { let data = await ctx.stub.getState(key); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // GetBalance async GetBalance(ctx, accountName) { let data = await ctx.stub.getState(accountName); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // Refill own balance async RefillBalance(ctx, toAccount, value) { // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balance to.balance += Number(value); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "RefillBalance", to: to.name, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('RefillBalance', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } } module.exports = CitcoinEvents; 

حدسي ، يجب أن يكون كل شيء واضح هنا:

  • هناك العديد من الوظائف (AddAccount ، GetAccounts ، SendFrom ، GetBalance ، RefillBalance) التي سيتصل بها البرنامج التجريبي باستخدام API Hyperledger Fabric.
  • إنشاء الدالتين SendFrom و RefillBalance الأحداث (الحدث) التي سيتلقى البرنامج التجريبي.
  • وظيفة إنشاء مثيل - يتم استدعاؤه مرة واحدة أثناء إنشاء عقد ذكي. في الواقع ، لا يطلق عليه مرة واحدة ، ولكن في كل مرة يتم تغيير نسخة من العقد الذكي. لذلك ، فإن تهيئة القائمة بمصفوفة فارغة هي فكرة سيئة ، لأن الآن ، عند تغيير إصدار العقد الذكي ، سنخسر القائمة الحالية. لكن لا شيء ، أنا فقط أتعلم).
  • الحسابات وقائمة الحسابات (الحسابات) هي هياكل بيانات JSON. لمعالجة البيانات ، يتم استخدام JS.
  • يمكنك الحصول على القيمة الحالية للأصل عن طريق استدعاء وظيفة getState وتحديثها باستخدام putState.
  • عند إنشاء حساب ، يتم استدعاء وظيفة AddAccount ، والتي تتم فيها مقارنة للحد الأقصى لعدد الحسابات في blockchain (maxAccounts = 5). وهناك دعامة (لاحظت؟) ، مما يؤدي إلى زيادة لا حصر لها في عدد الحسابات. يجب تجنب هذه الأخطاء)

بعد ذلك ، قم بتحميل العقد الذكي على القناة وتثبيته:

صورة

نحن ننظر إلى المعاملة لتثبيت Smart Contract:

صورة

نحن ننظر إلى التفاصيل حول قناتنا:

صورة

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

صورة

إنشاء واجهة المستخدم الرسومية ل Hyperledger Fabric API Calls


يحتوي Hyperledger Fabric على واجهة برمجة تطبيقات يمكن استخدامها في:

  • قناة إبداعات
  • اتصالات الأقران إلى القناة ؛
  • تركيب وفقدان العقود الذكية في القناة ؛
  • دعوة المعاملات ؛
  • طلب معلومات عن blockchain.

تطوير التطبيق


في برنامجنا التجريبي ، سنستخدم واجهة برمجة التطبيقات فقط لاستدعاء المعاملات وطلب المعلومات ، لأن لقد اتخذنا بالفعل الخطوات المتبقية باستخدام منصة IBM blockchain. نكتب واجهة المستخدم الرسومية باستخدام حزمة التكنولوجيا القياسية: Express.js + Vue.js + Node.js. يمكنك كتابة مقالة منفصلة حول كيفية بدء إنشاء تطبيقات الويب الحديثة. سوف أترك هنا رابطًا لسلسلة المحاضرات التي أعجبتني أكثر: تطبيق Web Stack الكامل باستخدام Vue.js & Express.js . والنتيجة هي تطبيق خادم عميل مع واجهة رسومية مألوفة في أسلوب تصميم المواد من Google. يتكون REST API بين العميل والخادم من عدة مكالمات:

  • HyperledgerDemo / v1 / init - تهيئة blockchain ؛
  • HyperledgerDemo / v1 / accounts / list - الحصول على قائمة بجميع الحسابات
  • HyperledgerDemo / v1 / account؟ Name = Bob & balance = 100 - إنشاء حساب Bob؛
  • HyperledgerDemo / v1 / info؟ Account = Bob - الحصول على معلومات حول حساب Bob؛
  • HyperledgerDemo / v1 / transaction؟ From = Bob & to = Alice & volume = 2 - انقل اثنين من العملات المعدنية من Bob إلى Alice؛
  • HyperledgerDemo / v1 / قطع الاتصال - إغلاق الاتصال إلى blockchain.

لقد وضعت وصف API مع أمثلة على موقع Postman ، وهو برنامج معروف لاختبار HTTP API.

تطبيق أمازون كلاود التجريبي


تم تحميل التطبيق إلى Amazon ، لأنه فشلت IBM حتى الآن في ترقية حسابي والسماح بإنشاء خوادم افتراضية. كيف ربط الكرز المجال: www.citcoin.info . سوف أبقي الخادم قيد التشغيل لفترة قصيرة ، ثم أطفئه ، لأن سنتات الإيجار تتساقط ، ولم يتم نقل العملات المعدنية لسيتكوين حتى الآن في البورصة) أضع لقطات من العرض التوضيحي في المقالة بحيث يكون منطق العمل واضحًا. يمكن للتطبيق التجريبي:

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

أولاً ، تهيئة blockchain:

صورة

بعد ذلك ، ابدأ حسابك ، لا تافه بالتوازن:

صورة

لدينا قائمة بجميع الحسابات المتاحة:

صورة

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

صورة

في السجل ، نراقب تنفيذ المعاملات:

صورة

في الواقع ، مع برنامج تجريبي ، هذا كل شيء. بعد ذلك ، يمكنك رؤية معاملاتنا في blockchain:

صورة

والقائمة العامة للمعاملات:

صورة

مع هذا ، أكملنا بنجاح تنفيذ PoC لإنشاء شبكة Citcoin. ما الذي يجب القيام به حتى تصبح Citcoin شبكة كاملة لتحويل العملات؟ قليلا فقط:

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

استنتاج


لقد طبقنا شبكة Citcoin من خلال وظائف: إضافة حساب ، الحصول على رصيد ، تجديد حسابك ، تحويل العملات من حساب إلى آخر. إذن ، ما الذي كلفنا بناء PoC؟

  • نحن بحاجة إلى دراسة blockchain بشكل عام والنسيج Hyperledger على وجه الخصوص ؛
  • تعلم كيفية استخدام آي بي إم أو غيوم الأمازون.
  • تعلم لغة برمجة JS وبعض أطر الويب ؛
  • إذا كانت هناك حاجة إلى تخزين بعض البيانات في blockchain ، ولكن في قاعدة بيانات منفصلة ، فتعلم كيفية دمجها ، على سبيل المثال ، مع PostgreSQL ؛
  • وأخيرا وليس آخرا - من دون معرفة لينكس في العالم الحديث ، في أي مكان!)

بالطبع ، ليس علم الصواريخ ، ولكن عليك أن تعرق!

مصادر جيثب


لقد وضع شفرة المصدر على جيثب . وصف موجز للمستودع:
دليل " الخادم " - خادم Node.js
دليل " العميل " - عميل Node.js
دليل " blockchain " (قيم المعلمات ومفاتيحها ، بطبيعة الحال ، لا تعمل ولا تُعطى إلا كمثال):

  • العقد - مصدر العقد الذكي
  • محفظة - مفاتيح المستخدم لاستخدام API Hyperledger Fabric.
  • * .cds - الإصدارات المترجمة من العقود الذكية
  • ملفات .json - نموذج لملفات التكوين لاستخدام Hyperledger Fabric API

إنها البداية فقط!

Source: https://habr.com/ru/post/ar466157/


All Articles