برنامه وابسته غیرمتمرکز و منبع باز در بلاک چین Waves

یک برنامه وابسته غیرمتمرکز در بلاک چین Waves، که به عنوان بخشی از کمک مالی Waves Labs توسط تیم Bettex اجرا شده است.

پست تبلیغاتی نیست! این برنامه متن باز است، استفاده و توزیع آن رایگان است. استفاده از این برنامه توسعه برنامه های کاربردی dApp را تحریک می کند و به طور کلی تمرکززدایی را ترویج می کند، که به نفع هر کاربر اینترنت است.

برنامه وابسته غیرمتمرکز و منبع باز در بلاک چین Waves

dApp ارائه‌شده برای برنامه‌های وابسته، الگویی برای پروژه‌هایی است که به‌عنوان بخشی از قابلیت‌های خود، Affiliate را شامل می‌شود. کد می تواند به عنوان یک الگو برای کپی کردن، به عنوان یک کتابخانه یا به عنوان مجموعه ای از ایده ها برای پیاده سازی فنی استفاده شود.

از نظر عملکرد، این یک سیستم وابسته معمولی است که ثبت نام با ارجاع دهنده، تعلق پاداش چند سطحی برای ارجاعات و انگیزه برای ثبت نام در سیستم (بازگشت نقدی) را اجرا می کند. این سیستم یک dApp "خالص" است، به این معنی که برنامه وب مستقیماً با بلاک چین تعامل دارد، بدون اینکه باطن، پایگاه داده و غیره خود را داشته باشد.

تکنیک های مورد استفاده که می تواند در بسیاری از پروژه های دیگر نیز مفید باشد:

  • فراخوانی یک حساب هوشمند به بدهی با بازپرداخت فوری (در زمان تماس هیچ نشانه ای در حساب برای پرداخت هزینه تماس وجود ندارد، اما در نتیجه تماس در آنجا ظاهر می شوند).
  • PoW-captcha - محافظت در برابر تماس‌های خودکار با فرکانس بالا به عملکردهای حساب هوشمند - مشابه کپچا، اما از طریق اثبات استفاده از منابع محاسباتی.
  • پرس و جو برای کلیدهای داده با استفاده از یک الگو.

برنامه شامل موارد زیر است:

  • کد حساب هوشمند در زبان ride4dapps (که همانطور که برنامه ریزی شده است در حساب هوشمند اصلی که باید عملکرد وابسته برای آن اجرا شود ادغام می شود).
  • js wrapper که یک سطح انتزاعی را روی WAVES NODE REST API پیاده سازی می کند.
  • کد روی چارچوب vuejs که نمونه ای از استفاده از کتابخانه و کد RIDE است.

اجازه دهید تمام ویژگی های ذکر شده را شرح دهیم.

تماس با حساب هوشمند برای بدهی با بازپرداخت فوری

فراخوانی InvokeScript مستلزم پرداخت هزینه از حساب شروع کننده تراکنش است. اگر در حال ساخت پروژه ای برای گیک های بلاک چین هستید که مقدار مشخصی توکن WAVES در حساب خود دارند، مشکلی نیست، اما اگر هدف استفاده از محصول توسط عموم مردم باشد، این یک مشکل جدی می شود. از این گذشته، کاربر باید از خرید توکن های WAVES (یا دارایی مناسب دیگری که می تواند برای پرداخت تراکنش ها استفاده شود) مراقبت کند، که مانع قابل توجهی را برای ورود به پروژه افزایش می دهد. ما می‌توانیم دارایی را بین کاربرانی توزیع کنیم که می‌توانند برای تراکنش‌ها پرداخت کنند و در صورت ایجاد سیستم‌های خودکار برای خروج یک دارایی نقد از سیستم ما، با خطر سوء استفاده از آنها مواجه می‌شوند.

اگر امکان فراخوانی InvokeScript "به هزینه گیرنده" (حساب هوشمندی که اسکریپت روی آن نصب شده است) بسیار راحت خواهد بود، و چنین امکانی، اگرچه به شکل واضحی نیست، وجود دارد.

اگر در داخل InvokeScript یک ScriptTransfer به آدرس تماس‌گیرنده انجام دهید، که هزینه توکن‌های هزینه شده را جبران می‌کند، آنگاه چنین تماسی موفق خواهد بود، حتی اگر در زمان تماس هیچ دارایی در حساب تماس‌گیرنده وجود نداشته باشد. این امکان وجود دارد زیرا چک برای توکن‌های کافی پس از فراخوانی تراکنش انجام می‌شود، نه قبل از آن، به طوری که معاملات را می‌توان به صورت اعتباری و مشروط به بازپرداخت فوری انجام داد.

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) مورد نیاز است.

PoW-captcha

ایده کپچای اثبات کار جدید نیست و قبلاً در پروژه های مختلفی از جمله پروژه هایی که بر اساس WAVES پیاده سازی شده اند، پیاده سازی شده است. ایده این است که برای انجام عملی که منابع پروژه ما را مصرف می کند، تماس گیرنده باید منابع خود را نیز خرج کند، که باعث می شود حمله کاهش منابع بسیار گران باشد. برای تایید بسیار آسان و کم هزینه که فرستنده تراکنش مشکل PoW را حل کرده است، یک بررسی شناسه تراکنش وجود دارد:

if take(toBase58String(i.transactionId), 3) != "123" then throw ("اثبات کار ناموفق") دیگری

برای انجام یک تراکنش، تماس گیرنده باید چنین پارامترهایی را انتخاب کند تا کد (id) پایه 58 آن با اعداد 123 شروع شود که به طور متوسط ​​با چند ده ثانیه زمان پردازشگر مطابقت دارد و به طور کلی برای کار ما منطقی است. اگر یک PoW ساده‌تر یا پیچیده‌تر مورد نیاز باشد، می‌توان کار را به راحتی به روشی واضح تغییر داد.

