Алгоритм стейкинга в Sushiswap MasterChef и Synthetix. Часть 6
В последний месяц наблюдаю забавную тенденцию на канале: количество участников постоянно меняется в пределах 6:-6, т.е. приходят несколько человек, потом несколько уходят после новых постов. Сложилось такое ощущение, что многие заходят на канал в поисках чего-то простого по изучению Solidity, потом видят посты по расчеты в DeFi и такие: "Да ну нахер..." и уходят.
За все время существования канала, я старался никогда не повторяться с темами и постоянно выкладывать что-то новое. Ну, и к сегодняшнему моменту мы добрались до достаточно сложных тем.
Тем не менее, я подумаю, как можно сделать посты более "дружелюбными" для новичков и может выделить разборы DeFi в отдельный бесплатный канал.
А пока что, на этой неделе мы закончим читать статью про Sushiswap MasterChef и Synthetix, и для начала разберем небольшой пример, чтобы вспомнить посты с прошлой недели.
Мы снова выдаем по 1 000 Rewards за блок. За 20 блоков будет выдано 20 000 вознаграждений.
Вот что делают Алиса и Боб:
- Алиса сделала депозит 100 жетонов с блока 1 по блок 20.
- В блоке 10 Боб делает депозит 100 жетонов.
- В блоке 20 Алиса должна получить 75 % от всех вознаграждений, выданных до этого момента, или 15 000 вознаграждений.
Визуально доля пула ставок на блок будет выглядеть как на скрине выше.
С блока 1 по блок 10 награда за токен в блоке составляла 10 (1 000 ÷ 100). За этот интервал в 10 блоков каждый токен накапливал 100 Rewards (10 вознаграждений за токен в блоке x 10 блоков).
Но когда Боб пополнил счет в блоке 10, награда за токен в блоке уменьшилась до 5 (1 000 ÷ 200). За следующий интервал в 10 блоков (блоки с 11 по 20) каждый токен накопил 50 Rewards.
Таким образом, общая стоимость, накопленная токеном с блока 1 по блок 10, равна 100, а стоимость, накопленная с 11 по 20, равна 50. Таким образом, общая стоимость накопленного токена равна 100 + 50 = 150.
Поскольку Алиса положила на счет 100 токенов, а каждый токен накопил 150 вознаграждений, ей будет выдано 15 000 вознаграждений, что действительно составляет 75 % от общего количества выданных вознаграждений.
Но что, если ни кто не делал депозиты с самого начала?
Очевидный исключительный случай в приведенном выше примере заключается в том, что если бы Боб потребовал вознаграждение, то он также получил бы 15 000, потому что его ставка в блоке 20 равна 100, как и у Алисы.
Чтобы решить эту проблему, мы хотим, чтобы аккумулятор начинал считать для Боба только в тот момент, когда Боб сделал депозит.
Интуитивное решение состоит в том, чтобы хранить номер блока, в котором Боб сделал депозит, и скорректировать его позже.
Однако еще проще рассчитать сумму вознаграждений, которую он получил бы при пополнении счета в блоке 10, а затем сразу же потребовал вознаграждение. Например, в блоке 10 накопленное вознаграждение за токен составляло 100. Поскольку Боб положил на счет 100 жетонов, теоретически он мог бы сразу получить 10 000 Rewards.
Для того, чтобы этого не произошло, у нас есть переменная для Боба, которую мы называем «долг награды» (“reward debt”).
В тот момент, когда он вносит депозит, мы устанавливаем reward debt равным балансу депозита, умноженному на накопитель вознаграждения за токены. Это не позволит ему сразу же получить награду, поскольку в этот момент причитающееся ему вознаграждение будет равно нулю (текущее вознаграждение минус долг вознаграждения).
Мы создали для Боба отдельную переменную под названием «долг вознаграждения» и присвоили ей эту гипотетическую сумму вознаграждения. В блоке 10 накопленное вознаграждение за токен составляло 100, и депозит Боба был 100, поэтому его долг по вознаграждению составляет 10 000.
Если Боб потребует вознаграждение в блоке 20, мы вычтем вознаграждение в 15 000 из суммы долга в 10 000. Боб сможет получить только 5 000 Rewards в блоке 20.
Это может быть слегка сложно читать, поэтому рекомендую смотреть на скрины выше и размечать движение токенов, чтобы понимать суть работы вознаграждений.
Дальше мы поговорим про MasterChef.
#Sushiswap #MasterChef #staking
Post #1103
886
- ❤ 3
- 🔥 3