قرارداد مدیر موقعیت بدهی
این صفحه مرجع قرارداد هوشمند در سطح ذخیرهسازی و توابع است؛ مخاطب آن حسابرسی، بازبینی مستقل و کار مستقیم با قراردادهای روی زنجیره است. مسیر یکپارچهسازی سازمانی از راهنمای یکپارچهسازی سازمانی میگذرد و مستقل از این مرجع است.
مقدمه
قرارداد مدیر CDP یک فرآیند رسمی برای انتقال صندوقها بهعنوان مثال در انتقال داراییها بین مالکان است. توصیه می شود که تمام تعاملات با صندوقها از طریق مدیر CDP انجام شود. پس از اینکه وثیقه باز شده به زربان سپرده شد، کاربران میتوانند از ویژگیهای زیر استفاده کنند:
- مالکیت چندگانه برای صندوقها و شناسایی (کاربران میتوانند
Nتعداد از صندوقها را داشته باشند) - قابلیت انتقال صندوقها
توجه: کاربر یک صندوق میتواند برای تعامل با مدیر CDP از طریق پروکسی اقدام کند، اما امکان استفاده مستقیم از قرارداد مدیر CDP نیز وجود دارد.
عملکردهای کلیدی
cdpAllow: اجازه/عدم اجازه به یک آدرس کاربر برای مدیریتcdpurnAllow: اجازه/عدم اجازه به یک آدرس کاربر برای تعامل باurnها برای ورود (src) یا خروج (dst)open: یک صندوق جدید برای کاربر با استفاده از نوع وثیقهilkباز میکندgive: انتقالcdpبه آدرس مقصدfrob: افزایش/کاهش مقدارinkاز وثیقه مسدود شده و افزایش/کاهش مقدارartاز بدهی درcdpبا تولید زر تولید شده یا تضمین رایگان در آدرسcdpfrob: افزایش/کاهش مقدارinkاز وثیقه مسدود شده و افزایش/کاهش مقدارartاز بدهی درcdpبا تولید زر تولید شده یا تضمین رایگان در یک آدرس مشخص آدرس مقصد. ( توضیحات این تابع را میتوانید در ادامه این مستند ببینید.)flux: انتقال مقدارwad(با دقت اعشار18) از نوع وثیقهilkازcdpبه آدرس مقصد.move: انتقال مقدارrad(با دقت اعشار45) زر ازcdpبه آدرس مقصد.quit: انتقال وثیقه مسدود شده و بدهی تولید شده ازcdpبه آدرس مقصد.
چیدمان ذخیرهسازی
vat: آدرس قرارداد هسته که صندوقها را نگه میداردcdpi: شناسه که بهصورت خودکار افزایشی است.urns: یک نگاشت از ``CDPIdبهUrnHandler`list: یک نگاشتCDPIdبهCDPIdها قبلی و بعدیowns: یک نگاشت ازCDPIdبهownerilks: یک نگاشت ازCDPIdبهIlk(نوع وثیقه)first: یک نگاشت ازownerبهFirstCDPIdlast: یک نگاشت ازownerبهLastCDPIdcount: یک نگاشت ازownerتعدادCDPهاallows: یک نگاشت تودرتو از نگاشتهای مختلف Owner => CDPId => Allowed Addr => True/Falseاست.
مفاهیم و سازوکارهای کلیدی
مدیر CDP بهعنوان راهی برای فعال کردن مبادله صندوقها ایجاد شده است تا بیشتر شبیه داراییهای قابل مبادله باشند. بدون این قرارداد، قراردادهای هسته سیستم توکن زر عملکردی برای انتقال موقعیتهای صندوق نداشتند. در کنار این ویژگی اصلی، اهداف زیر نیز با استفاده از این قرارداد قابل دسترسی هستند:
- مدیر بعد از ایجاد یک قرارداد مدیریت صندوقها آدرس آن را دریافت میکند که بهعنوان یک قرارداد واسط بین آن و کاربران عمل میکند.
- مدیر یک ثبت داخلی از نگاشتهای
mapping(id => owner)وmapping(id => urn)نگه می دارد که به مالک اجازه میدهد توابع قرارداد مدیریت صندوقها را برایurnخود از طریق مدیر اجرا کند. - مدیر یک ساختار لیست پیوندی دوگانه را نگه می دارد که امکان بازیابی همه صندوقهایی را که مالک روی بلاکچین فراخوانی کند، میدهد.
بهطور خلاصه، این همان چیزی است که
GetCdpsباید انجام دهد. این قرارداد کمکی است و میگذارد همه صندوقها را تنها با یک فراخوانی واکشی کنید.
یک کاربرد غالب مدیر CDP
- یک کاربر
openرا اجرا میکند و در ازای آن یکCDPIdدریافت میکند. - سپس،
CDPIdبا استفاده از یکurnباmanager.urns(cdpId)مرتبط میشود و سپس وثیقه را به آن الحاق میکند. - سپس کاربر میتواند
frobرا اجرا کند تا انتخاب کند که از کدام آدرس مقصد برای ارسال زر تولید شده استفاده کند. - اگر کاربر
frobرا بدون آدرس مقصد اجرا کند، زر تولید شده در آنurn Vaultباقی خواهد ماند. در این صورت، کاربر میتواند آن را در زمان دیگری منتقل کند.- توجه داشته باشید که این همان فرآیندی است که برای وثیقه اجرا میشود که پس از
frobآزاد میشود (برای تابعfrobکه به آدرس مقصد نیاز ندارد). کاربر میتواند آن را در زمان دیگری به آدرس دیگری ارسال کند.
- توجه داشته باشید که این همان فرآیندی است که برای وثیقه اجرا میشود که پس از
- در صورتی که کاربر بخواهد مدیر خود را ترک کند، میتواند از خروج بهعنوان راهی برای انتقال موقعیت صندوق خود به آدرس مقصد دیگری استفاده کند.
خطاهای احتمالی
- برای توسعه دهندگانی که می خواهند با مدیر در تعامل 1 باشند، باید بدانند که اقدامات صندوق هنوز در محیط
urnهستند. صرفنظر از اینکه مدیر میکوشد کار باurnرا پشتCDPIdانتزاعی 2 کند. این بدان معنی است که توسعه دهندگان بایدurn (urn = manager.urns(cdpId))
را دریافت کنند تا بتوان وثیقه را به آن صندوق وصل کرد.
- از آنجایی که مدیر به ازای
CDPIdیکilkخاص را اختصاص میدهد و به دیگران اجازه نمیدهد از آن برای خود استفاده کنند، تابعfluxدومی وجود دارد که یک پارامترilkرا در ورودی دارد. این تابع هدف سادهای دارد که ارتباط وثیقه ای را که به اشتباه به صندوقی فرستاده شده است و نمیتوان آن را مدیریت کرد یا در حالت کلی ناسازگار است، را قطع کند.
تابع frob
- هنگامی که شما در مدیر
CDPتابعfrobرا اجرا میکنید، زر جدیدی را در قرارداد مدیریت صندوقها از طریق مدیر CDPایجاد میکنید که سپس درurnزیر مدیریتCDPسپرده میشود. این فرآیند بستگی به این دارد که از کدام تابع frobاستفاده میکنید (دو تابعfrobوجود دارد که پارامترهای ورودی متفاوتی دارند اما عملکرد آنها یکسان است). بهطور خلاصه، یکی به آدرس مقصد مجوز لازم را میدهد و دیگری به آن نیاز ندارد. - اگر از تابع
frobکه دارای آدرس مقصد است استفاده میکنید، میتوانید هر زر تولید شده یا وثیقهای که آزاد شده است را ارسال کنید. تابع frobدوم برای گذاشتن وثیقه در آدرسurnاست، زیراurnمتعلق به مدیرCDPاست. در این مورد، شما باید بهصورت دستی از توابعfluxیاmoveبرای خارج کردن زر یا وثیقه استفاده کنید. این توابع ممکن است برای توسعهدهندهای که با عملکرد پراکسی کار میکند سودمندتر باشد، زیرا انعطافپذیری بیشتری را ممکن میسازد. بهعنوان مثال، با استفاده از این توابع میتوانید مقدار مشخصی از وثیقه را جابجا کنید و میتوانید از سایر عملکردها برای انجام آن استفاده کنید. بهطور کلی، کمک میکند نیازهای خاص توسعه دهندگان سادهتر در دسترس باشد. - همانطور که در بالا ذکر شد، قراردادهای اصلی سیستم توکن زر در اصل کارایی لازم برای انتقال موقعیتهای یک صندوق را نداشتند. از آن زمان، قراردادهای اصلی یک قابلیت انتقال بومی به نام فورک را نیز اجرا کردهاند که امکان انتقال صندوق به آدرس دیگری را فراهم میکند. با این حال در اینجا هم محدودیتی وجود دارد، و آن این است که مالک آدرسی که صندوق را دریافت خواهد کرد، باید مجوزی ارائه دهد که در واقع میخواهد آن را دریافت کند. این برای شرایطی ایجاد شده است که کاربر در حال انتقال وثیقه قفلشده و همچنین بدهی ایجاد شده است. اگر به سادگی وثیقه را به آدرس دیگری منتقل میکنید، مشکلی وجود ندارد. اما در صورتی که بدهی ایجاد شده را نیز انتقال دهید، این احتمال وجود دارد که یک صندوق کاملاً ایمن را در موقعیتی پرخطر قرار دهید. این کارکرد قرارداد را کمی محدودتر میکند. بنابراین، مدیر
CDPگزینه خوبی برای حفظ یک روش ساده برای انتقال صندوقها و شناسایی آنها از طریق یک شناسه عددی است. - هنگامی که
openاجرا میشود، یکurnجدید ایجاد میشود و یکcdpIdبرای یک مالک مشخص اختصاص داده میشود. اگر کاربر بلافاصله پس از ماین تراکنش، از الحاق برای افزودن وثیقه بهurnاستفاده کند، احتمال سازماندهی مجدد زنجیره بلاکچین وجود دارد. که باعث میشود کاربر مالکیت آن جفتcdpId/urnرا از دست بدهد، بنابراین وثیقه خود را از دست میدهد. با این حال، این مشکل تنها در صورت اجتناب از استفاده از توابع پراکسی از طریق یکprofile proxyممکن است رخ دهد زیرا کاربرcdpرا باز کرده و در همان تراکنش به وثیقه الحاق میشود.