برنامج تابع لامركزي مفتوح المصدر على Waves blockchain

برنامج تابع لامركزي قائم على بلوكشين Waves ، ويتم تنفيذه كجزء من منحة Waves Labs من قبل فريق Bettex.

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

برنامج تابع لامركزي مفتوح المصدر على Waves blockchain

يعد dApp المقدم للبرامج التابعة نموذجًا للمشاريع التي تتضمن الشركات التابعة كجزء من وظائفها. يمكن استخدام الكود كنموذج للنسخ أو كمكتبة أو كمجموعة من الأفكار للتنفيذ الفني.

من حيث الوظيفة ، يعد هذا نظامًا عاديًا تابعًا ينفذ التسجيل مع مُحيل ، وتراكم متعدد المستويات للأجر للإحالات والتحفيز على التسجيل في النظام (استرداد النقود). النظام عبارة عن dApp "خالص" ، أي أن تطبيق الويب يتفاعل مباشرة مع blockchain بدون الواجهة الخلفية الخاصة به ، أو قاعدة البيانات ، إلخ.

يتم استخدام التقنيات التي يمكن أن تكون مفيدة أيضًا في العديد من المشاريع الأخرى:

  • الاتصال بحساب ذكي بالائتمان مع السداد الفوري (في وقت المكالمة ، لا توجد رموز مميزة في الحساب لدفع ثمن المكالمة ، ولكنها تظهر هناك كنتيجة للمكالمة).
  • PoW-captcha - الحماية من المكالمات التلقائية عالية التردد لوظائف الحساب الذكي - على غرار captcha ، ولكن من خلال إثبات استخدام موارد الحوسبة.
  • طلب مفاتيح البيانات حسب النموذج.

التطبيق يتكون من:

  • رمز الحساب الذكي في لغة Ride4dapps (والتي ، كما هو مخطط لها ، يتم دمجها في الحساب الذكي الرئيسي ، والذي تحتاج إلى تنفيذ وظائف الشركة التابعة له) ؛
  • المجمع الذي ينفذ طبقة تجريد فوق WAVES NODE REST API ؛
  • كود في إطار عمل vuejs ، وهو مثال على استخدام المكتبة ورمز RIDE.

دعنا نصف جميع الميزات المدرجة.

استدعاء حساب ذكي في الديون مع السداد الفوري

يتطلب استدعاء InvokeScript دفع رسوم من الحساب الذي يبدأ المعاملة. هذه ليست مشكلة إذا كنت تقوم بمشروع لمحترفي blockchain الذين لديهم عدد معين من رموز WAVES على حساباتهم ، ولكن إذا كان المنتج موجهًا للجماهير ، فستصبح هذه مشكلة خطيرة. بعد كل شيء ، يجب على المستخدم أن يحضر لشراء رموز WAVES (أو أي أصل مناسب آخر يمكن استخدامه لدفع المعاملات) ، مما يزيد من العتبة الكبيرة بالفعل لدخول المشروع. يمكننا توزيع الأصول على المستخدمين الذين سيسمح لهم بالدفع مقابل المعاملات ومواجهة مخاطر إساءة استخدامها عند إنشاء أنظمة آلية لضخ الأصول السائلة من نظامنا.

سيكون مناسبًا جدًا إذا كان من الممكن استدعاء InvokeScript "على حساب المستلم" (الحساب الذكي الذي تم تثبيت البرنامج النصي عليه) ، وهذا الاحتمال موجود ، وإن لم يكن بطريقة واضحة.

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

ScriptTransfer (i.caller ، i.fee ، الوحدة)

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

func checkFee(i:Invocation) = {
if i.fee > maxFee then throw(“unreasonable large fee”) else
if i.feeAssetId != unit then throw(“fee must be in WAVES”) else true
}

أيضًا ، للحماية من الهدر الخبيث وغير المنطقي للأموال ، يلزم توفير الحماية ضد المكالمات التلقائية (PoW-captcha).

PoW-captcha

إن فكرة إثبات العمل captcha ليست جديدة وقد تم تنفيذها بالفعل في مشاريع مختلفة ، بما في ذلك تلك القائمة على WAVES. الهدف من الفكرة هو أنه من أجل تنفيذ إجراء يهدر موارد مشروعنا ، يجب على المتصل أيضًا إنفاق موارده الخاصة ، مما يجعل هجوم استنفاد الموارد مكلفًا للغاية. للتحقق من صحة سهلة للغاية ومنخفضة التكلفة من أن مرسل المعاملة قد حل مشكلة إثبات العمل ، هناك فحص معرف المعاملة:

إذا أخذ (toBase58String (i.transactionId)، 3)! = "123" ثم رمي ("فشل إثبات العمل") وإلا

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

