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

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

دامنه این صفحه

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

مقدمه

همان‌طور که از نام آن مشخص است وظیفه اصلی قرارداد هوشمند انباشتن کارمزد ثبات 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 باشد، این عدد دقت از دو رقم اعشار را مشخص می‌کند و مقدار دهدهی معمولی ۲٫۱ به‌صورت ۲۱۰ نمایش داده می‌شود؛ rpow(210, 2, 100) مقدار 441 را برمی‌گرداند (نمایش دهدهی دو رقمی نقطه‌ثابت از 2^2.1 = 4.41 است). در اجرای فعلی،27^10 برای b ارسال می‌شود که x و نتیجه rpow هر دو از نوع ray مقداری ثابت است. نمایش rpow شامل عملیات بدون سرریز است که در راستای محدودیت‌های مصرف گاز است.

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

راه‌اندازی ILK

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

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

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

Footnotes

  1. Jug