قرارداد الحاق
مقدمه
الحاق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