Алгоритм стейкинга в Sushiswap MasterChef и Synthetix. Часть 3
В дополнение к предыдущему посту.
Распределять каждому стейкеру его REWARD каждый раз, когда кто-то вызывает deposit() или withdraw(), будет очень дорого, если стейкеров десятки. Трансфер токена ERC20 стоит недешево, а делать это десятки раз в цикле - непомерно дорого.
Для того чтобы сделать стейкинг эффективнее, можно придумать систему, когда пользователи получают свое вознаграждение, только тогда, когда вызывают функции изменения состояния.
Для тех, кто не требует вознаграждения, оно откладывается. Вознаграждения остаются в контракте и ждут, когда они будут востребованы.
Это избавит нас от необходимости делать кучу переводов ERC 20.
Из этого следует:
- мы можем обновлять только переменные аккаунта, связанные с адресом, инициирующим транзакцию;
- мы можем обновлять только одну глобальную переменную, которая отслеживает увеличение распределения вознаграждения для всех остальных, не обновляя каждый аккаунт по отдельности;
Кроме всего прочего, вместо того чтобы отслеживать начисление вознаграждения на счетах, мы отслеживаем прибыль от одного поставленного токена.
Предположим, мы можем точно отследить, сколько один токен накопил вознаграждения «с начала времен» (когда контракт начал распределять вознаграждения).
Если это так, то отследить, сколько вознаграждения накопил аккаунт, можно просто умножив его баланс на то, сколько Rewards он накопил с начала времени.
Если звучит запутано, но просто нужно прочитать медленнее и вдуматься в общую схему.
Предположим, мы знаем, что токен с начала времени до текущего момента, собрал 12 Rewards. Поэтому если Алиса сделала депозит в 100 токенов, то ей причитается 1 200 Rewards.
Это все равно что сказать: «Доллар, который вы положили на счет в нашем банке, заработал 0,40 доллара в виде процентов с момента открытия банка. Если вы открыли счет, когда мы открыли банк, и с тех пор не пополняли и не снимали деньги, то вы заработали 40%».
Это приводит нас к двум вопросам:
1. Как отследить начисление вознаграждения за один токен с начала времени?
2. Что, если Алиса не делала депозит с начала времени, а только недавно пополнила счет?
Об этом в следующем посте.
#Sushiswap #MasterChef #staking
Post #1095
929
- 👍 3
- ❤ 1