در نسخه سوم پروتکل Compound، قراردادهای Bulker عملکردی مشابه multicall
دارند. این قراردادها به شما اجازه می دهند چند عملیات مختلف را در قالب یک تراکنش ترکیب و اجرا کنید.
برای مثال، فرض کنید میخواهید اتر (Ether)، لینک (LINK) و بیت کوین رپ شده (wBTC) را به عنوان وثیقه وارد سیستم کنید. در همین تراکنش، قصد دارید معادل آن USDC وام بگیرید. با استفاده از Bulker، میتوانید تمام این اقدامات را به صورت یکجا انجام دهید.
همچنین میتوانید در یک تراکنش، بخشی از وثیقه را کاهش دهید و همزمان بخشی از وام را برداشت کنید. البته باید دقت کنید که همچنان در محدوده مجاز ضریب وثیقه (Collateral Factor) باقی بمانید.
تابع invoke()
در Bulker
در سیستم Bulker، عملکرد تابع invoke
با آنچه در multicall های سنتی میبینیم تفاوت دارد. برخلاف multicall که یک لیست از داده های دلخواه (arbitrary calldata) را دریافت میکند، تابع invoke
تنها دو آرگومان میپذیرد:
-
یک لیست از «اکشن ها» (Actions) – که فقط شامل ۶ نوع مشخص هستند
-
آرگومان هایی که به این اکشن ها داده میشوند
در واقع، بهجای فراخوانی دلخواه توابع مختلف، تنها میتوان از اکشن های از پیش تعیینشده ای استفاده کرد که در ادامه معرفی میکنیم:
اکشن های قابل استفاده در تابع invoke
-
سپرده گذاری توکن ERC-20 (ACTION_SUPPLY_ASSET): با استفاده از این گزینه، میتوانید توکن هایی مثل LINK یا USDC را وارد پلتفرم کنید.
- سپرده گذاری مستقیم ETH (ACTION_SUPPLY_NATIVE_TOKEN): اگر قصد دارید اتر (ETH) را مستقیماً ارسال کنید، این گزینه را انتخاب کنید.
- انتقال دارایی بین حسابها (ACTION_TRANSFER_ASSET): این اکشن امکان انتقال توکن را فراهم میکند. Compound V3 مانند یک توکن ERC-20 با مکانیزم تغییر موجودی (rebasing) عمل میکند. برای درک بهتر این موضوع، مقاله ما درباره نحوه رفتار Compound V3 بهعنوان یک توکن ERC-20 با قابلیت تغییر موجودی را مطالعه کنید.
-
برداشت توکن ERC-20 (ACTION_WITHDRAW_ASSET): شما میتوانید توکن هایی را که قبلاً سپرده گذاری کردهاید، به راحتی برداشت کنید.
-
برداشت ETH (ACTION_WITHDRAW_NATIVE_TOKEN): اگر ETH را به عنوان وثیقه وارد کردهاید، میتوانید از این طریق آن را خارج کنید.
- دریافت پاداش COMP (ACTION_CLAIM_REWARD): این گزینه توابع داخلی قرارداد پاداش را فراخوانی میکند، نه قرارداد اصلی وام دهی (یعنی
Comet.sol
). تابعی که در پس زمینه این عملیات اجرا میشودclaimReward
نام دارد و مستقیماً با قرارداد پاداش در ارتباط است.
نحوه عملکرد تابع invoke
تابع invoke
بهصورت ترتیبی از روی لیست اکشن ها عبور میکند و برای هر مورد، یکی از دو قرارداد زیر را فراخوانی میکند: یا Comet
(قرارداد اصلی وامدهی) یا قرارداد پاداش (Rewards Contract). آرگومان هایی که به این اکشن ها داده شدهاند نیز مستقیماً به همان توابع منتقل میشوند.
اگرچه از نظر فنی میشد این منطق را مستقیماً وارد قرارداد اصلی کرد تا مصرف گس کاهش پیدا کند، اما چنین کاری ایمن نبود. بهویژه استفاده از msg.value
درون یک حلقه، زمانی که delegatecall درگیر است، میتواند بسیار خطرناک باشد.
تیم Compound با دقت تمام اطمینان حاصل کرده که مقدار msg.value
در هر اکشن بهدرستی مصرف شود و مجدداً قابل استفاده نباشد. اگر این کار انجام نمیشد، امکان سوء استفاده و خرج دوباره وجود داشت. برای جزئیات بیشتر به باکس های زردرنگ موجود در اسناد مراجعه کنید.
نکته دیگری که مطرح میشود این است که میشد ساختار اکشن ها را از نظر گس بهینهتر طراحی کرد. برای مثال، به جای استفاده از رشته های ASCII با طول ۳۲ بایت به عنوان شناسه اکشن، میتوانستند از یک عدد تک بایتی استفاده کنند که هزینه کمتری دارد. البته، در طراحی اولیه احتمالاً خوانایی و انعطاف بیشتر مد نظر بوده است.
Bulkers ها Non-Custodial هستند
یکی از ویژگیهای مهم Bulker در Compound V3 این است که بههیچوجه دارایی های کاربر را نگه نمیدارد. Bulker بهصورت non-custodial عمل میکند؛ یعنی هیچگاه کنترل مستقیم روی توکن های کاربران ندارد.
در عوض، کاربر به Bulker اجازه (Approval) میدهد تا به نمایندگی از او دارایی ها را به قرارداد Compound منتقل کند. در این فرایند، خود Bulker مالک توکن ها نمیشود، بلکه صرفاً نقش یک واسطه اجرایی دارد.
از سوی دیگر، قرارداد Compound بهدرستی طراحی شده تا فرض نکند msg.sender
همان سپرده گذار (Depositor) است. این تصمیم کاملاً آگاهانه اتخاذ شده، چون وابسته کردن منطق به msg.sender
یک الگوی طراحی نامناسب است. چرا که این کار مانع از آن میشود که قراردادهای دیگر بتوانند به نمایندگی از کاربران عمل کنند.
چنین معماری به افزایش composability کمک میکند؛ قابلیتی که نقش مهمی در توسعه ساختارهای ماژولار و قابل ترکیب در دیفای دارد. در واقع، بدون این ویژگی، ساخت سیستم های پیچیده بسیار دشوار خواهد بود.
بازیابی توکن های گیر افتاده
در شرایطی که کاربران بهاشتباه توکن هایی را مستقیماً به آدرس Bulker ارسال کنند، یک مکانیزم برای نجات (Rescue) این توکن ها در نظر گرفته شده است. در چنین مواقعی، ادمین (مدیر قرارداد) میتواند این دارایی های اشتباهی را از Bulker خارج کند.
نکته مهم اینجاست که دو تابع مجزا برای این کار طراحی شدهاند:
-
یکی مخصوص بازیابی ETH گیر افتاده
-
دیگری برای بازیابی توکن های استاندارد ERC-20
این جداسازی باعث میشود فرآیند بازیابی دقیقتر و ایمنتر انجام شود، زیرا مدیریت ETH و توکن های ERC-20 در سطح قرارداد هوشمند، رفتارهای متفاوتی دارد. با این طراحی، تیم Compound اطمینان حاصل کرده که خطاهای احتمالی کاربران، منجر به از دست رفتن همیشگی دارایی ها نشود.
مدیریت توکن های غیر استاندارد ERC-20
یکی از رایجترین انحرافها از استاندارد ERC-20، عدم بازگرداندن مقدار بولی (Boolean) در زمان اجرای توابع کلیدی مانند transfer
یا approve
است. برخی از توکن های ERC-20 بهجای آنکه در صورت موفقیت یا شکست مقدار true یا false را برگردانند، در صورت شکست مستقیماً revert میکنند و هیچ مقدار بازگشتی ارائه نمیدهند.
برای مدیریت این دو حالت متفاوت، تیم Compound کدی طراحی کرده که بتواند با هر دو نوع توکن بهدرستی تعامل داشته باشد:
قرارداد Compound از یک اینترفیس به نام IERC20NonStandard
استفاده میکند. این اینترفیس تابعی بازگشتی تعریف نمیکند، بنابراین در زمان فراخوانی، اگر توکن واقعاً غیر استاندارد باشد و شکست بخورد، بهسادگی revert خواهد کرد.
اما برای تشخیص اینکه آیا توکن از استاندارد ERC-20 پیروی میکند یا نه، باید داده بازگشتی بررسی شود. اگر اندازه این داده ۳۲ بایت باشد، یعنی توکن سعی کرده یک مقدار بازگرداند. در این حالت، اگر مقدار برابر با ۱ یا true باشد، عملیات با موفقیت انجام شده است. در غیر این صورت، شکست تلقی میشود. تمام این حالتها در ماتریس زیر نمایش داده شدهاند:
اینترفیس IERC20NonStandard برای توکن هایی طراحی شده که هنگام اجرای توابع خود، هیچ مقدار بولی باز نمیگردانند. این رفتار برخلاف استاندارد رایج ERC-20 است. با تعریف چنین اینترفیس مستقلی، کدهای مرتبط با مدیریت این توکن ها خواناتر و ایمنتر میشوند، بدون اینکه رفتار سایر بخشها دچار اختلال شود.
اگر هنوز در ابتدای مسیر یادگیری قرار دارید، نگران نباشید. مفاهیم دیفای و قراردادهای هوشمند ممکن است در نگاه اول دشوار به نظر برسند. با این حال، اگر پایهای قوی در برنامه نویسی داشته باشید، میتوانید بهتدریج وارد این حوزه شوید. اگر هنوز نمیدانید از کدام زبان برنامه نویسی باید شروع کنید، نگران نباشید. ما یک راهنمای جامع برای افراد کاملاً مبتدی آماده کردهایم که به شما کمک میکند گام به گام وارد دنیای کدنویسی شوید.
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۳۱ تیر ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++C
- ADO.NET
- Adobe Flash
- Ajax
- AngularJS
- apache
- ARM
- Asp.Net
- ASP.NET MVC
- AVR
- Bootstrap
- CCNA
- CCNP
- CMD
- CSS
- Dreameaver
- EntityFramework
- HTML
- IOS
- jquery
- Linq
- Mysql
- Oracle
- PHP
- PHPMyAdmin
- Rational Rose
- silver light
- SQL Server
- Stimulsoft Reports
- Telerik
- UML
- VB.NET&VB6
- WPF
- Xml
- آموزش های پروژه محور
- اتوکد
- الگوریتم تقریبی
- امنیت
- اندروید
- اندروید استودیو
- بک ترک
- بیسیک فور اندروید
- پایتون
- جاوا
- جاوا اسکریپت
- جوملا
- دلفی
- دوره آموزش Go
- دوره های رایگان پیشنهادی
- زامارین
- سئو
- ساخت CMS
- سی شارپ
- شبکه و مجازی سازی
- طراحی الگوریتم
- طراحی بازی
- طراحی وب
- فتوشاپ
- فریم ورک codeigniter
- فلاتر
- کانستراکت
- کریستال ریپورت
- لاراول
- معماری کامپیوتر
- مهندسی اینترنت
- هوش مصنوعی
- یونیتی
- کتاب های آموزشی
- Android
- ASP.NET
- AVR
- LINQ
- php
- Workflow
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس