Пул номинаторов
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Смарт-контракт Пул номинаторов, предоставляет возможность одному или нескольким номинаторам одолжить Toncoin для ставки валидатору и гарантирует, что валидатор может использовать эти Toncoin только для валидации. Кроме того, смарт-контракт гарантирует распределение вознаграждения.
Архитектура
Ограничения
Этот пул предназначен для большого объема монет.
Во время разработки главным критерием была безопасность и простота кода.
Пул не поддерживает малые депозиты или большое количество номинаторов в одном пуле.
Целевая тестируемая конфигурация: минимальная ставка номинатора – 10 000 TON, максимальное количество номинаторов в пуле – 40.
Количество номинаторов выше 40 не тестировалось, и мы настоятельно не рекомендуем устанавливать число выше 40 до тех пор, пока такие тесты не будут проведены.
Комиссии
Так как пул расположен в мастерчейне, где плата за услуги высока, для работы пула потребуется около 5 TON за раунд валидации.
Операционные сборы оплачивает валидатор.
Обратите внимание, что на балансе пула всегда должно быть 10 TON – это минимальный баланс для оплаты сетевого хранилища. 10 TON не могут быть выведены.
Распределение вознаграждений
Для каждого раунда валидации пул отправляет ставку смарт-контракту Избирателя.
После завершения раунда проверки пул возвращает свои средства Избирателю.
Обычно полученная сумма больше, чем отправленная, а разница является вознаграждением за валидацию.
Валидатор получает часть вознаграждения в соответствии с неизменяемым параметром пула validator_reward_share
.
validator_reward = (reward * validator_reward_share) / 10000;
nominators_reward = reward - validator_reward;
Номинаторы делят оставшееся вознаграждение в соответствии с размером своих ставок.
Например, если в пуле есть два номинатора со ставками 100 000 и 300 000 TON, то первый из них получит 25%, а второй – 75% от nominators_reward
.
Сокращение пула номинаторов
В случае большого штрафа за валидацию, когда полученная сумма меньше отправленной, убыток списывается из средств валидатора.
Если средств валидатора недостаточно, то недостающая сумма будет вычтена у номинаторов пропорционально их ставкам.
Обратите внимание, что смарт-контракт пула номинаторов разработан таким образом, чтобы средств валидатора всегда было достаточно для покрытия максимального штрафа.
Ответственность валидатора
Пул может принимать участие в валидации только в том случае, если средства валидатора превышают неизменяемый параметр пула min_validator_stake
.
Кроме того, средства валидатора должны превышать максимально возможный штраф за плохую валидацию. Рекомендуемый штраф рассчитывается в зависимости от конфигурации сети.
В противном случае пул не будет отправлять запросы на участие в раунде валидации.
Сообщения номинаторов
Чтобы взаимодействовать с пулом номинаторов, номинаторы отправляют простые сообщения с текстовым комментарием (можно отправить из любого приложения кошелька) смарт-контракту пула номинаторов.
Сообщения должны отправляться в режиме возврата!
В случае опечатки или недействительного сообщения, оно вернется к отправителю.
Если вы отправите сообщение с опечаткой или недействительное сообщение в невозвратном режиме, то потеряете монеты.
Депозит номинатора
Для того чтобы номинатор смог внести депозит, ему нужно отправить сообщение смарт-контракту пул номинатора, содержащее TON и текстовый комментарий "d
".
Номинатор может отправить сообщение только с кошелька, расположенного в basechain (с необработанным адресом 0:...
).
Количество TON должно быть больше или равно min_nominator_stake + 1 TON
.
При внесении депозита 1 TON вычитается в качестве комиссии за обработку депозита.
Если пул в данный момент не участвует в валидации (state == 0
), то депозит будет зачислен немедленно.
Если же пул в данный момент участвует в валидации (state != 0
), то сумма депозита будет добавлена к pending_deposit_amount
номинатора и будет зачислена после завершения текущего раунда валидации.
Впоследствии номинатор может отправить больше TON, чтобы увеличить свой депозит.
Обратите внимание, если пул номинаторов уже достиг количества, равного max_nominators_count
, то депозиты от новых номинаторов будут отклонены (вернутся обратно к отправителю).
Вывод средств номинатора
Для вывода средств номинатор должен отправить смарт-контракту пул номинатора сообщение, содержащее текстовый комментарий "w" и некоторое количество Toncoin для оплаты комиссии сети (достаточно 1 TON). Неизрасходованные TON, прикрепленные к сообщению, будут возвращены, за исключением очень редких случаев.
Если на балансе пула номинаторов достаточно TON, вывод средств будет произведен немедленно. Все средств а будут на балансе пула номинаторов, если он завершил участие в раунде валидации, но еще не подал заявку на участие в новом раунде.
Если на балансе пула номинаторов недостаточно Toncoin, то для номинатора будет выполнен запрос withdraw_request
и Toncoin будут выведены после окончания текущего раунда валидации.
Номинатор может вывести все свои средства только за один раз. Частичный вывод не поддерживается.
Вывод средств валидатора
Валидатор может вывести из пула все Toncoin, которые не принадлежат номинаторам.
Участники должны хранить свои закрытые ключи
Если номинатор потеряет доступ к своему кошельку, с которого он вносил деп озит, то не сможет вывести свои средства из пула.
Если валидатор потеряет доступ к своему кошельку, то не сможет вывести свои средства (валидатора) из пула.
Потеря закрытого ключа кошелька одного участника пула не влияет на других участников.
Экстренный вывод средств
При нормальной работе валидатор должен периодически отправлять в пул номинаторов операционные сообщения, такие как: process withdraw requests
, update current validator set
, new_stake
, recover_stake
.
Программа-валидатор MyTonCtrl делает это автоматически.
В экстренной ситуации, например, если валидатор пропадает и перестает выполнять свои обязанности, операционные сообщения может отправить любой участник и, таким образом, номинаторы смогут вывести свои средства.
Голосование за предложения по конфигурации сети
В TON изменение конфигурации сети происходит путем [голосования валидаторов] (/v3/documentation/smart-contracts/contracts-specs/governance#proposalvoting-mechanism).
В случае с пулом номинаторов имеет смысл, чтобы все участники могли голосовать, а окончательный результат был бы отправлен от имени пула.
Таким образом, смарт-контракт пула номинаторов имеет встроенную функциональность, где валидатор и номинаторы могут оставить свой голос за/против конкретного предложения.
В рамках такого голосования валидатор отправляет финальный голос смарт-контракту конфигурации сети через программное обеспечение валидатора.
Если валидатор отправил финальный голос смарт-контракту конфигурации сети, и голос не совпал с мнением большинства в пуле, то в таком случае номинаторы могут покинуть (и покинут) этот пул и перейти в другой.
Поскольку все происходит через транзакции on-chain, такое несоответствие будет храниться в блокчейне и будет доступно всем для обзора.
Голосование номинатора
Каждое новое предложение по изменению конфигурации сети изначально публикуется на каналах TON Foundation @tonblockchain или @tonstatus.
В этом сообщении, помимо описания предложения, будет указан его хэш в HEX-формате, например, D855FFBCF813E50E10BEAB902D1177529CE79785CAE913EB96A72AE8EFBCBF47
.
Для того чтобы номинатор проголосовал за предложение, ему нужно отправить сообщение смарт-контракту пула номинаторов с текстовым комментарием y<HASH>
.
Для того чтобы номинатор проголосовал против предложения, ему нужно отправить сообщение смарт-контракту пула номинаторов с текстовым комментарием n<HASH>
.
К этому сообщению должно быть прикреплено некоторое количество Toncoin для оплаты комиссии сети (достаточно 1 TON). Неизрасходованные TON, прикрепленные к сообщению, будут возвращены.
Голоса хранятся в контракте пула в течение 30 дней.
Голосовать могут только валидатор и текущие номинаторы, имеющие активную ставку в пуле.
GET-метод get_pool_data
Возвращается:
- state – uint – текущее состояние пула номинаторов. 0 – не участвует в валидации, 1 – отправил запрос
new_stake
на участие в раунде валидации, 2 – получил успешное подтверждение об участии в раунде валидации. - nominators_count – uint – текущее количество номинаторов в пуле.
- stake_amount_sent – nanotons – сумма ставки, с которой пул участвует в текущем раунде проверки.
- validator_amount – nanotons – количество монет, принадлежащих валидатору.
- validator_address – immutable – uint – адрес кошелька валидатора. Чтобы получить адрес, выполните
"-1:" + dec_to_hex(validator_address)
. - validator_reward_share – immutable – uint – доля вознаграждения валидатора от валидации.
validator_reward = (reward * validator_reward_share) / 10000
. Например, установите 4000, чтобы получить 40%. - max_nominators_count – immutable – uint – максимальное количество номинаторов в этом пуле.
- min_validator_stake – immutable – nanotons – минимальная ставка валидатора в этом пуле.
- min_nominator_stake – immutable – nanotons – минимальная ставка для номинатора в этом пуле.
- nominators – cell – необработанный словарь с номинаторами.
- withdraw_requests – cell – необработанный словарь с запросами на вывод средств от номинаторов.
- stake_at – uint – ID раунда валидации, в котором мы участвуем/собираемся участвовать. Предполагается, что валидация начнется в следующем раунде (
utime_since
). - saved_validator_set_hash - uint - техническая информация.
- validator_set_changes_count - uint - техническая информация.
- validator_set_change_time - uint - техническая информация.
- stake_held_for - uint - техническая информация.
- config_proposal_votings – cell – необработанный справочник, содержащий конфигурации предложений голосования.
GET-метод list_nominators
Возвращает список номинаторов текущего пула.
Каждая запись содержит:
- address – uint – адрес кошелька номинатора. Чтобы получить адрес, выполните
"0:" + dec_to_hex(address)
. - количество – nanotons – текущая активная ставка номинатора.
- pending_deposit_amount – nanotons – сумма депозита, которая будет добавлена к активной ставке номинатора в следующем раунде валидации.
- withdraw_request – int – если
-1
, то этот номинатор отправил запрос на вывод всех своих средств.
GET-метод get_nominator_data
Метод принимает в качестве аргумента адрес номинатора и возвращает следующие параметры:
- количество – nanotons – текущая активная ставка номинатора.
- pending_deposit_amount – nanotons – сумма депозита, которая будет добавлена к активной ставке номинатора в следующем раунде валидации.
- withdraw_request – int – если
-1
, то этот номинатор отправил запрос на вывод всех своих средств.
Если в пуле нет такого номинатора, то метод выдаст ошибку 86
.
Чтобы получить номинатора, например, с адресом EQA0i8-CdGnF_DhUHHf92R1ONH6sIA9vLZ_WLcCIhfBBXwtG
, нужно преобразовать адрес в raw-формат 0:348bcf827469c5fc38541c77fdd91d4e347eac200f6f2d9fd62dc08885f0415f
, отбросить 0:
и вызвать get_nominator_data 0x348bcf827469c5fc38541c77fdd91d4e347eac200f6f2d9fd62dc08885f0415f
.
GET-метод list_votes
Возвращает список голосов.
Каждая запись содержит:
- proposal_hash – uint – хэш предложения. Используйте
dec_to_hex(proposal_hash)
для преобразования хэша в HEX-форму. - votes_create_time - uint - время создания этого голосования.
GET-метод list_voters
Метод принимает в качестве аргумента хэш предложения и возвращает список проголосовавших.
Каждая запись содержит:
- адрес – адрес избирателя. Чтобы получить адрес номинатора, выполните
"0:" + dec_to_hex(address)
, еслиaddress = validator_address
, сделайте"-1:" + dec_to_hex(address)
. - поддержка – int – если
-1
, то это "голосование за", в противном случае это "голосование против". - vote_time – uint – единичное время, когда он проголосовал.
Результаты голосования подсчитываются off-chain.
Интеграция в приложения для кошельков
Для депозитов, снятия денег и голосования отправьте пулу простые сообщения с нужными текстовыми комментариями, как описано выше.
При отправке депозита вы можете сохранить сумму, которая была отправлена, в локальном хранилище.
При отправке повторного депозита также добавьте его к этой сумме.
Чтобы узнать текущую прибыль, вызовите метод get_nominator_data(your_address)
. Прибыль будет равна (amount + pending_deposit_amount – sent_amount_stored_in_local_storage
).
Чтобы получить информацию о пуле, вызовите get-методы get_pool_data
и list_nominators
.