نسخه سوم زیرواکس 0x، سیستم استیکینگی را معرفی کرده است که به بازارسازها امکان میدهد تا مالکیت بر پروتکل را به دیگر افراد اعطا کنند، در حالی که بر اساس سهم نقدینگی ارائه داده شده و سهم توکن های ZRX استیک شده در استخر آنها پاداش دریافت میکنند.
این مقاله در نظر دارد تا به بازارسازهای فعلی و آتی کمک کند تا استخرهای استیکینگ خود را ایجاد کنند.
استخر استیکینگ چیست؟
در هر معامله 0x، خریدار (که به اسم تیکر هم شناخته میشود) کارمزد پروتکل اندکی به صورت اتر پرداخت میکند که بر اساس حاصلضرب در ارزش گس معامله محاسبه میشود. کارمزدها به سمت استخر استیکینگ متعلق به میکر یا ایجاد کننده سفارش خاص هدایت میشود و مشخص میکند که این آدرس به عنوان اپراتور استخر ثبت شده است یا خیر. در این مقاله منظور از میکر کسی است که استیکینگ را ایجاد می کند و با پروژه میکر (MakerDAO) ارتباطی ندارد.
کارمزدها در استخرهای استیکینگ طی بازه های زمانی ۱۰ روزه که به آن دوره (epoch) میگویند جمع میشوند. در پایان هر دوره، پاداش های نقدینگی به طور خودکار بر اساس فعالیت معاملاتی اپراتورهای استخرها و تعداد توکن ZRX استیک شده طی دوره بین اپراتورها توزیع میشود. هر پاداشی که توزیع نشده باشد، به طور خودکار به دوره بعدی انتقال خواهد یافت.
به عنوان یک بازارساز، ایجاد استخر استیکینگ و ثبت تمام آدرس هایی که برای ایجاد سفارش ها استفاده میکنید برای از دست ندادن پاداش نقدینگی شما بسیار مهم است.
ایجاد استخر استیکینگ کاملا ناشناس است، زیرا تنها اطلاعات مورد نیاز، آدرس های ارائه دهنده نقدینگی است. هم چنین به صورت اختیاری خواهید توانست تا متاداده ساده ای به استخر استیکینگ خود اضافه کنید که در گیت هاب عمومی ذخیره خواهد شد.
برای شروع به چه چیزی نیاز است؟
به منظور شروع ایجاد استخر استیکینگ به اطلاعات زیر نیاز دارید:
- یک آدرس منحصربهفرد که به عنوان اپراتور استخر تعیین شده باشد. این آدرس حتما نباید آدرس اصلی باشد که برای ایجاد سفارش های 0x به عنوان میکر از آن استفاده میکنید. این آدرسی است که برای مدیریت استخر استیکینگ از آن استفاده خواهید کرد.
- (اختیاری) سایر آدرس هایی که برای ایجاد سفارش های 0x به عنوان میکر از آنها استفاده میکنید.
- مقدار اولیه توکن ZRX. بعدا میتوانید توکن های ZRX بیشتری اضافه یا برداشت کنید. اگر سایر دارندگان توکن ZRX مشوق و پاداش خوبی مشاهده کنند، تصمیم میگیرند با استفاده از استخر شما استیک کنند. حداقل مقدار مورد نیاز برای هدایت کارمزدهای پروتکل به استخر، ۱۰۰ توکن ZRX است.
- سهم اپراتور شما. این مقدار بیانگر درصد پاداش هایی است که اپراتور استخر تمایل دارد بین نماینده های خود توزیع کند. این مقدار میتواند بین ۱۰۰ (کل پاداش به اپراتور استخر اختصاص داده شود) الی صفر (کل پاداش به نمایندگان اختصاص داده شود) باشد. بازارساز میتواند تصمیم بگیرد تا سهم اپراتور را کاهش دهد تا نمایندگان را ترغیب به استیک کردن توکن های ZRX بیشتری کند. پس از ایجاد شدن استخر استیکینگ، فقط کاهش این مقدار امکان پذیر است. لطفاً توجه کنید که پورتال ZRX پاداش های توزیع شده با نمایندگان را نشان میدهد.
اگر به افزودن متاداده به استخر استیکینگ خود علاقه دارید، رجیستری متن باز برای این کار ایجاد کرده ایم.
چگونه استخر استیکینگ ایجاد و مدیریت کنم؟
این کار فقط به اندازه ارسال تراکنش ها به قرارداد استیکینگ طول میکشد. نمونه کدهای زیر را میتوان در پروژه استارتر 0x پیدا کرد.
ایجاد استخر استیکینگ
تابع مرتبط: ایجاد استخر استیکینگ (createStakingPool)
این عملکرد، تراکنشی است که یکبار برای ایجاد استخر انجام میشود. فراخواننده (Caller) تابع به اپراتور استخر تبدیل میشود. نیازی نیست که از این آدرس برای ایجاد سفارش های 0x استفاده شود.
/// @dev Create a new staking pool. The sender will be the operator of this pool.
/// Note that an operator must be payable.
/// @param operatorShare Portion of rewards owned by the operator, in ppm.
/// @param addOperatorAsMaker Adds operator to the created pool as a maker for convenience iff true.
/// @return poolId The unique pool id generated for this pool.
function createStakingPool(uint32 operatorShare, bool addOperatorAsMaker)
external
returns (bytes32 poolId);
ثبت آدرس های بیشتر
تابع مرتبط: پیوستن به استخر استیکینگ به عنوان میکر (joinStakingPoolAsMaker)
این تراکنش باید توسط آدرسی که میخواهید در استخر ثبت کنید ارسال شود. این آدرس هایی هستند که از آنها استفاده خواهید کرد تا سفارش ها را به عنوان آدرس میکر (makerAddress) ثبت کنید.
/// @dev Allows caller to join a staking pool as a maker.
/// @param poolId Unique id of pool.
function joinStakingPoolAsMaker(bytes32 poolId)
public;
واریز استیک
تابع قرارداد مرتبط: استیک (stake)
قبل از آنکه توکن های ZRX را به استخر انتقال دهیم باید آنها را در قرارداد StakingProxy واریز کنیم. قبل از فراخوانی این تابع، کاربر باید به قرارداد ERC20Proxy اجازه دهد تا توکن های خود را با فراخوانی zrxToken.approve انتقال دهد.
/// @dev Stake ZRX tokens. Tokens are deposited into the ZRX Vault.
/// Unstake to retrieve the ZRX. Stake is in the ‘undelegated’ status.
/// @param amount of ZRX to stake. function stake(uint256 amount)
external;
استیک کردن ZRX با استخر
تابع مرتبط: انتقال استیک (moveStake)
این تراکنش برای استیک کردن ZRX با استخر (پس از واریز) استفاده میشود. توجه کنید که تمام توکن های ZRX استیک شده در استخر که توسط آدرسی به غیر از اپراتور انجام شده باشد تاثیر ۹۰ درصدی خواهد داشت. به همین دلیل، آدرس اپراتور استخر نیز باید برای استیک کردن ZRX در استخر خود استفاده شود. توجه کنید که تغییرات انجام شده از جانب فراخوانی این تابع فقط در دوره بعدی موثر خواهد بود.
/// @dev Moves stake between statuses: ‘undelegated’ or ‘delegated’.
/// Delegated stake can also be moved between pools.
/// This change comes into effect next epoch.
/// @param from status to move stake out of.
/// @param to status to move stake into.
/// @param amount of stake to move.
function moveStake(
IStructs.StakeInfo calldata from,
IStructs.StakeInfo calldata to,
uint256 amount
)
external;
خارج کردن استیک از استخر
تابع قرارداد مرتبط: انتقال استیک (moveStake)
در صورتی که نیاز به کاهش تعداد توکن های ZRX استیک شده در استخر استیکینگ خود دارید، میتوانید با فراخوانی تابع مورد نظر این کار را انجام دهید. فقط توکن های ZRX استیک شده توسط آدرس مشابه میتوانند از استیک خارج شوند. این یکی دیگر از دلایلی است که پیشنهاد میکنیم اپراتور استخر به مدیریت موجودی ZRX بپردازد.
/// @dev Moves stake between statuses: ‘undelegated’ or ‘delegated’.
/// Delegated stake can also be moved between pools.
/// This change comes into effect next epoch.
/// @param from status to move stake out of.
/// @param to status to move stake into.
/// @param amount of stake to move.
function moveStake(
IStructs.StakeInfo calldata from,
IStructs.StakeInfo calldata to,
uint256 amount
)
external;
برداشت استیک
کاهش سهم اپراتور
تابع قرارداد مرتبط: کاهش سهم اپراتور استخر استیکینگ (decreaseStakingPoolOperatorShare)
به منظور آنکه تراکنش با موفقیت انجام شود، باید توسط آدرس اپراتور استخر امضا و ارسال شود.
/// @dev Decreases the operator share for the given pool (i.e. increases pool rewards for members).
/// @param poolId Unique Id of pool.
/// @param newOperatorShare The newly decreased percentage of any rewards owned by the operator.
function decreaseStakingPoolOperatorShare(bytes32 poolId, uint32 newOperatorShare)
external
چگونه پارامترهای بهینه را انتخاب کنم؟
این سیستم طوری طراحی شده است تا به صورت پویا و بر اساس اقدامات شما و سایر شرکت کنندگان در شبکه عمل کند، بنابراین هیچ راهکاری برای به حداکثر رساندن و برتری بر دیگر شرکت کنندگان وجود ندارد.
هرچند استفاده از این قانون نانوشته میتواند مفید باشد. هنگامی که نسبت استیک شما برابر با ۱ باشد، پاداش هر توکن ZRX استیک شده شما به حداکثر میرسد. نسبت استیک با تقسیم سهم نسبی توکن های ZRX استیک شده (تعداد توکن های استیک شده توسط شما تقسیم بر کل توکن های استیک شده در شبکه) بر سهم نقدینگی شما (کارمزدی که سفارش های شما ایجاد کرده است تقسیم بر کل کارمزدهای ایجاد شده توسط سایر بازارسازها) محاسبه میشود. اگر این دو مقدار با یکدیگر برابر باشد، نسبت استیک برابر با ۱ خواهد بود و پاداش توکن های ZRX استیک شده شما به حداکثر میرسد. اگر استیک استخر استیکینگ شما کم باشد (سهم نسبی توکن ZRX کمتر از سهم نقدینگی باشد)، کارمزدهای واجد شرایط به استخر شما اختصاص نداده خواهد شد. افزایش موجودی توکن های ZRX استیک شده، پاداش نقدینگی دریافت شده را افزایش خواهد داد.
اگر استیک استخر استیکینگ شما زیاد باشد، استخر شما پاداش توکن های استیک شده را به حداکثر نخواهد رساند. هرچه توکن های استیک شده در استخر بیشتر باشد، پاداش شما افزایش خواهد یافت. با این کار، نسبت استیک سایر استخرهای استیکینگ را کاهش خواهید داد.