تعلم كيفية كتابة موجات العقود الذكية على RIDE و RIDE4DAPPS. الجزء 1 (محفظة متعددة المستخدمين)


مرحبا بالجميع!


في الآونة الأخيرة ، أعلنت Waves Labs عن مسابقة للمطورين مخصصة لإصدار ملحق لغة عقد RIDE الذكي لتطبيقات Ride4Dapps اللامركزية على شبكة الاختبار!


لقد اخترنا حالة DAO ، حيث تخطط Ventuary لتطوير dApp مع الوظائف الاجتماعية: التصويت ، وجمع الأموال ، وإدارة الثقة ، إلخ.


لقد بدأنا بمثال بسيط في جلسة الأسئلة والأجوبة وفي RIDE IDE - مثال مع محفظة مشتركة .


دعونا نلقي نظرة على هذا المثال ، ونختبر الفرضيات ونفكر في بعض الغرائب:


دعونا لدينا أليس - مالك dApp
Boob and Cooper شريكان لـ Alice ، مؤسسا Alice-BC DAO
نيلي صاحب عمل يحتاج إلى تمويل
البنك - البنك الذي يوزع الرموز


المرحلة 1. تهيئة الأرصدة


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


يمكن العثور على العنوان في IDE عن طريق الكشف عن معلومات الحساب.


اختر بنك 10 موجات. بعد أن نتحقق من أنها جاءت من خلال مستكشف الكتلة والمعاملات: المتصفح


الآن لنوزع الرموز المميزة من البنك على المشاركين الآخرين. (ملاحظات: جميع المعاملات في شبكة الأمواج ليست مجانية ، وبالتالي ، يلزم وجود حد أدنى للرصيد الإيجابي لجميع المشاركين لإكمال المعاملات).


1 WAVES = 100000000 وحدة (wavelets) ، نظرًا لأن المبالغ يمكن أن تكون عددًا صحيحًا فقط
0.01 موجة (رسوم المعاملة) = 1000000

Bank -> [3 WAVES] -> Alice ، عبر TransferTransaction (النوع: 4).


نحن نتحقق من أن env.SEED التي يتم منها توقيع المعاملات يتوافق مع مصرفنا:




إذا لم يكن لديك عبارات أساسية متطابقة ، ما عليك سوى التبديل إليها في علامة التبويب "حسابات" والتحقق مرة أخرى.


بعد ذلك ، نقوم بإنشاء وإعلان وتوقيع معاملة عند نقل 3 WAVES Alice.
يمكنك أيضًا معرفة بيانات Alice من خلال متغير env.accounts. يبدأ الترقيم من 0 ، على التوالي Alice env.accounts [1].



broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000})) 

يمكن ملاحظة النتيجة أيضًا في المستعرض ، سيعود الارتباط الخاص بنا إلينا مباشرة بعد المعاملة .


نتأكد من أن رصيد Alice يتم تجديده بواسطة 3 WAVES ، وأن 10 - 3 - 0.01 = 0.699 يظل على رصيد البنك.




نرسل Boob and Cooper في 3 WAVES ، و Neli و Xena و Mark في 0.2 WAVES بنفس الطريقة.
(ملاحظات: لقد ارتكبنا خطأ في حرف واحد وأرسلنا Neli 0.02 WAVES. كن حذرًا!)


 broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000})) 

بعد تجديد أرصدة جميع المشاركين ، نرى:



المرحلة 2. إنشاء حساب dApp


اتفقنا على أن خالق ومالك التطبيق اللامركزي سيكون Alice.
في الحسابات ، انتقل إلى تثبيته كـ SEED وتحقق من تطابق env.SEED مع Alice.


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



رسوم لمعاملة setScript 1400000/100000000 = 0.014 WAVES. أليس لديها 2.986 موجة على توازنها.


دعنا الآن نحاول تثبيت حساب عقد ذكي أكثر تعقيدًا على حساب Alice موضح في المثال


