ایجاد یک قرارداد تثبیت ارثی در استحکام

ساخت وبلاگ

افزودن مکانیسم استیک و پاداش ارثی به یک قرارداد هوشمند BEP-20 در استحکام.

توسط پرسی بولمر ، 3 اوت 2021

این مقاله بخش دوم یک سری چهار قسمت است.

ساختن یک برنامه غیر متمرکز با BEP-20 در استحکام-این مقاله به شما کمک می کند تا اصول استحکام را درک کنید

[ایجاد یک قرارداد تثبیت ارثی در استحکام] - مقاله دوم که در آن ما موارد استحکام پیشرفته تری را پوشش می دهیم و استیک و پاداش را پیاده سازی می کنیم

با استفاده از یک قرارداد هوشمند در یک برنامه وب - مقاله سوم این سریال که در آن یاد می گیریم چگونه از طریق یک برنامه وب با استفاده از Metamask به blockchain متصل شویم

استفاده از قراردادهای هوشمند به Binance Smart Chain با Truffle - مقاله چهارم و آخر که در آن یاد می گیریم چگونه قرارداد هوشمند خود را به شبکه های واقعی مستقر کنیم

در بخش اول ما با چگونگی راه اندازی یک محیط توسعه برای ایجاد یک نشانه BEP20 سفارشی ، عبور کردیم. در این مقاله ما در حال اضافه کردن Staking به Token خواهیم بود.

اگر کد کامل را از ماده یک ندارید ، می توانید آن را در اینجا پیدا کنید.

چه چیزی استینگ است؟

هنگامی که نشانه های خود را در شبکه سرمایه گذاری می کنید ، Staking است و پاداش انجام آن را دریافت می کنید. دلیل تشویق استیک به این دلیل است که اصطلاحی به نام اثبات سهام است. آن را به عنوان معدن مشاهده کنید ، اما به جای اجرای یک GPU برای محاسبه مواد ، با ذخیره نشانه های خود در شبکه معدن می کنید. می توانید یک لینک توضیح مفصل بخوانید.

در این مقاله ما با ارث بردن قرارداد دیگر ، استیک را اضافه خواهیم کرد.

معرفی Staking به نشانه

زمان آن رسیده است که ما Devtoken خود را با برخی از قابلیت های اضافه شده کمی خنک تر کردیم. در حال حاضر این فقط یک نشانه ساده است که ما واقعاً نمی توانیم کارهای زیادی با آن انجام دهیم. بیایید توانایی جمع آوری نشانه و دریافت پاداش از آن را اضافه کنیم.

بیایید با ایجاد یک قرارداد هوشمند جدید که توسط Devtoken ما به ارث رسیده است ، شروع کنیم. پرونده ای به نام قراردادها/stakable. sol ایجاد کنید. ما با نوشتن یک قرارداد خالی شروع خواهیم کرد و به محض رفتن مواردی به آن اضافه خواهیم کرد. به این ترتیب می توانیم عمق را پوشش دهیم که هر قسمت در واقع انجام می دهد.

قبل از حرکت ، قرارداد قابل تحمل را به Devtoken ارث برسانید و مطمئن شوید که می توانیم کامپایل کنیم.

قراردادهای باز/devtoken. sol را باز کنید و حتماً اعلامیه قرارداد را برای به ارث بردن قرارداد قابل تحمل به روز کنید ، ما همچنین باید Stakeable. sol را وارد کنیم.

امیدوارم همه چیز یکنواخت گردآوری شود ، در غیر این صورت خطاها را برطرف کرده و سپس اجازه می دهیم مکانیزم Staking خود را بسازیم.

اولین کاری که ما باید انجام دهیم ایجاد تمام ساختارهای مورد نیاز ما است. ما از نقشه برداری برای پیگیری شاخص های سهام برای حساب ها استفاده خواهیم کرد. نقشه برداری در استحکام نوعی نقشه هش در اکثر زبان ها است. می توان از آن برای نقشه برداری یک آدرس منحصر به فرد به یک مقدار استفاده کرد. یک شکست عالی را می توان از Doug Crescenzi یافت.

نقشه برداری که ما ایجاد می کنیم در واقع فقط یک مرجع شاخص به یک آرایه را در خود جای می دهد. این آرایه همه ذینفعان ما را نگه می دارد. چرا ما این کار را انجام می دهیم به زودی توضیح داده می شود.

ما سهام را با اطلاعاتی در مورد زمان ساخت سهام ، مقدار و چه کسی آن را ذخیره خواهیم کرد. همچنین توجه کنید که ما یک رویداد سهام داریم که هر زمان که سهام ایجاد شود ، ایجاد می شود. اگر در مورد وقایع مطمئن نیستید ، به مقاله یکی از این سریال ها برگردید.

