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

مقدمه

قرارداد مدیریت صندوق‌ها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 همیشه می‌تواند توسط صاحبش به هر آدرسی منتقل شود

زر

  • زر فقط با رضایت صاحبش می‌تواند منتقل شود.
  • زر همیشه می‌تواند توسط صاحبش به هر آدرسی منتقل شود.

مکانیسم‌ و مفاهیم

حالت اصلی صندوق، زر و وثیقه در مدیریت صندوق‌ها نگهداری می‌شود. قرارداد مدیریت صندوق‌ها وابستگی خارجی ندارد و اصول اصلی "نسبت‌های حسابداری" زر را حفظ می‌کند. اصول اصلی که بر روی مدیریت صندوق‌ها اعمال می‌شوند به شرح زیر است: زر نمی‌تواند بدون وثیقه وجود داشته باشد:

  1. Ilk نوع مشخصی از وثیقه است:
  • وثیقه gem به کاربران با slip اختصاص داده می‌شود.
  • وثیقه gem با flux بین کاربران انتقال داده می‌شود.
  1. ساختار داده صندوق، urn است و شامل موارد زیر می‌شود:
  • ink - وثیقه قفل‌شده
  • art - بدهی نرمال‌شده قفل شده
  1. به همین ترتیب، یک وثیقه یک 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