مقدمه
قرارداد مدیریت صندوقها1 هسته اصلی سیستم توکن زر است. این قرارداد صندوق ها 2 را نگهداری میکند و تمام موجودیهای مرتبط زر و وثیقه را پیگیری میکند. همچنین قوانینی را تعریف میکند که با آنها میتوان صندوقها و موجودیها را تغییر داد. قوانین تعریف شده در قرارداد مدیریت صندوقها تغییرپذیر نیستند، بنابراین میتوان قوانین موجود در مدیریت صندوقها را به عنوان قانون اصلی سیستم توکن زر در نظر گرفت.
جزئیات قرارداد
توابع و اصطلاحات اصلی
gem
: توکن وثیقهzar
: توکن ریالی زربانilks
: یک مپینگ از انواعIlk
Ilk
: نوع وثیقه شاملArt
: کل بدهی نرمالشدهی زرrate
: ضریب بدهی زر ( تجمیع شده از کارمزدهای ثبات پروتکل)spot
: قیمت ضمانتشده با وثیقه؛ به عبارت دیگر حداکثر استیبل کوین مجاز برای هر واحد وثیقهline
: سقف بدهی برای یک نوع مشخص از وثیقهdust
: کف بدهی برای یک نوع مشخص از وثیقه
urns
: یک نگاشت از انواع صندوقهاUrn
: یک صندوق مشخص شامل دادههایink
: موجودی وثیقهart
: بدهی نرمالشدهی استیبل کوین خارجشده
sin
: مقدار زر بیپشتوانه (بدهی سیستم، مقداری که متعلق به هیچ urnی نیست)init
: ایجاد یک نوع وثیقه جدیدslip
: اصلاح موجودی وثیقه یک کاربرflux
: انتقال وثیقه بین کاربرانmove
: انتقال وثیقه بین کاربرانgrab
: تسویه کردن یک صندوقheal
: ایجاد و از بین بردن مقادیر مساوی زر و بدهی سیستم (با استفاده ازvice
)fold
: اصلاح ضریب بدهی، ایجاد و از بین بردن بدهی متناظرsuck
: تولید زر بیپشتوانه (با استفاده ازvice
)Line
: کل سقف بدهی برای همه انواع وثیقهfrob
: اصلاح یک صندوقlock
: انتقال وثیقه به یک صندوقfree
: انتقال وثیقه از یک صندوقdraw
: افزایش بدهی صندوق، ایجاد زرwipe
: کاهش بدهی صندوق، از بین بردن زرdink
: تغییر در وثیقهdart
: تغییر در بدهی
fork
: تقسیم کردن یک صندوق به دو روش تأیید دوتایی یا تقسیم/ادغام صندوقهاdink
: مقدار وثیقه برای تبادلdart
: مقدار بدهی زر برای تبادل
wish
: بررسی اینکه یک آدرس مجاز به اصلاح موجودی gem یا زر دیگری است یا خیرhope
: فعال کردنwish
برای یک جفت از آدرسهاnope
: غیرفعال کردنwish
برای یک جفت از آدرسها
توجه: art
و Art
نشان دهنده بدهی نرمالشده هستند، به عبارت دیگر یک مقدار است که وقتی با ضریب درست ضرب شود، بدهی کنونی و بهروز شدهی زر را میدهد.
حسابداری
debt
بدهی مجموع تمام زر است (مجموع مقدار کل زر صادر شده)vice
مجموع تمامsin
است (مجموع مقدار بدهی سیستم)Ilk.Art
مجموع همهart
درurn
ها برای آنIlk
استdebt
بدهیvice
به علاوه مجموعIlk.Art * Ilk.rate
در همهilks
است
وثیقه
gem
همیشه میتواند توسط صاحبش به هر آدرسی منتقل شود
زر
- زر فقط با رضایت صاحبش میتواند منتقل شود.
- زر همیشه میتواند توسط صاحبش به هر آدرسی منتقل شود.
مکانیسم و مفاهیم
حالت اصلی صندوق، زر و وثیقه در مدیریت صندوقها نگهداری میشود. قرارداد مدیریت صندوقها وابستگی خارجی ندارد و اصول اصلی "نسبتهای حسابداری" زر را حفظ میکند. اصول اصلی که بر روی مدیریت صندوقها اعمال میشوند به شرح زیر است: زر نمیتواند بدون وثیقه وجود داشته باشد:
Ilk
نوع مشخصی از وثیقه است:
- وثیقه
gem
به کاربران باslip
اختصاص داده میشود. - وثیقه
gem
باflux
بین کاربران انتقال داده میشود.
- ساختار داده صندوق،
urn
است و شامل موارد زیر میشود:
ink
- وثیقه قفلشدهart
- بدهی نرمالشده قفل شده
- به همین ترتیب، یک وثیقه یک
Ilk
است و شامل موارد زیر میشود:
Art
- بدهی نرمالشده قفلشدهrate
- ضریب مقیاس بدهی (در ادامه توضیح داده خواهد شد)spot
- قیمت با حاشیه امنیتline
- سقف بدهیdust
- کف بدهی
مدیریت صندوق
- صندوقها از طریق
frob(i, u, v, w, dink, dart)
مدیریت میشوند که بر اساس آن صندوق کاربرu
را به این صورت تغییر میدهد که ازgem
کاربرv
استفاده میکند و زر را برای کاربرw
ایجاد میکند. - صندوقها از طریق
grab(i، u، v، w، dink، dart)
مصادره میشوند که طی آن صندوق کاربرu
مقدارgem
را به کاربرv
میدهد وsin
را برای کاربرw
ایجاد میکند.grab
در واقع تابعی است که وقتی صندوقها تسویه میشوند، بدهی را از صندوق به موجودیsin
یک کاربر منتقل میکند. - تابع
Sin
بدهی "تصرف شده" یا "بد" را نشان میدهد و با استفاده ازheal(uint rad)
میتواند با مقدار مساویی از زر تسویه شود.
توجه: تنها
Vow
همیشه
sin
را خواهد داشت، بنابراین تنها
Vow
موفق به فراخوانی
heal
خواهد شد. دلیل آن این است که هرگاه
grab
و suck
فراخوانی شوند، آدرس
Vow
به عنوان گیرنده
sin
گذاشته میشود. توجه داشته باشید که این مطلب بستگی به طراحی و اجرای سیستم دارد.
توجه:
heal
فقط با عدد مثبت
(uint
)
فراخوانی میشود و
zar[u]
را همراه با کم کردن
sin
کم میکند.
- مقدار
زر
میتواند بین کاربران با
move
انتقال داده شود.
بهروزرسانی نرخ از طریق fold(bytes32 ilk، address u، int rate)
مقدار نرخ (
rate
) یک
Ilk
ضریب تبدیل بین هر بدهی نرمالشده (
art
) پرداخت شده و ارزش فعلی آن بدهی با کارمزدهای تعلق گرفته است. پارامتر نرخ در
fold
در واقع تفاوت مقدار
Ilk.rate
یا همان تفاوت فاکتورهای مقیاسی (جدید - قدیم) است. مقدار آن یک عدد صحیح است و بنابراین مقادیر حساب کنونی ممکن است افزایش یا کاهش یابد. مقدار
Ilk.Art*rate
به موجودی زر آدرس
u
اضافه میشود (و در واقع نشاندهنده افزایش یا کاهش مازاد سیستم است). موجودی بدهی همه صندوقهای سرمایهگذاریشده با یک
Ilk
مشخص، به طور ضمنی از طریق اضافه کردن
rate
به
Ilk.rate
بهروزرسانی میشود.
نکات
روشهای موجود در مدیریت صندوقها تا حد ممکن عام نوشته شدهاند و بنابراین دارای مجموعهای از رابطهای کاربری هستند که ممکن است پیچیده و یا شامل کدهای طولانی باشند. باید توجه کنید که ترتیب پارامترها را اشتباه نکرده باشید. هر ماژولی که دارای دسترسی مجاز به مدیریت صندوقها داشته باشد، در واقع دسترسی کامل دارد، و با رعایت نکردن این نکته ممکن است تمامی وثیقه موجود در سیستم به سرقت برده شود. این به این معنی است که اضافه شدن یک نوع جدید وثیقه (و اداپتور مربوطه) با ریسک قابل توجهی همراه است.
حالات منجر به شکست
خطا در برنامهنویسی
یک باگ در مدیریت صندوقها ممکن است منجر به نتایج سنگینی شود. حتی ممکن است منجر به از دست رفتن (یا قفل شدن) تمام زر و وثیقه سیستم شود. در برخی موارد، امکان اصلاح صندوقها یا انتقال زر ممکن است از بین برود. ممکن است حراجیها متوقف شوند و یا حتی خاموشی اضطراری شکست خورد. بنابراین باید برنامه نویسی این بخش از کد با دقت فراوان و با امنیت کافی باشد.
تغذیه اوراکلها
قرارداد مدیریت صندوقها بر روی یک مجموعه از اوراکلهای قابل اعتماد برای ارائه دادههای قیمت استوار است. در صورتی که این فیدهای قیمت شکست خورده باشند، امکان دارد زر بیپشتوانه تولید شود، یا صندوقهای ایمن ممکن است به طور نادرست تسویه شوند.
آداپتورها
قرارداد مدیریت صندوقها به قراردادهای آداپتور خارجی وابسته است تا اطمینان حاصل شود که موجودیهای وثیقه در مدیریت صندوقها نشاندهنده موجودیهای واقعی وثیقه خارجی هستند. قراردادهای آداپتور مجاز به انجام تغییرات دلخواه در تمامی موجودیهای وثیقه هستند. یک آداپتور وثیقه خراب میتواند منجر به از دست رفتن تمام موجودی در سیستم شود.
1 Vat
2 Vaults