يتضمن Ride4Dapps الآن نوعين جديدين من التعليقات التوضيحية:
  1. Callable (i) - تأخذ كمعلمة i ، بيانات حول الحساب الذي تسبب / وقع المعاملة. تحدد نتيجة هذه الوظيفة التغير في حالة حساب dApp. يمكن للحسابات الأخرى إنشاء معاملات وأداء وظائف مع هذا التعليق التوضيحي وتغيير حالة حساب dApp.
  2. Verifier (tx) - التحقق من المعاملات مع المعلمة tx المعاملة. يتوافق مع المنطق الأصلي من RIDE. في هذا التعبير ، يمكنك تمكين أو تعطيل المزيد من التغييرات في منطق العقود الذكية على حساب dApp.
    كن حذرا! النقطة المهمة هي أن البرنامج النصي في الحساب لا يساوي افتراضيًا ، ولكنه يستخدم مقارنة التوقيع ويسمح لمالك التوقيع فقط بإجراء المعاملات.
     sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPk) 


    بدون هذا التحقق ، يمكن لأي شخص إجراء المعاملات من حساب!

لنجعل حساب dApp بمثابة محفظة مشتركة لجميع المشاركين.



للتحقق من أي عقد نشط حاليًا على حسابك ، يمكنك نسخ كود base64 الخاص بالعقد الذكي في متصفح الكتلة والتعرف عليه من خلال أداة فك التشفير ( على سبيل المثال )





نتأكد من أن منطق العقد الذكي يطابق ما نتوقعه.
أليس لديها 2.972 موجة على توازنها.


يتتبع dApp هذا مقدار مساهمة كل من المشاركين في الصندوق المشترك من خلال آلية معاملات البيانات - DataEntry (currentKey ، newAmount) ، حيث يمثل currentKey الحساب الذي يستدعي وظيفة الإيداع ، بينما newAmount هي قيمة الرصيد المجدد.


يقوم Boob and Cooper بعمل ودائعهما على حساب dApp بمعدل 1 WAVES لكل منهما.



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


أرسل بوب 1 WAVES إلى حساب dApp.


 broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]})) 


بوب لديه 1.99 موجات اليسار. وهذا هو ، دفع بوب 0.01 WAVES العمولة



كان لدى أليس 2.972 موجة في ميزانيتها العمومية ، وأصبحت 3.972. تم تسجيل معاملة أيضًا على حساب Alice ، ومع ذلك ، لم يتم خصم أي عمولة من حساب dApp (Alice).
بعد أن جددت Cooper حساب Alice ، أصبحت 4.972 WAVES في الميزانية العمومية.



يمكنك معرفة عدد الموجات في المحفظة العامة التي تنتمي إليها في مستكشف المجموعات في علامة تبويب البيانات.


غيّر Cooper رأيه بشأن ترك مبلغ 1 WAVES على محفظة مشتركة وقرّر سحب نصف الروابط. للقيام بذلك ، يجب استدعاء وظيفة السحب.



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



لدى Cooper 2.48 WAVES في ميزانيتها العمومية. وفقا لذلك ، 3 WAVES - 1 - 0.01 ، ثم + 0.5 - 0.01. وفقا لذلك ، كل مكالمة لإيداع وسحب التكاليف 0.01 WAVES. نتيجة لذلك ، تم تغيير الإدخالات في جدول ملكية dApps كما يلي.



قرر بوب أيضًا سحب مبلغ معين من إجمالي المحفظة ، لكنه كان مخطئًا وحاول استخراج 1.5 WAVES.



ومع ذلك ، كان العقد الذكي تحقق لمثل هذا الموقف.


زينا هو المخادع ، حاولت سحب 1 WAVES من الحساب العام.



لقد فشلت أيضا.


في الجزء التالي ، سننظر في المزيد من المشكلات المعقدة المرتبطة بعيب حساب Alice dApp.

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


All Articles