كيف تكتب عقد WebAssembly الذكي على شبكة Ontology؟ الجزء 1: الصدأ

كيف تكتب عقد WebAssembly الذكي على شبكة Ontology؟ الجزء 1: الصدأ

تقلل تقنية Ontology Wasm من تكلفة ترحيل عقود dApp الذكية مع منطق الأعمال المعقد إلى blockchain ، وبالتالي إثراء النظام البيئي dApp بشكل كبير.

حاليا علم الوجود واسم يدعم تطوير كل من Rust و C ++ في نفس الوقت. تدعم لغة Rust Wasm بشكل أفضل ، ويكون الرمز الثانوي الذي تم إنشاؤه أبسط ، مما قد يقلل من تكلفة مكالمات العقد. لذا، كيف تستخدم Rust لتطوير عقد على شبكة Ontology؟

تطوير عقد WASM مع Rust

قم بإنشاء عقد

حمولة هي أداة جيدة لإنشاء المشاريع وإدارة الحزم لتطوير Rust ، والتي تساعد المطورين على تنظيم تفاعل الكود ومكتبات الجهات الخارجية بشكل أفضل. لإنشاء عقد جديد لـ Ontology Wasm ، ما عليك سوى تشغيل الأمر التالي:

كيف تكتب عقد WebAssembly الذكي على شبكة Ontology؟ الجزء 1: الصدأ

هيكل المشروع الذي يولده:

كيف تكتب عقد WebAssembly الذكي على شبكة Ontology؟ الجزء 1: الصدأ

يتم استخدام ملف Cargo.toml لإعداد معلومات المشروع الأساسية ومعلومات المكتبة التابعة. يجب تعيين المقطع [lib] من الملف على نوع crate-type = ["cdylib"]. يتم استخدام ملف lib.rs لكتابة الرمز المنطقي للعقد. بالإضافة إلى ذلك ، تحتاج إلى إضافة معلمات التبعية إلى قسم [التبعيات] في ملف تكوين Cargo.toml:

كيف تكتب عقد WebAssembly الذكي على شبكة Ontology؟ الجزء 1: الصدأ

باستخدام هذه التبعية ، يمكن للمطورين استدعاء الواجهات التي تتفاعل مع blockchain في Ontology والأدوات مثل معلمة التسلسل.

وظيفة دخول العقد

كل برنامج له وظيفة إدخال ، مثل الوظيفة الرئيسية التي نراها عادة ، لكن العقد ليس له وظيفة رئيسية. عندما يتم تطوير عقد Wasm باستخدام Rust ، يتم استخدام وظيفة الاستدعاء الافتراضية كوظيفة إدخال لاستخدام العقد. لن يكون اسم الوظيفة في Rust واضحًا عند تجميع شفرة مصدر Rust في كود ثانوي يمكن تنفيذه بواسطة جهاز افتراضي. لمنع المترجم من إنشاء كود فائض وتقليل حجم العقد ، تضيف وظيفة الاستدعاء التعليق التوضيحي # [no_mangle].

كيف تحصل دالة الاستدعاء على معلمات لتنفيذ معاملة؟

توفر مكتبة ontio_std وظيفة runtime :: input () للحصول على المعلمات لتنفيذ المعاملة. يمكن للمطورين استخدام ZeroCopySource لإلغاء تسلسل مصفوفة البايت الناتجة. حيث يكون المصفوفة الأولى من البايتات المقروءة هي اسم طريقة الاستدعاء ، متبوعة بمعلمات الطريقة.

كيف يتم إرجاع نتيجة تنفيذ العقد؟

ترجع الدالة runtime :: ret التي توفرها مكتبة ontio_std نتيجة تنفيذ الطريقة.

تبدو وظيفة الاستدعاء المكتملة كما يلي:

كيف تكتب عقد WebAssembly الذكي على شبكة Ontology؟ الجزء 1: الصدأ

تسلسل وإلغاء تسلسل بيانات العقد

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

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

بالنسبة للبيانات ذات الطول الثابت (على سبيل المثال: بايت ، u16 ، u32 ، u64 ، إلخ) ، يتم تحويل البيانات مباشرة إلى مصفوفة بايت ثم تخزينها في buf ؛ بالنسبة للبيانات ذات الطول غير الثابت ، يجب إجراء تسلسل للطول أولاً ، ثم Ddata (على سبيل المثال ، الأعداد الصحيحة غير الموقعة ذات الحجم غير المعروف ، بما في ذلك u16 أو u32 أو u64 وما إلى ذلك).

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

الوصول إلى البيانات وتحديثها في السلسلة

علم الوجود-wasm-cdt-rust - تغلف طريقة تشغيلية للعمل مع البيانات في السلسلة ، وهي ملائمة للمطورين لتنفيذ عمليات مثل إضافة وحذف وتغيير والاستعلام عن البيانات في السلسلة على النحو التالي:

  • قاعدة البيانات :: الحصول على (مفتاح) - يستخدم لطلب البيانات من السلسلة ، ويطلب المفتاح تنفيذ واجهة AsRef ؛
  • قاعدة البيانات :: وضع (مفتاح ، قيمة) - تستخدم لتخزين البيانات على الشبكة. يطلب المفتاح تنفيذ واجهة AsRef ، ويطلب القيمة تنفيذ واجهة التشفير ؛
  • قاعدة البيانات :: حذف (مفتاح) - يستخدم لإزالة البيانات من السلسلة ، ويطلب المفتاح تنفيذ واجهة AsRef.

اختبار العقد

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

تصحيح العقد

يعرض console :: debug (msg) معلومات التصحيح أثناء تصحيح العقد. ستتم إضافة معلومات الرسالة إلى ملف سجل العقدة. الشرط الأساسي هو تعيين مستوى ملف السجل على وضع التصحيح عند تشغيل عقدة اختبار Ontology المحلية.

runtime :: notify (msg) ينتج معلومات التصحيح المناسبة أثناء تصحيح أخطاء العقد. ستخزن هذه الطريقة المعلومات المدخلة في السلسلة ويمكن الاستعلام عنها من السلسلة باستخدام طريقة getSmartCodeEvent.

تمت ترجمة المقال من قبل محرري Hashrate & Shares خصيصًا لـ OntologyRussia. انقر

هل أنت مطور؟ انضم إلى مجتمعنا التقني في خلاف. أيضا ، الق نظرة على مركز المطورين على موقعنا الإلكتروني ، حيث يمكنك العثور على أدوات المطورين والوثائق والمزيد.

علم الوجود

المصدر: www.habr.com

إضافة تعليق