كيفية كتابة عقد ذكي مع بيثون على الأنطولوجيا؟ الجزء 4: API الأصلي

صورة

في وقت سابق ، أدخلت العقد الأنطوني الذكي في
الجزء 1: Blockchain وبلوك API و
الجزء 2: التخزين API
الجزء 3: API وقت التشغيل
اليوم ، دعنا نتحدث عن كيفية استدعاء عقد ذكي أصلي لـ Ontology من خلال واجهة برمجة تطبيقات Native API . واحدة من أكثر وظائف نموذجية لاستدعاء العقد الأصلي هو نقل الأصول.

مقدمة


واجهة برمجة تطبيقات Native API لها واجهة برمجة تطبيقات واحدة فقط. عندما تستخدم وظيفة Invoke ، فأنت بحاجة إلى استخدام وظيفة الحالة المدمجة لمساعدتك في تغليف المعلمات. انظر أدناه لمعرفة كيفية استخدام الوظائف.

صورة

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

كيفية استخدام API الأصلي


كالعادة ، تحتاج إلى استيراد الدالتين كما يلي قبل استخدامها.

from ontology.interop.Ontology.Native import Invoke from ontology.builtins import state 

قائمة الأنطولوجيا العقد الأصلي


يوجد حاليًا 6 عقود أصلية لأنطولوجيا متاحة للمطورين. فيما يلي قائمة بالعقود المحلية الستة التي يمكن الاحتجاج بها بواسطة واجهة برمجة التطبيقات الأصلية.

صورة

في العقد ، ما عليك سوى تحويل عنوان العقد إلى تنسيق إضافي واستدعاءه.

على سبيل المثال ، عندما تحتاج إلى استدعاء عقد ONT Token ، يمكنك أولاً تحويل عنوان عقد ONT Token إلى تنسيق bytearray ، ثم استدعاء وظيفة Invoke. عند استدعاء دالة Invoke ، تكون المعلمات المستوردة هي رقم الإصدار وعنوان العقد وطريقة العقد التي يتم استدعاءها والمعلمات المتعلقة بالنقل التي يتم تضمينها بواسطة وظيفة الحالة.

هناك نقطة معينة تجدر الإشارة إليها هنا وهي أنه عند إجراء نقل لعقد ONG ، تكون الكمية المعبأة 10 أضعاف الكمية الفعلية. وهذا هو ، إذا كنت بحاجة إلى نقل 10 ONG ، فإن الكمية التي يجب تعبئتها هي 10¹⁰. عند استخدام محفظة ، مثل ONTO أو Cyano للنقل ، فإن الكمية التي تدخلها هي مبلغ التحويل.

 contract_address_ONT = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') param = state(from_acct, to_acct, ont_amount) res = Invoke(1, contract_address_ONT, 'transfer', [param]) 

نقل رمز العقد


فيما يلي مثال تفصيلي لكيفية استخدام Python لنقل ONT و ONG . في الكود أدناه ، يعد نوع معلمة حساب الإرسال والمستلم المستورد سلسلة. بالإضافة إلى ذلك ، يمكن أيضًا تسليمها مع نوع عنوان حساب المعلمة ، وبالتالي توفير رسوم الغاز لاستدعاء العقد. العملية هي كما يلي:

  1. تحديد متغيرات عنوان العقد contract_address_ONT و contract_address_ONG ؛
  2. تحويل عنوان الإرسال والاستلام من تنسيق base58 إلى تنسيق bytearray ؛
  3. تحقق من التوقيع وتأكد من أن عنوان الإرسال هو نفسه عنوان استدعاء العقد ؛
  4. تغلف وظيفة الحالة المعلمات المتعلقة بالنقل ؛
  5. استدعاء الدالة Invoke العقد الأصلي ONT Token و ONG Token؛
  6. تحديد ما إذا كان النقل ناجحًا من خلال إرجاع الدقة. إذا كانت قيمة الإرجاع هي b '\ x01' ، فسيتم النقل بنجاح وسيتم دفع حدث "النقل بنجاح".

 from ontology.interop.System.Runtime import Notify, CheckWitness from ontology.interop.Ontology.Runtime import Base58ToAddress from ontology.interop.Ontology.Native import Invoke from ontology.builtins import state # contract address contract_address_ONT = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') contract_address_ONG = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') def Main(operation, args): if operation == 'transfer': from_acct = args[0] to_acct = args[1] ont_amount = args[2] ong_amount = args[3] return transfer(from_acct,to_acct,ont_amount,ong_amount) return False def transfer(from_acct, to_acct, ont_amount, ong_amount): # convert base58 address to address in the form of byte array from_acct=Base58ToAddress(from_acct) to_acct=Base58ToAddress(to_acct) # check whether the sender is the payer if CheckWitness(from_acct): # transfer ONT if ont_amount > 0: param = state(from_acct, to_acct, ont_amount) res = Invoke(1, contract_address_ONT, 'transfer', [param]) if res and res == b'\x01': Notify('transfer succeeded') else: Notify('transfer failed') # transfer ONG if ong_amount > 0: param = state(from_acct, to_acct, ong_amount) res = Invoke(1, contract_address_ONG, 'transfer', [param]) if res and res == b'\x01': Notify('transfer succeeded') else: Notify('transfer failed') else: Notify('CheckWitness failed') 

تدرب على SmartX


يمكنك أيضًا ترجمة وتشغيل نموذج التعليمات البرمجية أعلاه على SmarX باتباع الخطوات التالية:

  • ترجمة العقد. أولاً ، قم بإنشاء مشروع على SmartX وتجميع التعليمات البرمجية في هذا المشروع.

صورة
  • نشر العقد. إذا كنت بحاجة إلى رمز اختبار لنشر العقد ، قدم هنا . نتيجة النشر هي كما يلي:

صورة

  • قم بتشغيل وظيفة النقل. قبل تشغيل وظيفة النقل ، تحتاج إلى تكوين المعلمات كما هو مطلوب. في المثال أدناه ، تحتاج إلى إدخال عنوان الإرسال ، وتلقي عنوان ، ونقل ONT ومبلغ ONG:

صورة

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

صورة

ملخص


في هذه المقالة ، قدمنا واجهة برمجة تطبيقات Native block of Ontology. يمكن للمطورين استخدام واجهة برمجة التطبيقات (API) هذه لاستدعاء عقود Ontology. في المقالة التالية ، سوف نقدم واجهة برمجة تطبيقات Upgrade لاستكشاف كيفية ترقية العقد في العقود الذكية لـ Ontology.

العثور على البرنامج التعليمي على جيثب هنا .



هذا هو البرنامج التعليمي الرسمي الذي تم نشره مسبقًا على مدونة Ontology Medium
هل أنت مطور؟ تأكد من انضمامك إلى مجتمع التكنولوجيا الخاص بنا على Discord . أيضًا ، ألق نظرة على مركز Developer على موقعنا ، حيث يمكنك العثور على أدوات مطور البرامج والوثائق وغير ذلك الكثير.

البحث عن الأنطولوجيا في مكان آخر


موقع علم الوجود
جيثب / الشقاق
برقية إنجليزي / روسي
تويتر / رديت

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


All Articles