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

قرارداد الحاق

⁠⁠⁠⁠⁠⁠⁠

مقدمه

الحاق1 از سه قرارداد هوشمند زیر تشکیل شده است:

  • GemJoin: امکان واریز توکن‌های استاندارد ERC20 برای استفاده در سیستم را فراهم می‌کند.
  • ETHJoin: امکان استفاده از اتر در سیستم را فراهم می‌کند.
  • ZarJoin: امکان برداشتن زر از سیستم به صورت یک توکن استاندارد ERC20 را فراهم می‌کند.

هر قرارداد الحاق به‌طور خاص برای الحاق شدن توکن مربوطه به ‍قرارداد مدیریت صندوق‌ها ایجاد شده است. به همین دلیل، هر قرارداد الحاق سعی دارد با منطقی تقریبا مشابه، برای انواع مختلف توکن‌ها در سیستم کار کند.

جزئیات قرارداد:

  • vat - ذخیره آدرس Vat
  • ilk - شناسه Ilk که یک GemJoin برای آن ایجاد می‌شود
  • gem - آدرس ilk برای انتقال
  • zar - آدرس توکن زر
  • one - یک مقدار ثابت از نوع uint و برابر مقدار 10^27 که برای انجام محاسبات در ZarJoin استفاده می‌شود
  • live - یک پرچم دسترسی برای اداپتور الحاق
  • dec - رقم اعشار استفاده شده برای آن Gem‍

هر قرارداد الحاق دارای 4 تابع عمومی است: یک سازنده، join، exit و cage. سازنده در زمان مقداردهی اولیه قرارداد استفاده می‌شود و متغیرهای اصلی آن را تنظیم می‌کند. همانطور که از نامشان مشخص است، توابع Join و exit برای اضافه شدن و خروج استفاده می‌شوند. الحاق مکانیسمی را برای کاربران فراهم می‌کند تا نوع توکن مورد نظر را به قرارداد مدیریت صندوق‌ها اضافه کنند. منطق هر نسخه کمی متفاوت است، اما به طور کلی به انتقال و فراخوانی تابع در قرارداد مدیریت صندوق‌ها منجر می‌شود. تابع Exit با منطق مشابه عمل می‌کند، اما به جای اضافه شدن، به کاربر این اجازه را می‌دهد توکن مورد نظر خود را از قرارداد مدیریت صندوق‌ها حذف کند. تابع Cage اجازه می‌دهد تا اداپتور خالی شود (اجازه می‌دهد تا توکن‌ها از صندوق خارج شوند اما نمی‌توانند اضافه شوند).

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

قرارداد ‍GemJoin هدف مشخصی دارد که به طور نسبی از سایر قراردادهای هوشمند هسته جدا شده است. هنگامی که کاربر می‌خواهد به سیستم وارد شده و با قراردادهای سیستم توکن زر تعامل کند، باید از یکی از قراردادهای الحاق استفاده کند. پس از اتمام کار با این قراردادها، باید exit را فراخوانی کند تا از سیستم خارج شود و توکن‌های خود را بیرون بیاورد. هنگامی که GemJoin توسط یک آدرس مجاز caged شود، می‌تواند ارز را از قرارداد مدیریت صندوق‌ها خارج کند اما دیگر نمی‌تواند ارز جدیدی وارد کند.

موجودی کیف پول کاربر برای توکن‌های وثیقه که از طریق الحاق به سیستم اضافه شده‌اند، در ‍vat به عنوان Gem (بر اساس نوع وثیقه Ilk ) در نظر گرفته می‌شود تا زمانی که به توکن‌های وثیقه قفل شده (ink) تبدیل شوند که در این صورت کاربر می‌تواند زر را از حساب خود خارج کند.

قرارداد ZarJoin نیز هدف مشابهی دارد. وظیفه آن مدیریت مبادله های زر و Zar ERC-20 است که به ترتیب در ‍قرارداد مدیریت صندوق‌ها و Zar.sol پیگیری می‌شوند. پس از این که یک کاربر زر را در عوض وثیقه‌اش از حساب خارج کند، یک موجودی در Vat.dai‍ خواهد داشت. از آنجایی که ZarJoin موجودی Vat.dai را دارد و می‌تواند Zar ERC-20 را mint کند، این موجودی زر را می‌توان با استفاده از قرارداد ZarJoin‍ از Vat.dai خارج کرد. هنگامی که یک کاربر می‌خواهد زر خود را به سیستم حسابداری ‍Vat بازگرداند (برای پرداخت بدهی، شرکت در حراجی‌ها، باگ‌های متد End و غیره)، باید ZarJoin.join را فراخوانی کند. با فراخوانی ZarJoin.join ، تابع burn به صورت موثری بر روی Zar ERC-20 انجام می‌شود و موجودی Vat.zar از موجودی ZarJoin به حساب کاربر (در قرارداد مدیریت صندوق‌ها) منتقل می‌شود. در حالت معمولی سیستم، موجودی کل زر باید معادل موجودی Vat.zar(ZarJoin) باشد. هنگامی که قرارداد ZarJoin توسط یک آدرس مجاز مقداری برای cage می‌گیرد، می‌تواند زر را به Vat‍ بازگرداند. اما دیگر نمی‌تواند زر را از قرارداد مدیریت صندوق‌ها خارج کند.

نکات مهم ( خطاهای احتمالی کاربر)

خطای اصلی که یک کاربر در کار با قرارداد الحاق دارد این است که کاربران هیچ‌وقت نباید توکن‌ها را به صورت مستقیم به قراردادها انتقال دهند، بلکه باید از توابع الحاق استفاده کنند وگرنه قادر به بازیابی توکن‌های خود نخواهند بود. به دلیل کارکرد محدود سیستم، منابع محدودی برای خطاهای کاربر در سیستم قرارداد الحاق وجود دارد. فقط یک حالت اشتباه ممکن است اتفاق بیفتد و کاربر باید مراقب باشد و آن این است که کاربر به اشتباه الحاق را فراخوانی کند، بجز این حالت، کاربر همیشه می‌تواند توکن‌های خود را از طریق فراخوانی exit متناظر در قراردادالحاق مربوطه دریافت کند.

مسئله اصلی که در اینجا باید به آن دقت شود، حمله فیشینگ اصلاح شده2 است. با پیشرفت سیستم و احتمالاً ایجاد قراردادهای بیشتر الحاق یا ایجاد رابط‌های کاربری بیشتر، احتمال اینکه کاربر توکن‌های خود را از طریق یک قرارداد الحاق نامعتبر که توکن‌ها را به vat ارسال نمی‌کند، بلکه آن‌ها را به یک قرارداد یا کیف پول دیگر ارسال می‌کند، وجود دارد.

حالت‌های منجر به خطا (محدودیت‌ها عملیاتی و عوامل ریسک خارجی)

ممکن است یک ارتقاء vat وجود داشته باشد که نیازمند ایجاد قراردادهای الحاق جدید باشد. اگر یک قرارداد gem در پروسه یک ارتقاء توکن قرار گیرد یا توکن‌ها در حالی که ضمانت یک کاربر در سیستم است، فریز شوند، یک سناریوی احتمالی می‌تواند این باشد که کاربران پس از اتمام فریزشدن یا ارتقاء، قادر به بازیابی وثیقه خود نباشند. احتمالاً این سناریو کمترین ریسک را دارد زیرا توکنی که این ارتقاء را تجربه می‌کند، می‌خواهد کنار جامعه زربان کار کند تا اطمینان حاصل شود که این یک مشکل نیست.

1 Join

2 Well-executed Phishing Attack