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

المقدمة من dApp للبرامج التابعة هو قالب للمشاريع التي تشمل التابعة كجزء من وظائفها. يمكن استخدام الكود كقالب للنسخ أو كمكتبة أو كمجموعة من الأفكار للتنفيذ التقني.
من حيث الأداء الوظيفي ، يعد هذا نظامًا منتسبًا منتظمًا يقوم بتنفيذ التسجيل مع الإشارة إلى إحالة واستحقاق متعدد المستويات لمكافآت الإحالات والتحفيز للتسجيل في النظام (استرداد النقود). النظام "خالص" dApp ، أي أن تطبيق الويب يتفاعل مباشرة مع blockchain دون الواجهة الخلفية أو قاعدة البيانات الخاصة به ، إلخ.
تستخدم التقنيات التي يمكن أن تكون مفيدة أيضًا في العديد من المشروعات الأخرى:
- استدعاء حساب ذكي على الائتمان مع السداد الفوري (في وقت المكالمة ، لا توجد رموز على الحساب لدفع ثمن المكالمة ، لكنها تظهر هناك نتيجة للمكالمة).
- PoW-captcha - الحماية من الاتصال الآلي عالي التردد لوظائف الحساب الذكي - وهو تناظرية لبرنامج captcha ، ولكن من خلال إثبات استخدام موارد الحوسبة.
- طلب مفاتيح البيانات حسب القالب.
التطبيق يتكون من:
- كود الحساب الذكي في اللغة ride4dapps (والتي ، حسب التصميم ، يتم دمجها في الحساب الذكي الرئيسي ، والتي تحتاج إلى تنفيذ وظائف التابعة لها) ؛
- الأغلفة js التي تنفذ مستوى التجريد عبر واجهة WAVES NODE REST API ؛
- رمز في إطار vuejs ، وهو مثال على استخدام المكتبة ورمز RIDE.
نحن تصف كل هذه الميزات.
استدعاء حساب ذكي على الائتمان مع السداد الفوريتتطلب مكالمات InvokeScript رسومًا من حساب بدء المعاملة. هذه ليست مشكلة إذا كنت تقوم بتنفيذ مشروع لـ geek blockchain الذين لديهم بعض الرموز WAVES على حسابهم ، ولكن إذا كان المنتج يهدف إلى الاستخدام على نطاق واسع ، يصبح هذا مشكلة خطيرة. بعد كل شيء ، يجب على المستخدم العناية بشراء رموز WAVES (أو أي أصل مناسب آخر يمكنك دفع ثمن المعاملات) ، مما يزيد من الحد الفاصل بالفعل للدخول في المشروع. يمكننا توزيع الأصول على المستخدمين ، مما سيسمح لنا بالدفع مقابل المعاملات ومواجهة خطر سوء الاستخدام عند إنشاء أنظمة آلية لضخ الأصول السائلة من نظامنا.
سيكون ملائمًا للغاية إذا كان من الممكن إجراء استدعاء InvokeScript "على حساب المستلم" (هذا الحساب الذكي الذي تم تثبيت البرنامج النصي عليه) ، ومثل هذا الاحتمال موجود ، وإن لم يكن بطريقة واضحة.
إذا قمت بتنفيذ ScriptTransfer داخل InvokeScript على عنوان المتصل ، والذي يعوض عن الرموز المميزة التي تم إنفاقها على الرسوم ، فسوف تنجح هذه المكالمة ، حتى لو لم تكن هناك أصول على حساب الاتصال في وقت الاتصال. هذا ممكن بسبب حقيقة أنه يتم فحص عدد كاف من الرموز بعد أن يتم استدعاء المعاملة وليس قبلها ، بحيث يكون من الممكن إجراء المعاملات على الائتمان رهنا بسدادها الفوري.
ScriptTransfer (i.caller، i.fee، unit)يسترد الكود أدناه الرسوم التي يتم إنفاقها على حساب الحساب الذكي. للحماية من إساءة استخدام هذه الميزة ، يجب عليك استخدام التحقق من أن المتصل ينفق رسومًا في الأصل الصحيح وفي حدود معقولة:
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)
أسرى الحرب، كلمة التحققإن فكرة اختبار إثبات العمل ليست جديدة وتم تنفيذها بالفعل في العديد من المشاريع ، بما في ذلك تلك التي تم تنفيذها على أساس WAVES. الفكرة هي أنه بالنسبة للعمل الذي يهدر موارد مشروعنا ، يجب على المتصل أيضًا أن ينفق موارده الخاصة ، مما يجعل الهجوم على نفاد الموارد باهظ التكلفة. للتحقق من الصحة بطريقة سهلة جدًا ومنخفضة التكلفة ، حيث قام مرسل المعاملة بحل مهمة PoW ، يوجد فحص لمعرف المعاملة:
إذا أخذ (toBase58String (i.transactionId) ، 3)! = "123" ، ثم رمي ("فشل إثبات العمل") آخرمن أجل إجراء معاملة ، يجب على المتصل تحديد هذه المعلمات بحيث يبدأ كود (معرف) base58 الخاص به عند 123 ، وهو ما يتوافق مع متوسط بضع عشرات من ثواني وقت المعالج ومعقول بشكل عام لمهمتنا. إذا كانت هناك حاجة إلى PoW أبسط أو أكثر تعقيدًا ، فالمهمة سهلة التنقيح بطريقة واضحة.
طلب مفاتيح البيانات حسب القالبمن أجل استخدام blockchain كقاعدة بيانات ، من الضروري وجود أدوات API للاستعلام عن قاعدة البيانات كقوالب مفتاح فال. ظهرت مجموعة الأدوات هذه في بداية يوليو 2019 كمعلمة "
مطابقات " لطلب
/ عناوين / بيانات REST API
؟ التطابقات = regexp . الآن ، إذا كنا بحاجة إلى الحصول على مفتاح واحد وليس جميع المفاتيح من تطبيق ويب في وقت واحد ، ولكن مع بعض المجموعات فقط ، يمكننا حينئذٍ تحديد اسم المفتاح. على سبيل المثال ، في هذا المشروع ، يتم ترميز معاملات السحب كـ
withdraw_${userAddress}_${txid}
والذي يسمح لك بالحصول على قائمة المعاملات لسحب الأموال لأي عنوان محدد وفقًا للقالب:
?matches=withdraw_${userAddress}_.*
الآن سوف نقوم بتحليل مكونات الحل الجاهزة.
كود Vuejsالرمز هو عرض تجريبي قريب من مشروع حقيقي. وهي تنفذ تسجيل الدخول من خلال Waves Keeper وتعمل مع مكتبة affiliate.js ، التي تساعد من خلالها في تسجيل المستخدم في النظام ، واستطلاع بيانات معاملة الاستطلاعات ، كما تتيح لك سحب الأموال المكتسبة إلى حساب المستخدم.
كود ركوبوهو يتألف من وظائف التسجيل والصندوق والسحب.
تسجيل وظيفة تسجيل مع نظام المستخدم. يحتوي على معلمتين: المرجع (عنوان الإحالة) والمعلمة الملح ، والتي لا يتم استخدامها في رمز الوظيفة ، وهو أمر ضروري لتحديد معرف المعاملة (مهمة PoW-captcha).
تستخدم الوظيفة (مثل الوظائف الأخرى في هذا المشروع) أسلوب الاقتراض ، وتكون نتيجة الوظيفة هي تمويل رسم لاستدعاء هذه الوظيفة. بفضل هذا القرار ، يمكن للمستخدم الذي أنشأ محفظة النقود للتو العمل على الفور مع النظام ولا يحتاج إلى الحيرة من مسألة شراء أو استلام أصل يتيح لك دفع رسوم المعاملة.
نتيجة وظيفة التسجيل هي إدخالين:
${owner)_referer = referer ${referer}_referral_${owner} = owner
يسمح هذا بالبحث المباشر والعكس (إحالة هذا المستخدم وجميع إحالات هذا المستخدم).
وظيفة الصندوق هي على الأرجح قالب لتطوير وظائف حقيقية. في النموذج المقدم ، يأخذ كل الأموال المنقولة بواسطة المعاملة ويوزعها على حسابات الإحالات 1 و 2 و 3 على حساب "استرداد النقود" وحساب "التغيير" (كل ما يتبقى عند التوزيع على الحسابات السابقة يقع هنا).
استرداد النقود هو وسيلة لتحفيز المستخدم النهائي للمشاركة في نظام الإحالة. يمكن للمستخدم سحب جزء من العمولة التي دفعها النظام في شكل "استرداد نقدي" بنفس طريقة مكافآت الإحالات.
عند استخدام نظام الإحالة ، ينبغي تعديل وظيفة الصندوق ، بحيث يتم تضمينها في المنطق الرئيسي للحساب الذكي الذي سيعمل عليه النظام. على سبيل المثال ، إذا تم دفع رسوم الإحالة للرهان الذي تم إجراؤه ، فيجب أن تكون وظيفة الصندوق مضمنة في المنطق الذي يتم فيه الرهان (أو يتم تنفيذ إجراء مستهدف آخر ، والذي يتم دفع الرسوم فيه). هذه الوظيفة تشفر ثلاثة مستويات من المكافآت الإحالة. إذا كنت بحاجة إلى القيام بمستويات أكثر أو أقل ، فسيتم تصحيح ذلك أيضًا في الكود. يتم تعيين النسبة المئوية للأجور بواسطة ثوابت
المستوى الأول - المستوى 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 .