قرارداد انباشتن کارمزد ثبات
مقدمه
همانطور که از نام آن مشخص است وظیفه اصلی قرارداد هوشمند انباشتن کارمزد ثبات 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بطور کلی سه کار انجام میدهد:
- محاسبه تغییر در پارامتر نرخ برای نوع وثیقه مشخص شده توسط
ilkبر اساس زمان گذشته شده از آخرین بهروزرسانی و نرخ فعلی فوری(base + duty). - فراخوانی
Vat.foldبرای بهروزرسانی نرخ وثیقه، بدهی کل ردگیری شده و سربار قرارداد ترازنامه مالی - بهروزرسانی
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