آموزش bulkers در Compound V3

در نسخه سوم پروتکل Compound، قراردادهای Bulker عملکردی مشابه multicall دارند. این قراردادها به شما اجازه می دهند چند عملیات مختلف را در قالب یک تراکنش ترکیب و اجرا کنید.

برای مثال، فرض کنید می‌خواهید اتر (Ether)، لینک (LINK) و بیت کوین رپ شده (wBTC) را به عنوان وثیقه وارد سیستم کنید. در همین تراکنش، قصد دارید معادل آن USDC وام بگیرید. با استفاده از Bulker، می‌توانید تمام این اقدامات را به صورت یکجا انجام دهید.

همچنین می‌توانید در یک تراکنش، بخشی از وثیقه را کاهش دهید و همزمان بخشی از وام را برداشت کنید. البته باید دقت کنید که همچنان در محدوده مجاز ضریب وثیقه (Collateral Factor) باقی بمانید.

مثال کاربردی Bulker در Compound V3

تابع invoke() در Bulker

در سیستم Bulker، عملکرد تابع invoke با آنچه در multicall های سنتی می‌بینیم تفاوت دارد. برخلاف multicall که یک لیست از داده های دلخواه (arbitrary calldata) را دریافت می‌کند، تابع invoke تنها دو آرگومان می‌پذیرد:

  1. یک لیست از «اکشن ها» (Actions) – که فقط شامل ۶ نوع مشخص هستند

  2. آرگومان هایی که به این اکشن ها داده می‌شوند

در واقع، به‌جای فراخوانی دلخواه توابع مختلف، تنها می‌توان از اکشن های از پیش تعیین‌شده ای استفاده کرد که در ادامه معرفی می‌کنیم:

اکشن های قابل استفاده در تابع 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

تابع 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 اطمینان حاصل کرده که خطاهای احتمالی کاربران، منجر به از دست رفتن همیشگی دارایی ها نشود.

تابع sweepToken

مدیریت توکن های غیر استاندارد ERC-20

یکی از رایج‌ترین انحراف‌ها از استاندارد ERC-20، عدم بازگرداندن مقدار بولی (Boolean) در زمان اجرای توابع کلیدی مانند transfer یا approve است. برخی از توکن های ERC-20 به‌جای آن‌که در صورت موفقیت یا شکست مقدار true یا false را برگردانند، در صورت شکست مستقیماً revert می‌کنند و هیچ مقدار بازگشتی ارائه نمی‌دهند.

برای مدیریت این دو حالت متفاوت، تیم Compound کدی طراحی کرده که بتواند با هر دو نوع توکن به‌درستی تعامل داشته باشد:

مدیریت توکن‌های غیر استاندارد erc20

قرارداد Compound از یک اینترفیس به نام IERC20NonStandard استفاده می‌کند. این اینترفیس تابعی بازگشتی تعریف نمی‌کند، بنابراین در زمان فراخوانی، اگر توکن واقعاً غیر استاندارد باشد و شکست بخورد، به‌سادگی revert خواهد کرد.

اما برای تشخیص اینکه آیا توکن از استاندارد ERC-20 پیروی می‌کند یا نه، باید داده بازگشتی بررسی شود. اگر اندازه این داده ۳۲ بایت باشد، یعنی توکن سعی کرده یک مقدار بازگرداند. در این حالت، اگر مقدار برابر با ۱ یا true باشد، عملیات با موفقیت انجام شده است. در غیر این صورت، شکست تلقی می‌شود. تمام این حالت‌ها در ماتریس زیر نمایش داده شده‌اند:

تصویری از ماتریس سناریوهای مختلف

اینترفیس IERC20NonStandard برای توکن هایی طراحی شده که هنگام اجرای توابع خود، هیچ مقدار بولی باز نمی‌گردانند. این رفتار برخلاف استاندارد رایج ERC-20 است. با تعریف چنین اینترفیس مستقلی، کدهای مرتبط با مدیریت این توکن ها خواناتر و ایمن‌تر می‌شوند، بدون اینکه رفتار سایر بخش‌ها دچار اختلال شود.

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

5/5 - (1 امتیاز)

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

آموزش انیمیشن‌ سازی دو بعدی با موهو – خلق انیمیشن‌ های خلاقانه شبیه دیرین دیرین
  • انتشار: ۳۱ تیر ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

بازخوردهای خود را برای ما ارسال کنید