ما با روشی برای افزودن ذینفعان جدید شروع خواهیم کرد. این روش فضای خالی را در آرایه ذینفعان اضافه می کند و مقادیر جدید ذینفعان را به آن اختصاص می دهد. سپس شاخص استفاده شده را برمی گرداند ، این شاخص شاخص شخصی ذینفعان است که در آن تمام سهام وی ذخیره می شود. این شاخص را می توان با استفاده از آدرس استاکر بازیابی کرد. به همین دلیل است که ما از نقشه برای ذخیره فهرست استفاده می کنیم و سپس ذینفعان را توسط آن فهرست بازیابی می کنیم. این گاز ما را صرفه جویی می کند زیرا جستجوی کاربر توسط فهرست در یک آرایه بسیار ارزان تر از تکرار کل آرایه است.

اکنون که می توانیم ذینفعان جدیدی را اضافه کنیم ، اجازه دهید یک عملکرد سهام اضافه کنیم تا بتوانیم آزمایش آن را آغاز کنیم. تنها چیز جدیدی که در اینجا یاد می گیرید کلمه کلیدی مورد نیاز است. برای انجام چک های مشروط از نیاز استفاده می شود. اگر این شرط برآورده نشود ، تماس با یک پیام خطا رد می شود. بنابراین اطمینان حاصل کنیم که سهام 0 نیست.

اگر توجه کرده اید ، ممکن است چیز عجیبی را متوجه شده باشید. اگر نه ، خوب است ، بیمار آن را می گویم.

آیا به شما توجه کرده است که روش Stake تعادل هیچ حساب را تغییر نمی دهد؟آیا متوجه شده اید که روش _stake اصلاح کننده داخلی دارد؟این بدان معناست که این عملکرد مجاز به فراخوانی از خارج از قرارداد نیست.

این یک خطا نیست! این امر به این دلیل است که این قرارداد به معنای ارثی در قرارداد devtoken است. قرارداد قابل قبول نمی خواهد عملکرد داخلی قرارداد را که به ارث می برد ، بداند ، بنابراین لازم است در قرارداد والدین اجرا شود. بیایید قراردادها/devtoken. sol را باز کنیم و این عملکرد را در معرض دید قرار دهیم و برخی از سوزاندن را اضافه کنیم و برخی از تست های واحد را بنویسیم تا مطمئن شوید که کار می کند.

سهام DevTokens برخی از الزامات را اضافه می کند، مانند موجودی فرستنده باید بیشتر از مبلغ شرط بندی باشد. این را نمی توان در قرارداد Stakeable انجام داد زیرا از موجودی Staker اطلاعی ندارد.

ما همچنین مبلغ را شرط بندی می کنیم و سپس همان مقدار را از حساب Stakers می سوزانیم.

بیایید این را آزمایش کنیم تا مطمئن شویم کار می کند.

من یک فایل جدید به نام tests/Stakeable. js ایجاد کرده ام که حاوی تست های مربوط به قرارداد Stakeable است.

اکنون، اینجاست که رویدادها نیز هیجان انگیز می شوند. ما در واقع می توانیم رویدادها را در جاوا اسکریپت گوش دهیم (که می تواند مفید باشد اگر می خواهید یک وب سایت برای توکن خود ایجاد کنید). ما از رویدادها برای انجام آزمایشات خود استفاده خواهیم کرد. ما سهام را راه اندازی می کنیم و سپس به رویدادهای اجرا شده نگاه می کنیم و مطمئن می شویم که داده های موجود در آنها صحیح است. به یاد داشته باشید که ما فقط رویدادها را روی Stakes موفق اجرا می کنیم.

برای کمک به ما در تست های واحد، ترافل یک کتابخانه مفید در جاوا اسکریپت به نام truffle-assertion دارد. اگر مرحله یک را دنبال می کردید، باید قبلاً آن را نصب کرده باشید، اما اگر نه، سعی کنید اینها را نصب کنید

ادعای ترافل به ما این امکان را می دهد که از اجرای یک تابع در بلاکچین پاسخ بگیریم و به راحتی رویدادهای ساطع شده توسط آن فراخوانی را تأیید کنیم.

مورد ev در مثال بالا حاوی اطلاعاتی است که ما در رویداد ارسال کردیم و می توان آن را اظهار کرد. بیایید آن را امتحان کنیم و ابتدا یک تست ساده را امتحان کنیم.

ما یک آزمایش ساده ایجاد می کنیم که در آن شرط بندی می شود و سپس رویداد Staked را تأیید می کند و صحت اطلاعات را بررسی می کند.

تست ها را اجرا کنید و مطمئن شوید که کار می کند، هر مشکلی را که پیش می آید اصلاح کنید.

همچنین بیایید تست Staking100x2 را بیشتر کنیم تا در واقع دو بار شرط بندی کنیم.

ما همچنین یک آزمایش اضافه می کنیم تا مطمئن شویم که Index سهامدار به درستی اختصاص داده شده است، بنابراین یک سهم در حساب 1 ایجاد می شود و شاخص اکنون باید 2 باشد.

مشاهده سهام در بلاک چین

قبل از حرکت، بیایید تراکنش ها را با استفاده از Ganache بررسی کنیم. یک سهم در کنسول ترافل اجرا کنید و از Ganache برای نظارت بر رویدادی که منتشر شده است استفاده کنید.

خروجی دستور stake تراکنش خواهد بود و می توان آن را مشاهده کرد تا به آنچه در حال وقوع است پی ببرید. همچنین به یاد داشته باشید که به دلیل ماهیت اتریوم، برای هر اقدام هزینه گاز وجود دارد.

Ganache را باز کنید و به تب Events بروید، باید بتوانید تمام رویدادهایی را که از زمان مهاجرت ما در شبکه رخ داده است را نمایش دهید.

به سهامداران پاداش دهید و اجازه برداشت بدهید

اکنون که قرارداد ما به Stakes اجازه می دهد، زمان آن فرا رسیده است که یک نوع سیستم پاداش برای شرط بندی را اجرا کنیم.

بیایید تابعی را اضافه کنیم که به ما امکان می دهد نشانه های sted را در قراردادها/devtoken. sol برداشت کنیم. این عملکرد باید تأیید کند که ما بیشتر از آنچه که ما در آن قرار داده ایم ، عقب نشینی نمی کنیم و باید نشانه های Staked را به آدرس مالک برگردانیم.

من آن را در حال عقب نشینی خواهم نامید و این یک عملکرد عمومی خواهد بود زیرا می خواهیم اجازه دهیم که از خارج از قرارداد هوشمند فراخوانی شود. من جزئیات را در اینجا توضیح نخواهم داد ، زیرا اساساً یک نسخه از سهام است اما معکوس شده است.

عقب نشینی روش داخلی _withDrawStake را فراخوانی می کند ، بنابراین اجازه دهید به قراردادها/stakeable. sol بپردازیم و آن را ایجاد کنیم.

یک سیستم پاداش را ادامه داده و پیاده سازی کنید که بر اساس مدت زمان سهام ، پاداش کاربر را افزایش دهد. به نظر من هر سهام که کاربر ایجاد کرده است به دلیل مدت زمان های مختلف ، پاداش متفاوتی خواهد داشت ، فکر می کنم این احساس عادلانه است.

ما یک سیستم پاداش را پیاده سازی خواهیم کرد که با 0. 01 ٪ در هر ساعت به کاربر پاداش می دهد. بنابراین بیایید با ایجاد متغیری که حاوی نرخ پاداش ما است ، شروع کنیم. توجه داشته باشید که به طور معمول در برنامه نویسی با 0. 01 ضرب می کنم ، اما از آنجا که ما اجازه اعشار را نمی دهیم ، باید در عوض از گزینه ریاضی برگشتی و تقسیم استفاده کنیم. برعکس 0. 01 می تواند 1000 باشد.

کاربران در هر ساعت پاداش می گیرند که سهام همچنان ادامه دارد و ما در هر ساعت پاداش 0. 1 ٪ به آنها می دهیم. بیایید یک متغیر را در بالای پرونده ایجاد کنیم تا بتوانیم نرخ پاداش را کنترل کنیم.

ما با ایجاد یک تابع لازم به نام CalculateStakereward شروع خواهیم کرد. هدف اصلی این عملکرد محاسبه پاداش است که ذینفع باید برای تلاش های خود دریافت کند. CalculateStakereward سهم را می پذیرد و پاداش را که حق دارد بر اساس زمانی که سهام فعال بوده است محاسبه کند. این عملکرد داخلی خواهد بود ، یعنی فقط مجاز به دسترسی به داخل قرارداد است. همچنین دارای اصلاح کننده نمایش خواهد بود زیرا به هیچ وجه بر وضعیت تأثیر نمی گذارد.

الگوریتم مانند

  • مدت زمان را از طریق بلوک محاسبه کنید. timestamp - زمان سهام ، این ثانیه برمی گردد
  • تقسیم بر 1 ساعت (متغیر داخلی استحکام برای 3600 ثانیه)
  • با مقدار سهام چند برابر کنید
  • تقسیم بر نرخ پاداش دهنده

اکنون که ما مجبور هستیم بتوانیم پاداش سهام را محاسبه کنیم ، اجازه دهید _withDrawStake را پیاده سازی کنیم. این عملکرد به دنبال یک ذینفع ، براساس فرستنده ، نیاز دارد که مبلغ برداشت کمتر از مقدار استیک باشد.

هرگونه سهام خالی نیز حذف می شود. Delete راهی برای پاکسازی منابع موجود در blockchain و مهم است ، زیرا در واقع گاز را برای ذخیره سازی آزاد شده بازپرداخت خواهید کرد. Delete یک آرایه را با شاخص مشخص شده می پذیرد و تمام مقادیر موجود در آن شاخص داده شده را باطل می کند. این شاخص را حذف نمی کند ، که واقعاً مهم است زیرا ما از ترتیب آرایه به عنوان شناسه استفاده می کنیم. حذف مهم است ، نه تنها برای تمیز کردن زباله بلکه برای بازپرداخت برخی از گاز.

یک چیز برای دیدن اینجا که برای ما جدید است کلمه کلیدی حافظه است. این بدان معنی است که ما داده ها را به طور موقت ذخیره خواهیم کرد ، در مورد آن بیشتر در اینجا بخوانید.

اکنون ما یک عقب نشینی را در داخل DevToken اضافه خواهیم کرد که این عملکرد را در معرض دید قرار می دهد ، زیرا دارای یک اصلاح کننده داخلی است. قرارداد Stakeable نمی داند چه قراردادی را به ارث می برد و در آنجا به بهترین وجهی که می تواند انجام دهد بازگشت مبلغ پاداش است ، و این ارث مسئولیت آن را در واقع نعناع آن نشانه ها خواهد داشت. این عملکرد باید از خارج از blockchain قابل تماس باشد و در آنجا اصلاح کننده عمومی باشد.

ما به زودی عملکردهای جدید خود را آزمایش خواهیم کرد ، اما برای آسانتر کردن آن راهی برای بررسی اینکه آیا یک حساب دارای سهام است ، اضافه خواهیم کرد. بیایید یک ساختار جدید ایجاد کنیم که همه سهام را در یک حساب خلاصه می کند. ساختار در قرارداد محکم می رود.

قبل از شروع تابستان ، اجازه دهید سهام را نیز به روز کنیم تا داده هایی را در مورد اینکه چقدر پاداش قابل ادعا است ، نگه دارد.

از آنجا که ما ساختار سهام را اصلاح کردیم ، تمام اولیه سازی های جدید آن باید تغییر کنند ، خوشبختانه ما فقط در داخل عملکرد _stake داریم. به سادگی یک پارامتر ورودی را به سهام جدید اضافه کنید ، در مورد ما باید از 0 شروع شود.

اکنون بیایید تابعی به نام HasStake ایجاد کنیم. این دو اصلاح کننده خواهد بود ،

از آنجا که مجاز به اجرای آن از خارج از blockchain است ، و مشاهده می شود زیرا این مقادیر موجود در blockchain را تغییر نمی دهد. این تابع یک ساختار Stakingsummary ذخیره شده در حافظه را برمی گرداند. حافظه نوع ذخیره سازی استحکام است که فقط در طول زمان اجرای عملکرد و یک روش ارزان برای ذخیره داده ها در دسترس است.

عملکرد ما تمام سهام حساب را به خود اختصاص داده و از طریق همه سهام حلقه می کند و پاداش فعلی آنها را محاسبه می کند.

وقت آن است که ما برداشت را آزمایش کنیم و اطمینان حاصل کنیم که محاسبه پاداش درست است.

زمان Fastfoward در طول تست ها در ترافل

اکنون که کارکردهایی را در محل خود داریم و نیاز به آزمایش آنها داریم ، متوجه یک قسمت پیچیده تر خواهیم شد. ما نمی خواهیم این آزمون منتظر بماند تا یک ساعت متوجه شود که آیا پاداش به درستی پرداخت شده است (یا حداقل من هم نمی خواهم). ما نیاز داریم که به سرعت در حال حمل و نقل سریع زمان blockchain باشد ، خوشبختانه می توانیم با استفاده از برخی این کار را انجام دهیم.

