Hyperledger Fabric (HLF) عبارة عن نظام أساسي مفتوح المصدر يستخدم تقنية دفتر الأستاذ الموزعة (DLT) ، والمصممة لتطوير التطبيقات التي تعمل في بيئة شبكة أعمال تم إنشاؤها والتحكم فيها بواسطة مجموعة من المؤسسات التي تستخدم قواعد الوصول (مصرح بها).
تدعم المنصة العقود الذكية ، بشروط HLF - رموز السلسلة التي تم إنشاؤها باللغات العامة مثل Golang ، JavaScript ، Java ، على عكس ، على سبيل المثال ، Ethereum ، التي تستخدم لغة صلاحيات محددة التعاقد ومحدودة الوظائف (LLL ، فايبر ، إلخ.).

يمكن أن يكون تطوير واختبار رموز السلسلة ، بسبب الحاجة إلى نشر عدد كبير من مكونات شبكة blockchain ، عملية طويلة إلى حد ما مع قضاء وقت طويل في اختبار التغييرات. تتناول هذه المقالة نهجًا للتطوير والاختبار السريع للعقود الذكية HLF Golang باستخدام مكتبة CCKit .
تطبيق قائم على HLF
من وجهة نظر المطور ، يتكون تطبيق blockchain من جزأين رئيسيين:
- على السلسلة - عقود (برامج) ذكية تعمل في بيئة معزولة لشبكة blockchain التي تحدد قواعد إنشاء وتكوين سمات المعاملات. في العقد الذكي ، تتمثل الإجراءات الرئيسية في قراءة البيانات وتحديثها وحذفها من حالة شبكة blockchain. يجب التأكيد على أن حذف البيانات من الدولة يترك معلومات تفيد بوجود هذه البيانات.
- خارج السلسلة هو تطبيق (على سبيل المثال ، API) يتفاعل مع بيئة blockchain من خلال SDK. يُفهم التفاعل على أنه استدعاء وظائف العقد الذكي ومراقبة أحداث العقد الذكية - يمكن أن تتسبب الأحداث الخارجية في حدوث تغييرات في البيانات في العقد الذكي ، بينما يمكن أن تؤدي الأحداث في العقد الذكي إلى إطلاق إجراءات في الأنظمة الخارجية.
تتم قراءة البيانات عادة من خلال عقدة شبكة blockchain "المنزلية". لتسجيل البيانات ، يرسل التطبيق الطلبات إلى عقد المنظمات المشاركة في "سياسة الموافقة" لعقد ذكي معين.
لتطوير كود خارج السلسلة (API ، وما إلى ذلك) ، يتم استخدام حزمة SDK متخصصة تغلف التفاعل مع عقد blockchain ، وجمع الردود ، إلخ. بالنسبة إلى HLF ، توجد تطبيقات SDK لـ Go ( 1 ، 2 ) و Node.Js و Java
مكونات نسيج Hyperledger
القناة
القناة هي شبكة فرعية منفصلة من العقد تدعم سلسلة كتلة معزولة (دفتر الأستاذ) ، بالإضافة إلى الحالة الحالية (القيمة الرئيسية) لسلسلة الكتلة ( الحالة العالمية ) المستخدمة لتشغيل العقود الذكية. يمكن للمضيف الوصول إلى عدد عشوائي من القنوات.
الصفقة
تعتبر المعاملة في نسيج Hyperledger تحديثًا ذريًا لحالة سلسلة كتلة ، نتيجة تنفيذ طريقة السلاسل. تتكون المعاملة من طلب لاستدعاء طريقة تشفير مع بعض الوسيطات (مقترح معاملة) موقعة من العقدة الطالبة ، ومجموعة من الاستجابات (استجابة مقترح المعاملة) من العقد التي تم "تأكيد" المعاملة عليها (مصادقة). تحتوي الردود على معلومات حول أزواج القيمة الرئيسية المتغيرة لحالة سلسلة كتلة القراءة والكتابة ومجموعة معلومات الخدمة (التوقيعات وشهادات العقد التي تؤكد المعاملة). لأن يتم فصل سلاسل كتل القنوات الفردية ماديًا ، ولا يمكن إجراء المعاملة إلا في سياق قناة واحدة.
تستخدم منصات blockchain "الكلاسيكية" ، مثل Bitcoin و Ethereum ، دورة معاملات الطلب - التنفيذ التي تنفذها جميع العقد ، مما يحد من قابلية شبكة blockchain للتدرج.

