پرش به مطلب اصلی

قرارداد انباشتن کارمزد ثبات

مقدمه

همانطور که از نام آن مشخص است وظیفه اصلی قرارداد هوشمند انباشتن کارمزد ثبات 1 جمع‌اوری کارمزدهای ثبات برای یک نوع وثیقه مشخص است و با متد drip فراخوانی می‌شود. این کار به طور موثری بدهی تجمعی را برای تمام صندوق‌های آن نوع وثیقه، بدهی تجمعی کلی که توسط قرارداد مدیریت صندوق‌ها (سراسری) پیگیری می‌شود و میزان سودهای زر (به عنوان مقدار زر متعلق به قرارداد ترازنامه مالی نشان داده شده) را به‌روز می‌کند.

جزئیات قرارداد

ساختارها

  • Ilk: دارای دو مقدار uint256 است که عبارتند از duty که کارمزد ریسک مخصوص وثیقه را نشان می‌دهد و rho که زمان‌ آخرین به‌روزرسانی کارمزد است.
  • VatLike: قرارداد ماک شده برای امکان فراخوانی رابط‌های Vat بدون وابستگی صریح به خود قرارداد Vat

ساختار ذخیره‌سازی

  • wards: یک نگاشت (mapping: address => uint) که نشان می‌دهد کدام آدرس‌ها می‌توانند توابع مدیریتی را فراخوانی کنند
  • ilks: یک نگاشت mapping(bytes32 => Ilk) که یک ساختار Ilk برای هر نوع وثیقه ذخیره می‌کند
  • vat: یک VatLike که به قرارداد Vat سیستم اشاره می‌کند
  • vow: آدرس قرارداد ترازنامه مالی
  • base: یک داده از نوع uint256 که یک کارمزد را برای تمام انواع وثیقه مشخص می‌کند.

متدهای عمومی

متدهای مدیریتی

در این متدها نیاز است wards[msg.sender] == 1 چک شود (به عبارت دیگر، تنها کاربران مجاز می‌توانند آنها را فراخوانی کنند).

  • rely/deny: اضافه یا حذف کاربران مجاز (توسط تغییرات در نگاشت wards)
  • init: شروع جمع‌آوری کارمزد ثبات برای یک نوع وثیقه مشخص
  • file: تنظیم duty برای یک نوع مشخص از وثیقه
  • file: تنظیم مقدار پایه
  • file: تنظیم مقدار vow

متدهای جمع‌آوری کارمزد

  • drip: جمع‌آوری کارمزد ثبات برای یک نوع مشخص از وثیقه

مکانیسم‌ها و مفاهیم کلیدی

تابع drip

  • drip برای جمع‌آوری کارمزد ثبات برای یک نوع مشخص از وثیقه عمل می‌کند (توجه داشته باشید که این یک تابع عمومی است و ممکن است توسط هر کسی فراخوانی شود). تابع drip بطور کلی سه کار انجام می‌دهد:
  1. محاسبه تغییر در پارامتر نرخ برای نوع وثیقه مشخص شده توسط ilk بر اساس زمان گذشته شده از آخرین به‌روزرسانی و نرخ فعلی فوری (base + duty).
  2. فراخوانی Vat.fold برای به‌روزرسانی نرخ وثیقه، بدهی کل ردگیری شده و سربار قرارداد ترازنامه مالی
  3. به‌روزرسانی ilks[ilk].rho برای به‌روزرسانی زمان‌ فعلی.
  • تغییر در نرخ به‌صورت زیر محاسبه می‌شود:

new rate - old rate = [(base + duty)^(now-rho)]* rate - rate

که now زمان فعلی، rate نرخ Vat.ilks[ilk].rate است، مقدار base‍ برابر Jug.base، مقدار rho برابر Jug.ilks[ilk].rho و duty مقدار Jug.ilks[ilk].duty است. اگر هر کدام از محاسبات منجر به کم‌تر یا بیش‌تر شدن شود، تابع revert‍ می‌شود. برای جزئیات بیشتر، قرارداد Vat را ببینید.

تابع rpow

  • rpow(uint x, uint n, uint b) برای عمل توان‌رسانی در drip استفاده می‌شود، یک تابع محاسبات از نقطه‌ثابت است که x را به توان n می‌رساند. این تابع در سالیدیتی به‌صورت مربع کردن تکراری پیاده‌سازی شده است. مقدار x و مقدار برگردانده‌شده باید به‌صورت اعداد صحیح نقطه‌ثابت با ضریب مقیاس b تفسیر شوند. برای مثال، اگر b = 100 باشد، این عدد دقت از دو رقم اعشار را مشخص می‌کند و مقدار دهدهی معمولی 2.1 به‌صورت 210 نمایش داده می‌شود؛ rpow(210, 2, 100) مقدار 441 را برمی‌گرداند (نمایش دهدهی دو رقمی نقطه‌ثابت از 2^2.1 = 4.41 است). در اجرای فعلی،27^10 برای b ارسال می‌شود که x و نتیجه rpow هر دو از نوع ray مقداری ثابت است. نمایش rpow شامل عملیات بدون سرریز است که در راستای محدودیت‌های مصرف گاز است.

نکات پیاده‌سازی و امنیتی

راه‌اندازی ILK

  • تابع init(bytes32 ilk) باید زمانی فراخوانی شود که یک وثیقه جدید اضافه می‌شود (تنظیم duty از طریق file کافی نیست). در غیر این صورت rho برای اولین بار به کار نخواهد رفت و کارمزد بر اساس تاریخ شروع 1 ژانویه 1970 (شروع دوره یونیکس) در نظر گرفته می‌شود.

عدم توازن base + Ilk.duty در drip

  • فراخوانی drip(bytes32 ilk) نرخ پایه را به نرخ Ilk.duty اضافه خواهد کرد. این نرخ یک نرخ محاسبه‌شده ترکیبی است. به این معنی که rate(base + duty) != rate(base) + rate(duty). یعنی اگر base تنظیم شود، duty به صورت یک عامل ترکیبی در base محاسبه می‌شود. به‌روزرسانی‌های ارزش پایه همچنین نیازمند به به‌روزرسانی‌های همه انواع ilks می‌باشد.

1 Jug