ما یک ترفند از اندی وات را وام خواهیم داد که مقاله ای در مورد چگونگی سریع پیشبرد blockchain Ganache در طول تست های ترافل نوشت. برای به زودی ، Ganache تماس هایی را می پذیرد که به ما اجازه می دهد زمان را تغییر دهیم.

یکی از آنها EVM_INCREASETIME است که باعث افزایش زمان بلوک می شود ، اما زمان تا زمان استخراج بلوک تغییر نمی کند. بنابراین باید یک تماس با EVM_MINE برقرار شود.

در داخل پوشه تست ، پوشه ای به نام Helpers ایجاد کنید. اندی سپس چند کارکرد دارد که این اقدامات را در طول آزمایشات بسیار بی اهمیت می کند. پرونده ای به نام truffletesthelpers. js ایجاد کنید و قسمت زیر را در آن کپی کنید. به یاد داشته باشید که پرونده را بخوانید تا بتوانید تا حدودی درک کنید که چه اتفاقی می افتد ، (هرچند که در مرحله اول ممکن است خیلی مهم نباشد) ، و در آخر ، حتما مقاله اندی را بخوانید.

با وارد کردن توابع یاور در staking. js در بالای پرونده شروع کنید.

تست تست و عقب نشینی

ما در نهایت آماده اجرای تست های واحد به عملکرد سهام و عقب نشینی هستیم.

ما می خواهیم در داخل stakeable. js کار کنیم ، اما از آنجا که یک بخش بزرگ از کد آرام است ، آزمایش را با تست پوشش خواهیم داد.

اولین آزمایش ساده است ، فقط برای بررسی اینکه ما نمی توانیم بیشتر از آنچه در ابتدا در ابتدا ساخته شده بود ، پس بگیریم.

مورد بعدی یک تست واحد برای اطمینان از آثار خروج است. خواهیم دید که آیا برداشت واقعاً همانطور که انتظار می رود کار می کند ، ما 50 نشانه را از سهام خارج خواهیم کرد. ما همچنین در صورت بروزرسانی با استفاده از خلاصه جدیدی که ایجاد کردیم ، اطمینان حاصل خواهیم کرد. به یاد داشته باشید که سهام قبل از این آزمایش در یک تست واحد انجام می شود ، بهترین راه حل نیست ، سعی کنید یک سهام جدید را اجرا کنید و از آن استفاده کنید.

حال بیایید آزمایشاتی را اضافه کنیم که 50 نشانه را دوباره از سهام خارج کند ، (مبلغ سهام اصلی 100 بود). این بدان معنی است که از آنجا که اکنون خالی است ، باید سهام برداشته شود. برای بررسی اینکه ما تأیید خواهیم کرد که حساب مربوط به سهام روی حساب تهی تنظیم شده است ، که در استحکام آن است:

اکنون وقت آن رسیده است که آزمایش های پیشرفته تری انجام دهیم. ما باید از یاری که قبلاً ایجاد کرده ایم استفاده کنیم تا زمان را سریع جلو کنیم. از این کار برای اطمینان از محاسبه جوایز به درستی استفاده می شود.

از آزمایشات نهایی برای اطمینان از اینکه ذینفعان هنگام برداشت مبلغ به درستی پاداش می گیرند ، استفاده می شود و این سهام پس از هر عقب نشینی ، پیشخوان قابل ادعا را مجدداً تنظیم می کند.

حتماً آزمایشات را انجام دهید تا بدانید که آنها کار می کنند.

نتیجه گیری مقاله دوم

این مقاله دوم است. در این سری دو مقاله دیگر وجود دارد ، شما می توانید کد کامل را که در شاخه قابل حمل مخزن من دارم پیدا کنید.

ما موارد زیر را پوشش داده ایم

  • چه استیک است
  • نحوه اجرای یک استیک ساده
  • پاداش سهام
  • نوشتن تست های واحد برای کد ما

مقاله سوم در مورد استفاده از قرارداد هوشمند در یک برنامه وب خواهد بود.

من امیدوارم که از آن لذت برده باشید ، در صورت وجود هر گونه سؤال ، احساس راحتی کنید.< SPAN> از آزمایشات نهایی برای اطمینان از اینکه ذینفع هنگام برداشت مبلغ به درستی پاداش می گیرد ، استفاده می شود و سهام پس از هر عقب نشینی ، پیشخوان قابل ادعا را مجدداً تنظیم می کند.

فارکس پرشین...
ما را در سایت فارکس پرشین دنبال می کنید

برچسب : نویسنده : دلیله نمازی بازدید : 53 تاريخ : پنجشنبه 18 خرداد 1402 ساعت: 1:40