قرارداد انباشتن کارمزد ثبات
مقدمه
همانطور که از نام آن مشخص است وظیفه اصلی قرارداد هوشمند انباشتن کارمزد ثبات 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