قرارداد مدیریت صندوقها
این صفحه مرجع قرارداد هوشمند در سطح ذخیرهسازی و توابع است؛ مخاطب آن حسابرسی، بازبینی مستقل و کار مستقیم با قراردادهای روی زنجیره است. مسیر یکپارچهسازی سازمانی از راهنمای یکپارچهسازی سازمانی میگذرد و مستقل از این مرجع است.
مقدمه
قرارداد مدیریت صندوقها1 هست ه اصلی سیستم توکن زر است. این قرارداد صندوقها2 را نگهداری میکند و تمام موجودیهای مرتبط زر و وثیقه را پیگیری میکند. همچنین قوانینی را تعریف میکند که با آنها میتوان صندوقها و موجودیها را تغییر داد. قوانین تعریفشده در قرارداد مدیریت صندوقها تغییرپذیر نیستند، بنابراین میتوان قوانین موجود در مدیریت صندوقها را بهعنوان قانون اصلی سیستم توکن زر در نظر گرفت.
جزئیات قرارداد
توابع و اصطلاحات اصلی
gem: توکن وثیقهzar: توکن ریالی زربانilks: یک مپینگ از انواعIlkIlk: نوع وثیقه شامل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 بهروزرسانی میشود.
نکات
روشهای موجود در مدیریت صندوقها تا حد ممکن عام نوشته شدهاند و بنابراین دارای مجموعهای از رابطهای کاربری هستند که ممکن است پیچیده و یا شامل کدهای طولانی باشند. باید توجه کنید که ترتیب پارامترها را اشتباه نکرده باشید. هر ماژولی که دارای دسترسی مجاز به مدیریت صندوقها داشته باشد، در واقع دسترسی کامل دارد، و با رعایت نکردن این نکته ممکن است تمامی وثیقه موجود در سیستم به سرقت برده شود. این به این معنی است که اضافه شدن یک نوع جدید وثیقه (و اداپتور مربوطه) با ریسک قابل توجهی همراه است.
حالات منجر به شکست
خطا در برنامهنویسی
یک باگ در مدیریت صندوقها ممکن است منجر به نتایج سنگینی شود. حتی ممکن است منجر به از دست رفتن (یا قفل شدن) تمام زر و وثیقه سیستم شود. در برخی موارد، امکان اصلاح صندوقها یا انتقال زر ممکن است از بین برود. ممکن است حراجها متوقف شوند و یا حتی خاموشی اضطراری شکست خورد. بنابراین باید برنامهنویسی این بخش از کد با دقت فراوان و با امنیت کافی باشد.
تغذیه اوراکلها
قرارداد مدیریت صندوقها بر روی یک مجموعه از اوراکلهای قابل اعتماد برای ارائه دادههای قیمت استوار است. در صورتی که این فیدهای قیمت شکست خورده باشند، امکان دارد زر بیپشتوانه تولید شود، یا صندوقهای ایمن ممکن است بهطور نادرست تسویه شوند.
آداپتورها
قرارداد مدیریت صندوقها به قراردادهای آداپتور خارجی وابسته است تا اطمینان حاصل شود که موجودیهای وثیقه در مدیریت صندوقها نشاندهنده موجودیهای واقعی وثیقه خارجی هستند. قراردادهای آداپتور مجاز به انجام تغییرات دلخواه در تمامی موجودیهای وثیقه هستند. یک آداپتور وثیقه خراب میتواند منجر به از دست رفتن تمام موجودی در سیستم شود.