تستخدم شركة Hyperledger Fabric بنية تنفيذ وتوزيع المعاملات التي لها 3 عمليات رئيسية:
التنفيذ ( التنفيذ ) - الإنشاء عن طريق عقد ذكي يعمل على واحدة أو أكثر من عقد الشبكة والمعاملات - التغييرات الذرية في حالة السجل الموزع ( المصادقة )
الطلب - ترتيب وتجميع المعاملات إلى كتل بواسطة خدمة الطلب المتخصصة باستخدام خوارزمية إجماع قابلة للتوصيل.
التحقق من الصحة - التحقق من خلال عقد الشبكة للمعاملات الواردة من الطالب قبل وضع المعلومات منها في نسختهم من السجل الموزع

يسمح لك هذا النهج بتنفيذ مرحلة تنفيذ المعاملة قبل دخولها إلى شبكة blockchain ، بالإضافة إلى توسيع نطاق تشغيل الشبكة أفقيًا.
السلاسل
السلاسل ، التي يمكن أن تسمى أيضًا بالعقد الذكي ، هو برنامج مكتوب بلغة Golang أو JavaScript (HLF 1.1+) أو Java (HLF 1.3+) ، والذي يحدد قواعد إنشاء المعاملات التي تغير حالة سلسلة كتلة. يتم تنفيذ البرنامج في وقت واحد على عدة عقد مستقلة لشبكة موزعة من عقد blockchain ، مما يخلق بيئة محايدة لتنفيذ العقود الذكية عن طريق التوفيق بين نتائج تنفيذ البرنامج على جميع العقد اللازمة لـ "تأكيد" المعاملة.
يجب أن يقوم الكود بتنفيذ واجهة تتكون من الطرق:
type Chaincode interface {
- تسمى الطريقة الأولية عند إنشاء أو ترميز كود الكود. تؤدي هذه الطريقة التهيئة الضرورية لحالة رمز الكود. من المهم أن تميز في كود الطريقة ما إذا كانت المكالمة هي نسخ فوري أو ترقية ، بحيث لا تهيئ (عن طريق الخطأ) البيانات التي تلقت بالفعل حالة غير صفرية أثناء تشغيل الكود.
- يتم استدعاء طريقة Invoke عند الوصول إلى أي وظيفة من كود الترميز. تعمل هذه الطريقة مع حالة العقود الذكية.
يتم تثبيت السلاسل على أقران شبكة blockchain. على مستوى النظام ، يتوافق كل مثيل من التعليمات البرمجية مع حاوية عامل إرساء منفصلة ، مرتبطة بعقدة شبكة معينة ، والتي تقوم بإرسال إرسال المكالمة عند تنفيذ التعليمات البرمجية.
على عكس العقود الذكية لـ Ethereum ، يمكن تحديث منطق التسلسل ، ولكن هذا يتطلب أن تقوم جميع العقد التي تستضيف رمز الترميز بتثبيت إصدار محدث.
استجابة لدعوة دالة السلاسل من الخارج عبر SDK ، يخلق السلاسل تغييرًا في حالة سلسلة الكتلة ( مجموعة القراءة والكتابة ) ، وكذلك الأحداث. يشير الرمز التسلسلي إلى قناة معينة ويمكنه تغيير البيانات في قناة واحدة فقط. في الوقت نفسه ، إذا كان المضيف الذي تم تثبيت الكود عليه لديه أيضًا حق الوصول إلى قنوات أخرى ، في منطق الكود يمكن قراءة البيانات من هذه القنوات.
تسمى رموز السلسلة الخاصة لإدارة الجوانب المختلفة لتشغيل شبكة blockchain رموز سلسلة النظام.
سياسة المصادقة
تحدد سياسة الموافقة قواعد الإجماع على مستوى المعاملات الناتجة عن سلسلة محددة من السلاسل. تحدد السياسة القواعد التي تحدد عقد القناة التي يجب أن تنشئ معاملة. للقيام بذلك ، يجب على كل عقد محددة في سياسة الموافقة تشغيل طريقة التسلسل (خطوة "التنفيذ") ، وإجراء "محاكاة" ، وبعد ذلك سيتم جمع النتائج الموقعة والتحقق منها بواسطة SDK الذي بدأ المعاملة (يجب أن تكون جميع نتائج المحاكاة متطابقة ، يجب أن تكون تواقيع جميع العقد التي تتطلبها السياسة موجودة). بعد ذلك ، ترسل حزمة تطوير البرامج (SDK) المعاملة إلى المُرسل ، وبعد ذلك ستتلقى جميع العُقد التي يمكنها الوصول إلى القناة المعاملة من خلال المُنظِّم وتنفذ خطوة "التحقق من الصحة". من المهم التأكيد على أنه لا يجب أن تشارك جميع عقد القنوات في خطوة "التنفيذ".
يتم تحديد سياسة الموافقة في وقت إنشاء أو ترقية التعليمات البرمجية. في الإصدار 1.3 ، أصبح من الممكن وضع سياسات ليس فقط على مستوى السلسلة ، ولكن أيضًا على مستوى مفاتيح المصادقة الفردية القائمة على الدولة . أمثلة على سياسات الموافقة:
- العقد أ ، ب ، ج ، د
- معظم عقد القناة
- 3 عقد على الأقل من A و B و C و D و E و F
حدث
الحدث عبارة عن مجموعة بيانات مسماة تسمح لك بنشر "موجز تحديث" لحالة سلسلة blockchain. تحدد مجموعة سمات الحدث السلاسل.
البنية التحتية للشبكة
المضيف (الأقران)
يتصل المضيف بعدد عشوائي من القنوات التي لها حقوق وصول إليها. يحافظ المضيف على نسخته من سلسلة الكتلة وحالة سلسلة الكتلة ، ويوفر أيضًا بيئة لتشغيل رموز السلسلة. إذا لم يكن المضيف جزءًا من سياسة الموافقة ، فلا يلزم إعداده باستخدام رموز السلسلة.
على مستوى البرنامج المضيف ، يمكن تخزين الحالة الحالية لسلسلة الكتلة (الحالة العالمية) في LevelDB أو في CouchDB. ميزة CouchDB هي دعمها للاستعلامات الغنية باستخدام بناء جملة MongoDB.
الطلب
تقبل خدمة إدارة المعاملات المعاملات الموقعة كمدخل وتضمن توزيع المعاملات عبر نقاط الشبكة بالترتيب الصحيح.
لا يقوم Orderer بتشغيل العقود الذكية ولا يحتوي على سلاسل الكتل وحالات سلسلة الكتل. في الوقت الحالي (1.3) ، هناك عمليتان لتنفيذ الأمر - تطوير منفرد وإصدار يعتمد على Kafka يوفر التسامح مع خطأ التصادم. من المتوقع أن يتم تنفيذ النظام الذي يدعم مقاومة السلوك غير الصحيح لجزء معين من المشاركين (تحمل الخطأ البيزنطي) في نهاية عام 2018.
خدمات الهوية
في شبكة نسيج Hyperledger ، جميع الأعضاء لديهم هويات معروفة للأعضاء الآخرين (الهوية). لتحديد الهوية ، يتم استخدام البنية التحتية للمفتاح العام (PKI) ، والتي يتم من خلالها إنشاء شهادات X.509 للمؤسسات وعناصر البنية التحتية (العقدة ، والنظام) والتطبيقات والمستخدمين النهائيين. ونتيجة لذلك ، يمكن التحكم في الوصول لقراءة البيانات وتعديلها من خلال قواعد الوصول على مستوى الشبكة أو على قناة واحدة أو في منطق العقد الذكي. في نفس شبكة blockchain ، يمكن أن تعمل العديد من خدمات التعرف من أنواع مختلفة في وقت واحد.
تنفيذ الكود
يمكن اعتبار السلاسل ككائن له طرق تطبق منطق عمل معين. على عكس OOP الكلاسيكي ، لا يمكن أن يحتوي السلاسل على حقول السمات. للعمل مع الحالة ، التي يتم توفير تخزينها من خلال منصة blockchain HLF ، يتم استخدام طبقة ChaincodeStubInterface ، والتي يتم تمريرها عند استدعاء طريقتين التهيئة والاستدعاء . يوفر القدرة على تلقي وسيطات استدعاء دالة وإجراء تغييرات على حالة سلسلة الكتلة:
type ChaincodeStubInterface interface {
في العقد الذكي Ethereum الذي تم تطويره على Solidity ، لكل طريقة وظيفة عامة. في chaincode النسيج Hyperledger في أساليب التهيئة والاستدعاء باستخدام دالة ChaincodeStubInterface . GetArgs () ، يمكنك الحصول على وسيطات استدعاء دالة في شكل صفيف من صفائف البايت ، بينما يحتوي العنصر الأول للصفيف عند استدعاء Invoke على اسم دالة السلاسل. لأن يمر استدعاء أي طريقة تسلسل عبر طريقة Invoke ؛ يمكننا القول أن هذا هو تنفيذ لنمط وحدة التحكم الأمامية.
على سبيل المثال ، إذا أخذنا في الاعتبار تنفيذ واجهة Ethereum القياسية لرمز ERC-20 ، فيجب أن يطبق العقد الذكي الطرق:
- totalSupply ()
- الرصيد (العنوان _ المالك)
- التحويل (العنوان _to ، uint256 _value)
وفي حالة تنفيذ HLF ، يجب أن يكون رمز وظيفة الاستدعاء قادرًا على معالجة الحالات التي تحتوي فيها الوسيطة الأولى لاستدعاء المكالمات على اسم الطرق المتوقعة (على سبيل المثال ، "totalSupply" أو "BalanceOf"). يمكن رؤية مثال على تنفيذ معيار ERC-20 هنا .
أمثلة السلاسل
بالإضافة إلى وثائق Hyperledger Fabric ، هناك بعض الأمثلة الأخرى لرموز السلسلة:
إن تنفيذ رموز السلسلة في هذه الأمثلة هو مطول إلى حد ما ويحتوي على الكثير من المنطق المتكرر لاختيار وظائف التوجيه المسماة) ، والتحقق من عدد الحجج ، و json marshalling / unmarshalling:
func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response { function, args := stub.GetFunctionAndParameters() fmt.Println("invoke is running " + function)
يؤدي تنظيم الكود هذا إلى تدهور في سهولة قراءة الكود والأخطاء المحتملة ، مثل هذا ، عندما تنسى ببساطة إلغاء تنظيم بيانات الإدخال. تشير العروض التقديمية حول خطط تطوير HLF إلى مراجعة نهج تطوير رموز السلسلة ، ولا سيما إدخال التعليقات التوضيحية في رموز سلسلة Java ، وما إلى ذلك ، ومع ذلك ، فإن الخطط تتعلق بالإصدار المتوقع فقط في عام 2019. وقد أدت تجربة تطوير العقود الذكية إلى استنتاج مفاده أن تطوير واختبار رموز السلسلة سيكون أسهل إذا حددت الوظائف الأساسية في مكتبة منفصلة.
CCKit - مكتبة لتطوير واختبار رموز السلسلة
تلخص مكتبة CCKit ممارسة تطوير واختبار رموز السلسلة. كجزء من تطوير ملحقات سلاسل المفاتيح ، تم استخدام مكتبة OpenZeppelin من ملحقات عقود Ethereum الذكية كمثال. تستخدم CCKit الحلول المعمارية التالية:
توجيه المكالمات لوظائف العقد الذكية
يشير التوجيه إلى الخوارزمية التي يستجيب بها التطبيق لطلب العميل. يتم استخدام هذا النهج ، على سبيل المثال ، في جميع أطر عمل http تقريبًا. يستخدم جهاز التوجيه قواعد معينة لربط الطلب ومعالج الطلب. فيما يتعلق بسلسلة ، فإن هذا يربط اسم دالة السلاسل بوظيفة المعالج.
في أحدث الأمثلة على العقود الذكية ، على سبيل المثال ، في تطبيق التأمين ، يستخدم هذا التعيين بين اسم دالة السلاسل والوظيفة في رمز Golang للنموذج:
var bcFunctions = map[string]func(shim.ChaincodeStubInterface, []string) pb.Response{
يستخدم جهاز التوجيه CCKit نهجًا مشابهًا لجهاز التوجيه http ، بالإضافة إلى القدرة على استخدام سياق الطلب لوظيفة السلاسل ووظائف البرامج الوسيطة
سياق الاستدعاء لوظيفة الكود
على غرار سياق طلب http ، والذي عادة ما يكون له حق الوصول إلى معلمات طلب http ، يستخدم جهاز التوجيه CCKit سياق الاستدعاء لوظيفة العقد الذكي ، وهو عبارة عن تجريد أعلى shim.ChaincodeStubInterface . يمكن أن يكون السياق هو الحجة الوحيدة لمعالج وظيفة التسلسل ؛ من خلاله ، يمكن للمعالج الحصول على حجج استدعاء الوظيفة ، بالإضافة إلى الوصول إلى الوظائف المساعدة للعمل مع حالة العقد الذكي (الدولة) ، وإنشاء إجابات (استجابة) ، إلخ.
Context interface { Stub() shim.ChaincodeStubInterface Client() (cid.ClientIdentity, error) Response() Response Logger() *shim.ChaincodeLogger Path() string State() State Time() (time.Time, error) Args() InterfaceMap Arg(string) interface{} ArgString(string) string ArgBytes(string) []byte SetArg(string, interface{}) Get(string) interface{} Set(string, interface{}) SetEvent(string, interface{}) error }
لأن السياق هو واجهة ، في بعض رموز السلسلة يمكن توسيعه.
وظائف الوسيطة
يتم استدعاء وظائف المعالجة الوسيطة (الوسيطة) قبل استدعاء معالج طريقة الكود ، والوصول إلى سياق الاستدعاء لطريقة الكود والوظيفة الوسيطة التالية أو مباشرة إلى معالج الطريقة التالية (التالية). يمكن استخدام الوسيطة من أجل:
- تحويل بيانات الإدخال (في المثال أدناه p.String و p.Struct هي برامج وسيطة)
- قيود على الوصول إلى الوظيفة (على سبيل المثال ، المالك فقط )
- استكمال دورة معالجة الطلب
- استدعاء دالة المعالجة الوسيطة التالية من المكدس
تحويل بنية البيانات
تفترض واجهة chaincode أن مصفوفة من صفائف البايت يتم توفيرها للمدخلات ، كل عنصر من عناصره هو سمة دالة السلاسل. لمنع تنظيم البيانات يدويًا من صفيف البايت إلى نوع بيانات golang (int ، سلسلة ، بنية ، صفيف) من وسيطات استدعاء الوظيفة في كل معالج لوظيفة التسلسل ، يتم تعيين أنواع البيانات المتوقعة في وقت إنشاء قاعدة التوجيه في جهاز التوجيه CCKit ويتم تحويل النوع تلقائيًا . في المثال التالي ، تتوقع الدالة carGet وسيطة من نوع السلسلة ، وتتوقع الدالة carRegister بنية CarPayload . تتم تسمية الوسيطة أيضًا ، مما يسمح للمعالج بالحصول على قيمته من السياق بالاسم. سيتم إعطاء مثال عن معالج أدناه. يمكن استخدام Protobuf أيضًا لوصف مخطط بيانات التسلسل.
r.Group(`car`). Query(`List`, cars).
أيضًا ، يتم استخدام التحويل التلقائي (التنظيم) عند كتابة البيانات إلى حالة العقد الذكي وعند إنشاء الأحداث (يتم إجراء تسلسل نوع golang في مجموعة من وحدات البايت)
أدوات تصحيح الأخطاء وتسجيل رموز السلسلة
لتصحيح الكود ، يمكنك استخدام امتداد التصحيح ، الذي يطبق طرق العقد الذكية التي ستسمح لك بفحص وجود المفاتيح في حالة العقد الذكي ، وكذلك قراءة / تغيير / حذف القيمة مباشرة عن طريق المفتاح.
للتسجيل في سياق استدعاء دالة تسلسل ، يمكن استخدام طريقة Log () ، التي تُرجع مثيلًا للمسجل المستخدم في HLF.
طرق العقد الذكية الوصول إلى طرق التحكم
كجزء من امتداد المالك ، يتم تنفيذ البدائل الأساسية لتخزين المعلومات حول مالك رمز السلسلة الفوري ومعدلات الوصول (الوسيطة) لطرق العقد الذكية.
أدوات اختبار العقد الذكية
يعد نشر شبكة blockchain وتثبيت وتهيئة رموز السلسلة هو إعداد معقد إلى حد ما وإجراء طويل. يمكن تقليل وقت إعادة تثبيت / ترقية رمز العقد الذكي باستخدام وضع DEV للعقد الذكي ، ومع ذلك ، ستظل عملية تحديث الرمز بطيئة.
تحتوي حزمة الرقائق على تنفيذ MockStub ، الذي يلف المكالمات إلى الرمز للرمز ، ومحاكاة تشغيله في بيئة blockchain HLF. يتيح لك استخدام MockStub الحصول على نتائج الاختبار على الفور تقريبًا ويسمح لك بتقليل وقت التطوير. إذا أخذنا في الاعتبار المخطط العام لتشغيل التعليمات البرمجية في HLF ، فإن MockStub يستبدل SDK بشكل أساسي ، مما يسمح لك بإجراء مكالمات إلى وظائف الرمز ، ويحاكي البيئة لبدء تشغيل الرمز على المضيف.

يحتوي MockStub من تسليم HLF على تنفيذ جميع طرق واجهة shim.ChaincodeStubInterface تقريبًا ، ومع ذلك ، في الإصدار الحالي (1.3) ، فإنه يفتقر إلى تنفيذ بعض الطرق المهمة ، مثل GetCreator. لأن يمكن أن يستخدم رمز السلسلة هذا الأسلوب للحصول على شهادة منشئ المعاملة للتحكم في الوصول ، للحصول على أقصى تغطية في الاختبارات ، فإن القدرة على الحصول على كعب من هذه الطريقة أمر مهم.
تحتوي مكتبة CCKit على نسخة موسعة من MockStub ، والتي تحتوي على تنفيذ الطرق المفقودة ، بالإضافة إلى طرق العمل مع قنوات الأحداث ، إلخ.
مثال السلاسل
على سبيل المثال ، لنقم بإنشاء سلسلة مفاتيح بسيطة لتخزين المعلومات حول السيارات المسجلة
نموذج البيانات
حالة كود الترميز هي تخزين قيمة المفتاح ، حيث يكون المفتاح عبارة عن سلسلة ، والقيمة عبارة عن صفيف من وحدات البايت. الممارسة الأساسية هي تخزين أمثلة هياكل بيانات golang jonalized كقيم. وفقًا لذلك ، للعمل مع البيانات في السلاسل ، بعد القراءة من الحالة ، تحتاج إلى إلغاء تنظيم صفيف البايت.
للتسجيل عن السيارة ، سنستخدم مجموعة السمات التالية:
- المعرف (رقم السيارة)
- طراز السيارة
- معلومات مالك المركبة
- معلومات وقت تغيير البيانات
لنقل البيانات إلى السلسلة ، قم بإنشاء بنية منفصلة تحتوي فقط على الحقول القادمة من خارج السلسلة.
العمل باستخدام المفاتيح
مفاتيح التسجيل في حالة العقد الذكية عبارة عن سلسلة. كما يدعم القدرة على إنشاء مفاتيح مركبة يتم فيها فصل أجزاء من المفتاح بصفر بايت ( U + 0000 )
func CreateCompositeKey(objectType string, attributes []string) (string, error)
في CCKit ، يمكن لوظائف العمل مع حالة العقد الذكي إنشاء مفاتيح للسجلات تلقائيًا إذا كانت الهياكل المنقولة تدعم واجهة Keyer
لتسجيل السيارة ، ستكون وظيفة توليد المفاتيح كما يلي:
const CarEntity = `CAR`
إعلان وظيفة العقد الذكي (التوجيه)
في طريقة مُنشئ السلاسل ، يمكننا تحديد وظائف السلاسل وحججها. سيكون هناك 3 وظائف في رمز تسجيل السيارة
- carList ، يعيد مجموعة من هياكل السيارات
- يقبل carGet معرف السيارة ويعيد هيكل السيارة
- يقبل carRegister نسخة متسلسلة من هيكل CarPayload ويعيد نتيجة التسجيل. الوصول إلى هذه الطريقة ممكن فقط لمالك السلاسل ، والذي يتم حفظه باستخدام الوسيطة من حزمة المالك
func New() *router.Chaincode { r := router.New(`cars`)
يستخدم المثال أعلاه بنية Chaincode حيث يتم تفويض معالجة أساليب التهيئة والاستدعاء إلى جهاز التوجيه:
package router import ( "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" )
يسمح استخدام جهاز التوجيه وهيكل السلسلة الأساسية بإعادة استخدام وظائف المعالج. على سبيل المثال ، لتطبيق السلاسل بدون التحقق من الوصول إلى وظيفة carRegister
، سيكون كافيًا إنشاء طريقة إنشاء جديدة
تنفيذ وظائف العقد الذكية
وظائف Golang - يمكن أن تكون معالجات وظائف العقود الذكية في جهاز التوجيه CCKit من ثلاثة أنواع:
- StubHandlerFunc - واجهة المعالج القياسية ، تقبل shim.ChaincodeStubInterface ، تُرجع النظير القياسي للاستجابة.
- ContextHandlerFunc - يأخذ سياق ويعيد النظير الاستجابة
- HandlerFunc - يأخذ سياق ، ويعيد واجهة وخطأ. يمكن إرجاع صفيف بايت أو أي نوع golang يتم تحويله تلقائيًا إلى صفيف بايت استناداً إلى أي نظير . ستكون حالة الاستجابة هي shim.ok أو shim.Error ، اعتمادًا على الخطأ الذي تم تمريره.
, , ( CarPayload)
State , ( )
-
- — , . BDD – Behavior Driven Development, .
, , - Ethereum ganache-cli truffle . golang - Mockstub.
, . .
Ginkgo , Go, go test
. gomega expect , , .
import ( "testing" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" examplecert "github.com/s7techlab/cckit/examples/cert" "github.com/s7techlab/cckit/extensions/owner" "github.com/s7techlab/cckit/identity" "github.com/s7techlab/cckit/state" testcc "github.com/s7techlab/cckit/testing" expectcc "github.com/s7techlab/cckit/testing/expect" ) func TestCars(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "Cars Suite") }
, CarPayload :
var Payloads = []*Car{{ Id: `A777MP77`, Title: `VAZ`, Owner: `victor`, }, { Id: `O888OO77`, Title: `YOMOBIL`, Owner: `alexander`, }, { Id: `O222OO177`, Title: `Lambo`, Owner: `hodl`, }}
MockStub Cars.
لأن cars , .
BeforeSuite Car authority Init . , Cars Init Init , .
BeforeSuite(func() {
. , CarRegister , .
It("Allow authority to add information about car", func() {
:
It("Disallow authority to add duplicate information about car", func() { expectcc.ResponseError( cc.From(actors[`authority`]).Invoke(`carRegister`, Payloads[0]), state.ErrKeyAlreadyExists)
الخلاصة
- HLF Go, Java, JavaScript, , , - (Solidity) / -. / .
HLF , , ( .). Hypeledger Fabric , .. .