پرس و جو برای کلیدهای داده با استفاده از یک الگو

به منظور استفاده از بلاک چین به عنوان پایگاه داده، داشتن ابزارهای API برای پرس و جو از پایگاه داده به عنوان key-val بر اساس الگوها، حیاتی است. چنین جعبه ابزاری در ابتدای جولای 2019 در قالب یک پارامتر ظاهر شد ؟مسابقات به درخواست REST API /addresses/data?matches=regexp. حال، اگر نیاز به دریافت بیش از یک کلید از یک برنامه وب و نه همه کلیدها به طور همزمان داشته باشیم، بلکه فقط یک گروه را دریافت کنیم، می‌توانیم انتخابی را با نام کلید انجام دهیم. به عنوان مثال در این پروژه تراکنش های برداشت به صورت کدگذاری می شوند

withdraw_${userAddress}_${txid}

که به شما امکان می دهد با استفاده از الگو، لیستی از تراکنش های برداشت وجه را برای هر آدرس داده شده دریافت کنید:

?matches=withdraw_${userAddress}_.*

حالا بیایید به اجزای محلول نهایی نگاه کنیم.

کد Vuejs

این کد یک نسخه نمایشی کاری است که نزدیک به پروژه واقعی است. ورود به سیستم را از طریق Waves Keeper پیاده‌سازی می‌کند و با کتابخانه affiliate.js کار می‌کند، که با آن کاربر را در سیستم ثبت می‌کند، داده‌های تراکنش را جستجو می‌کند، و همچنین به شما اجازه می‌دهد وجوه کسب‌شده را به حساب کاربر برداشت کنید.

برنامه وابسته غیرمتمرکز و منبع باز در بلاک چین Waves

کد برای RIDE

شامل توابع ثبت، سرمایه گذاری و برداشت می شود.

تابع ثبت نام کاربر را در سیستم ثبت می کند. دارای دو پارامتر است: ارجاع (آدرس ارجاع دهنده) و پارامتر salt که در کد تابع استفاده نمی شود و برای انتخاب شناسه تراکنش (وظیفه PoW-captcha) مورد نیاز است.

تابع (مانند سایر توابع این پروژه) از تکنیک فراخوانی بدهی استفاده می کند، نتیجه تابع تأمین مالی پرداخت هزینه برای فراخوانی این تابع است. به لطف این راه حل، کاربری که به تازگی یک کیف پول ایجاد کرده است می تواند بلافاصله با سیستم کار کند و نگران خرید یا دریافت دارایی ای نباشد که به او امکان پرداخت هزینه تراکنش را می دهد.

نتیجه تابع ثبت نام دو رکورد است:

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

این امکان جستجوهای رو به جلو و معکوس را فراهم می کند (ارجاع دهنده یک کاربر معین و همه ارجاعات یک کاربر معین).

تابع صندوق بیشتر یک الگو برای توسعه عملکرد واقعی است. در شکل ارائه شده خود، تمام وجوه منتقل شده توسط تراکنش را می گیرد و آنها را به حساب های ارجاع دهندگان سطوح 1، 2، 3، به حساب "بازگشت نقدی" و حساب "تغییر" (هر چیزی که هنگام توزیع به قبلی باقی می ماند) توزیع می کند. حساب ها اینجا می رود).

بازگشت نقدی ابزاری برای ایجاد انگیزه در کاربر نهایی برای مشارکت در سیستم ارجاع است. کاربر می تواند بخشی از پورسانت پرداخت شده توسط سیستم را به صورت «بازگشت نقدی» همانند پاداش ارجاعات برداشت کند.

هنگام استفاده از سیستم ارجاع، عملکرد صندوق باید اصلاح شده و در منطق اصلی حساب هوشمندی که سیستم بر روی آن کار خواهد کرد، ادغام شود. به عنوان مثال، اگر پاداش ارجاعی برای شرط بندی انجام شده پرداخت شود، تابع صندوق باید در منطقی که شرط قرار می گیرد (یا اقدام هدفمند دیگری انجام می شود که پاداش برای آن پرداخت می شود) تعبیه شود. سه سطح از پاداش ارجاع در این تابع کدگذاری شده است. اگر نیاز به ایجاد سطوح بیشتر یا کمتر دارید، این نیز در کد تصحیح شده است. درصد پاداش توسط ثابت های level1-level3 تنظیم می شود؛ در کد به صورت محاسبه می شود مقدار * سطح / 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 API است. یک سطح انتزاعی را مستقل از چارچوب پیاده‌سازی می‌کند (هر کدام را می‌توان استفاده کرد). توابع فعال (ثبت نام، برداشتن) فرض می کنند که Waves Keeper روی سیستم نصب شده است؛ خود کتابخانه این را بررسی نمی کند.

روش ها را اجرا می کند:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

عملکرد روش ها از نام ها مشخص است؛ پارامترها و داده های برگشتی در کد توضیح داده شده اند. تابع ثبت به نظرات اضافی نیاز دارد - چرخه ای از انتخاب شناسه تراکنش را شروع می کند به طوری که از 123 شروع می شود - این همان PoW-captcha است که در بالا توضیح داده شده است که از ثبت انبوه محافظت می کند. این تابع یک تراکنش با شناسه مورد نیاز را پیدا می کند و سپس آن را از طریق Waves Keeper امضا می کند.

برنامه وابسته DEX در دسترس است GitHub.com.

منبع: www.habr.com

اضافه کردن نظر