مفاتيح بيانات الاستعلام حسب النموذج

من أجل استخدام blockchain كقاعدة بيانات ، من الضروري أن يكون لديك أدوات API للاستعلام عن قاعدة البيانات كقيمة مفتاح باستخدام القوالب. ظهرت مجموعة الأدوات هذه في أوائل يوليو 2019 كمعامل ؟اعواد الكبريت بناءً على طلب REST API / العناوين / data؟ matches = regexp. الآن ، إذا احتجنا إلى الحصول على أكثر من مفتاح واحد وليس كل المفاتيح في وقت واحد من تطبيق الويب ، ولكن بعض المجموعات فقط ، فيمكننا تحديد اسم المفتاح. على سبيل المثال ، في هذا المشروع ، يتم ترميز معاملات السحب كـ

withdraw_${userAddress}_${txid}

والذي يسمح لك بالحصول على قائمة بالمعاملات الخاصة بسحب الأموال لأي عنوان محدد باستخدام النموذج:

?matches=withdraw_${userAddress}_.*

الآن دعنا نحلل مكونات الحل النهائي.

كود vuejs

الكود عبارة عن عرض توضيحي عملي ، قريب من مشروع حقيقي. ينفذ تسجيل الدخول من خلال Waves Keeper ويعمل مع مكتبة affiliate.js ، بمساعدة يسجل مستخدمًا في النظام ويستفسر عن بيانات المعاملات ويسمح لك أيضًا بسحب الأموال المكتسبة إلى حساب المستخدم.

برنامج تابع لامركزي مفتوح المصدر على Waves blockchain

كود على RIDE

يتكون من وظائف التسجيل والتمويل والسحب.

وظيفة التسجيل تسجل المستخدم في النظام. يحتوي على معلمتين: المرجع (عنوان المرجع) ومعلمة الملح غير المستخدمة في رمز الوظيفة ، وهو أمر ضروري لتحديد معرف المعاملة (مهمة PoW-captcha).

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

نتيجة وظيفة التسجيل هي سجلين:

${owner)_referer = referer
${referer}_referral_${owner} = owner

يسمح هذا بعمليات البحث إلى الأمام والخلف (مرجع المستخدم المحدد وجميع إحالات المستخدم المحدد).

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

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

عند استخدام نظام الإحالة ، يجب تعديل وظيفة الصندوق ، بحيث يتم تضمينها في المنطق الرئيسي للحساب الذكي الذي سيعمل عليه النظام. على سبيل المثال ، إذا تم دفع مكافأة إحالة مقابل رهان تم إجراؤه ، فيجب دمج وظيفة الصندوق في المنطق الذي يتم فيه الرهان (أو يتم تنفيذ إجراء مستهدف آخر يتم دفع المكافأة من أجله). هناك ثلاثة مستويات من مكافآت الإحالة مشفرة في هذه الميزة. إذا كنت تريد إنشاء مستويات أكثر أو أقل ، فسيتم تصحيح ذلك أيضًا في الكود. يتم تعيين نسبة المكافأة بواسطة ثوابت المستوى 1 - المستوى 3 ، في الكود يتم حسابها على أنها المبلغ * المستوى / 1000، أي أن القيمة 1 تقابل 0,1٪ (يمكن أيضًا تغيير هذا في الكود).

يقوم استدعاء الوظيفة بتغيير رصيد الحساب وأيضًا إنشاء إدخالات لغرض تسجيل النموذج:

fund_address_txid = address:owner:inc:level:timestamp
Для получения timestamp (текущего времени) используется такая вот связка
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}

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

# withdraw log: withdraw_user_txid=amount:timestamp

تطبيق

الجزء الرئيسي من التطبيق هو مكتبة affiliate.js ، وهي جسر بين نماذج البيانات التابعة وواجهة برمجة تطبيقات WAVES NODE REST. تنفذ طبقة تجريد مستقلة عن إطار العمل (يمكن استخدام أي طبقة). تفترض الوظائف النشطة (التسجيل ، والسحب) أن Waves Keeper مثبت في النظام ، والمكتبة نفسها لا تتحقق من ذلك.

طرق التنفيذ:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

وظائف الطرق واضحة من الأسماء ، والمعلمات وبيانات الإرجاع موصوفة في الكود. تتطلب وظيفة التسجيل تعليقات إضافية - تبدأ دورة اختيار معرّف المعاملة بحيث تبدأ من 123 - وهذا هو PoW captcha الموصوف أعلاه ، والذي يحمي من التسجيلات الجماعية. تبحث الوظيفة عن معاملة بالمعرف المطلوب ، ثم توقعها من خلال Waves Keeper.

يتوفر البرنامج التابع لـ DEX على GitHub.com.

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

إضافة تعليق