Стейк-токены
Назначение смарт-контракта cyber.stake
Системный смарт-контракт cyber.stake
предоставляет методы голосования за валидаторов, позволяющие пользователям наиболее эффективно использовать свои голоса, а также находящиеся на балансах ресурсы. Также cyber.stake
предоставляет пользователю возможность передавать права голоса другому пользователю.
Используемая терминология
Агент — потенциально активный пользователь, имеющий баланс в смарт-контракте cyber.stake
.
Голоса, отданные за валидатора — под голосами понимается определенное количество застейканных токенов, отданных валидатору при голосовании (один токен соответствует одному голосу).
Делегатор — пользователь, который делегирует часть принадлежащего ему стейка (ресурсы RAM, CPU, NET, Storage), либо право голоса другому пользователю при голосовании.
Прокси-аккаунт (англ. proxy account) — пользователь, который наделен определенным правом голоса во время голосования. Прокси-аккаунтом может объявить себя любой пользователь, готовый принять голоса от других пользователей и распоряжаться этими голосами по своему усмотрению во время голосования за валидаторов. Для этого пользователь должен установить себе уровень прокси-аккаунта, вызовом setproxylvl
.
Пользователь, который по какой-либо причине не принимает участие в голосовании за валидаторов, может поручить прокси-аккаунту проголосовать за него. Прокси-аккаунт также может доверять свои голоса другому прокси-аккаунту.
Уровень прокси-аккаунта — условное разделение пользователей на категории. Каждой категории пользователей присваивается свой уровень прокси-аккаунта. Наивысшим уровнем прокси-аккаунта является нулевой, который присваивается только валидаторам. Первый уровень и далее по возрастанию присваивается пользователям, объявившим себя прокси-аккаунтами. Количество уровней (категорий) прокси-аккаунтов не ограничено. Количество прокси-аккаунтов одного и того же уровня также не ограничено. Последний уровень прокси-аккаунта присваивается рядовому пользователю. Прокси-аккаунт может быть настроен только на один из уровней.
Разделение прокси-аккаунтов по уровням введено с целью исключения замкнутости при передачи права голоса от одного пользователя другому (например, пользователь А может передать свой голос пользователю В, а пользователь В передать этот полученный голос пользователю С. Если последний передаст полученные голоса обратно пользователю А, то образуется замкнутость передач. Чтобы исключить появление замкнутости при передачи голосов, введено понятие уровней прокси-аккаунтов). Передача права голоса возможно только прокси-аккаунту более низкого уровня.
Примечание: В текущем релизе количество уровней прокси-аккаунтов (уровней агентов) ограничено тремя. Прокси-аккаунт может быть настроен на один из следующих уровней:
Прокси-аккаунт нулевого уровня — валидатор.
Прокси-аккаунт первого уровня — пользователь, объявивший себя прокси-аккаунтом, наделенный голосами рядовых пользователей, которыми он может воспользоваться во время голосования.
Прокси-аккаунт третьего уровня — рядовой пользователь.
Стейк (англ. stake) — доля ресурсов bandwidth (RAM, NET, CPU и Storage), выделенная пользователю в системе на выполнение операций и выраженная в их текущей стоимости. Пользователь может распоряжаться выделенной ему долей ресурсов как самостоятельно, так и доверить ее использование другому пользователю (делегировать долю ресурсов).
Токен застейканный (англ. staked token) — токены, выделенные на приобретение доли стейка в системе и находящиеся в «замороженном» состоянии. Вид токена определяется символом, однозначно идентифицирущим данный токен. Для системного токена установлен символ govern
.
Операции-действия, применяемые в смарт-контракте cyber.stake
В состав смарт-контракта cyber.stake
входят следующие операции-действия: create, enable, open, delegatevote, setgrntterms, recallvote, withdraw, setproxylvl, setproxyfee, setminstaked, setkey, updatefunds, reward, pick, delegateuse, recalluse, claim. Также в cyber.stake
реализованы встраиваемые (англ. inline) функции get_votes_sum и get_top.
create
Операция-действие create
используется для создания стейка отдельному виду (символу) токенов. После создания стейка токены данного вида могут переводиться пользователями в состояние стейка.
Параметры:
token_symbol
— символ токена, для которого создается стейк.max_proxies
— максимально допустимые значения прокси-аккаунта. Нулевой элемент вектора устанавливает максимально допустимое количество пользователей, которым можно поручить (делегировать) право голосования, если уровень прокси-аккаунта первый. Первый элемент вектора устанавливает максимально допустимое количество частей, на которое может быть разделен стейк, если уровень прокси-аккаунта второй. При наличии в системе прокси четвертого и более уровней вектор будет содержать три и более элементов.depriving_window
— длительность периода (в секундах), в течение которого отозванные обратно делегатору средства не могут быть им использованы. Средства могут быть отозваны вызовом операцииrecallvote
. Отозванные средства в течение данного периода не могут учитываться при расчете доли ресурсов.min_own_staked_for_election
— минимально допустимое количество застейканных токенов, которое должен иметь пользователь, чтобы быть кандидатом в валидаторы.
Обычные пользователи могут проголосовать либо за одного валидатора, либо передать право голосования только одному прокси-аккаунту.
Прокси-аккаунт может одновременно голосовать за несколько валидаторов. Максимально допустимое количество валидаторов, за которые прокси-аккаунт может голосовать — 30.
Для вызова create
требуются права создателя токена token_symbol
. Создатель токена, вызвав create
, дает возможность другим пользователям переводить токены данного вида в состояние стейка. При создании стейка для системного токена необходимо обладать системными правами.
enable
Операция-действие enable
позволяет вывести на время из использования определенный вид токена. Данная операция устанавливает флаг enable
в значение true
.
Параметр token_symbol
— символ токена, на который действует установленный в значение true
флаг enable
.
Данная операция применяется в тестировании для отключения использования токенов определенного символа. На время тестирования флаг enable
устанавливается в значение false
, то есть отключается ограничение по ресурсам определенного вида токенов. По окончании тестирования флаг должен быть обратно установлен в значение true
. Если token_symbol
является системным, то при установленном флаге enable
на ноде включается ограничение на использование ресурсов по стейку.
Для вызова операции требуются права создателя токена token_symbol
.
open
Операция-действие open
используется для открытия баланса конкретному пользователю.
Параметры:
owner
— имя пользователя, которому открывается баланс.token_code
— символ токена, который будет находиться на балансе.ram_payer
— имя аккаунта, который оплачивает открытие баланса. Если параметр принимает значение по умолчаниюstd::nullopt
, то открытие баланса оплачивает самowner
.
Для вызова операции требуются права пользователя, который оплачивает открытие баланса. По умолчанию требуются права пользователя owner
.
delegatevote
Операция-действие delegatevote
используется для делегирования другому аккаунту права на использование стейка (или доли стейка), которым этот аккаунт может распоряжаться по своему усмотрению при голосовании за валидаторов.
Параметры:
grantor_name
— имя аккаунта, который делегирует право на использование стейка (или доли стейка). Этим аккаунтом может быть либо обычный пользователь, либо прокси аккаунт с уровнем, выше чем уровень уровень прокси-аккаунтаrecipient_name
.recipient_name
— имя прокси-аккаунта, которому доверяется право голоса.quantity
— количество застейканных токенов, которыми прокси-аккаунтrecipient_name
может воспользоваться при голосовании. Параметр должен быть больше нуля.
Пользователь может не принимать участие в голосовании за валидаторов, а передать свое право голоса прокси-аккаунту, делегировав ему свое право на использование определенного количества застейканных токенов. Эти токены (стейка) могут быть использованы только при голосовании за валидаторов.
В зависимости от настроек стейка, право голоса на использование токенов стейка может быть передано далее (вызовом delegatevote
) получателю recipient_name
, у которого уровень прокси proxy_level
меньше, чем у отправителя grantor_name
.
Примечание: Поскольку в текущем релизе количество уровней прокси-аккаунтов ограничено тремя (нулевой — валидатор, первый — непосредственно прокси-аккаунт, второй — рядовой пользователь), передача голоса от одного прокси-аккаунта другому невозможна. Прокси-аккаунт, получив право голоса от рядового пользователя может воспользоваться им только при голосовании за валидаторов.
Стейк разделяется на несколько долей. Количество долей зависит от настроек стейка при выполнении операции create
и ограничено значением max_proxies
. Для обычного пользователя это значение равно единице, дающее право пользователю проголосовать только за одного валидатора.
Для вызова операции delegatevote
требуются права аккаунта grantor_name
.
recallvote
Операция-действие recallvote
используется для возврата права на использование делегированного стейка при голосовании за валидаторов. Объем стейка, право на использование которого отзывается, указывается в процентах и может быть отозван как частично, так и полностью.
Параметры:
grantor_name
— имя аккаунта, который отзывает право на использование стейка (или доли стейка) при голосовании за валидаторов.recipient_name
— имя аккаунта, от которого отзывается право на использование стейка (доли стейка) при голосовании.token_code
— символ застейканного токена.pct
— доля стейка (в процентах), право на использование которой отзывается.Отозванная доля стейка может быть использована аккаунтом
grantor_name
сразу по завершении операцииrecallvote
.
Для вызова операции recallvote
требуются права аккаунта grantor_name
.
setgrntterms
Операция-действие setgrntterms
используется для распределения дополнительно выделенных застейканных токенов между валидаторами при голосовании в соответствии с уже установленными пропорциями.
Параметры:
grantor_name
— имя аккаунта, который делегирует дополнительную долю стейка.recipient_name
— имя прокси-аккаунта, получателя дополнительно делегируемой доли стейка.token_code
— символ застейканных токенов.pct
— доля (в процентах) количества дополнительно полученных голосов, которая будет отдана за кандидатаrecipient_name
.break_fee
— параметр, контролирующий изменение комиссииfee
, установленной кандидатом. Значение этого параметра — доля комиссии (в процентах), устанавливаемая аккаунтомgrantor_name
для кандидатаrecipient_name
. Если кандидат в процессе голосования установит значениеfee
больше, чемbreak_fee
, автоматически будет вызвана операцияrecall
для отзыва голосов у данного кандидата.break_min_own_staked
— параметр, контролирующий наличие застейканных токенов у кандидатаrecipient_name
. Значение этого параметра устанавливается аккаунтомgrantor_name
. По умолчанию это изменение устанавливается равным текущему значениюmin_own_staked
. Если кандидат уменьшитmin_own_staked
(с целью вывода средств в ликвидное состояние), то при очередном обновлении баланса аккаунтаgrantor_name
автоматически будет вызвана операцияrecall
для отзыва застейканных токенов у данного кандидата.
При выполнении recall
проверяется условие, чтобы у кандидата оставались средства в размере не менее min_own_staked
.
Прокси-аккаунт может голосовать одновременно за нескольких кандидатов в валидаторы, распределяя голоса между ними в определенной пропорции. До завершения процесса голосования прокси-аккаунт может получить дополнительное количество голосов (застейканных токенов), которыми он также может воспользоваться. Эти дополнительные голоса автоматически будут отданы тем кандидатам, за которых голосовал прокси-аккаунт до получения этих голосов. Дополнительные голоса будут распределены между кандидатами с сохранением пропорции.
withdraw
Операция-действие withdraw
используется для вывода токенов из состояния стейка в состояние ликвидных.
Параметры:
account
— имя аккаунта, который выводит токены из стейка.quantity
— количество выводимых токенов. Значение должно быть положительным.
При вызове операции withdraw
смарт-контракт cyber.stake
отправляет уведомление создателю токена, который принимает окончательное решение о выводе токенов. Вывод токенов выполняется сразу без какой-либо задержки.
В случае вывода из стейка системного токена создателем токена является cyber
. При этом решение о выводе токена принимает смарт-контракт cyber.bios
. Перед выводом системного токена проверяется стоимость использованных пользователем ресурсов. Вывод выполняется, если остаток стейка у пользователя с учетом выводимых средств покрывает затраты на использованные им ресурсы.
Для вызова операции withdraw
требуются права аккаунта account
.
setproxylvl
Операция-действие setproxylvl
устанавливает пользователю уровень прокси-аккаунта.
Параметры:
account
— имя аккаунта, для которого устанавливается уровень прокси-аккаунта.token_code
— количество токенов пользователяaccount
, находящихся в состоянии стейка.level
— устанавливаемый уровень.
Если пользователь намеревается получить статус кандидата в валидаторы, для него должен быть установлен нулевой уровень. Если пользователь намеревается получить статус прокси-аккаунта, для него должен быть установлен первый уровень (в текущем релизе).
Для вызова операции setproxylvl
требуются права аккаунта account
.
setproxyfee
Операция-действие setproxyfee
устанавливает размер комиссии для агента (кандидата в валидаторы), за которого голосовали пользователи.
Параметры:
account
— имя агента, за которого проголосовали пользователи.token_code
— символ токенов, составляющих вознаграждение агенту.fee
— размер комиссионных отчислений от суммы вознаграждения, которые получает агент. Параметр рассчитывается в момент выплаты вознаграждения (в момент выполненияreward
). Параметр принимает значения от «0» до «10000» включительно. Значение «0» соответствует «0 %», а «10000» соответствует «100 %».
От поступившей суммы вознаграждения, выделенной агенту, отчисляется комиссия fee
и передается агенту account
. Остальная часть вознаграждения распределяется между всеми пользователями, проголосовавшими за данного агента.
setminstaked
Операция-действие setminstaked
устанавливает минимально возможный размер стейка, выделяемого на голосование самим агентом (кандидатом в валидаторы).
Параметры:
account
— имя агента, кандидата в валидаторы.token_code
— символ токена, находящегося в стейке..min_own_staked
— минимально возможный размер стейка, который выделяется на голосование самим агентом. Значение не может быть отрицательным.
Если кандидат в валидаторы во время голосования устанавливает значение min_own_staked
меньше, чем min_own_staked_for_election
, то отданные за него голоса автоматически аннулируются.
setkey
Операция-действие setkey
устанавливает валидатору публичный ключ, который он будет использовать при подписании блоков.
Параметры:
account
— имя валидатора, которому устанавливается публичный ключ.token_code
— символ застейканного токена.signing_key
— устанавливаемый публичный ключ (подпись валидатора).
updatefunds
Операция-действие updatefunds
используется для обновления текущего размера стейка пользователя.
Параметры:
account
— имя аккаунта, для которого изменяется размер стейка.token_code
— символ застейканного токена.
Размер стейка пользователя может изменяться. Вызовом операции updatefunds
устанавливается актуальное значение для размера стейка пользователя. Эта операция упрощает процедуру вычисления вознаграждения пользователей, в том числе позволяет определить долю, выделяемую для конкретного пользователя. Операция updatefunds
вызывается также при выполнении других операций-действий, например, при выводе токенов или голосовании. То есть, при выполнении активных операций, требующих обновления стейка.
Вызов операции updatefunds
возможен любым пользователем. Авторизация при этом не требуется.
reward
Операция-действие reward
используется для выплаты вознаграждений пользователям с зачислением соответствующих сумм на их балансы.
Параметры:
rewards
— вектор, содержащий имена аккаунтов и соответствующие им выплаты.sym
— символ токенов, в которых выплачивается вознаграждение.
Вызов операции требует авторизации создателя токенов.
pick
Операция-действие pick
обновляет весь список валидаторов, в том числе кандидатов в валидаторы, и уведомляет контракт cyber.stake
об изменениях в списке, а также о появлении нового валидатора, выбранного из числа кандидатов в определенный момент времени.
Параметры:
token_code
— количество токенов, находящихся у кандидата, нотификация о котором отправляется.accounts
— вектор имен аккаунтов, являющихся актуальными валидаторами, а также кандидатами в валидаторы.
Выбор валидаторов из числа кандидатов в валидаторы проводится в смарт-контракте cyber.govern
. Первые n-1
валидаторов из списка, где n
— общее количество валидаторов, выбираются в соответствии с количеством отданных за них голосов с учетом веса каждого голоса. Последний валидатор из этого списка является псевдослучайным и выбирается в соответствии с установленной формулой, учитывающей длительность интервала, прошедшего с момента последнего выбора валидатора, и количество голосов, отданных за данного кандидата.
Кандидаты в валидаторы, не получившие статус валидатора, но располагающиеся в списке в непосредственной близости от первых n-1
валидаторов, получают возможность появиться в числе этих валидаторов через определенный интервал времени.
Приоритеты кандидатов вычисляются в смарт-контракте cyber.govern
с использованием метода get_top
. Этот метод определяет выбранных кандидатов, получивших наибольшее количество голосов, и резервных кандидатов с учетом времени их пребывания в статусе кандидата (с какого времени кандидат остается среди невыбранных). Каждый из кандидатов располагается в списке поля priority
в соответствии с вычисленным для него приоритетом.
Операция pick
вызывается смарт-контрактом cyber.govern
и обновляет значение поля priority
, передвигая всех кандидатов в очереди на позиции в соответствии с их вычисленным приоритетом, и уведомляет cyber.stake
об изменениях в списке кандидатов на текущий момент времени.
Для вызова операции pick
требуются права создателя токенов token_code
.
delegateuse
Операция-действие delegateuse
применяется для делегирования ресурсов стейка (RAM, NET, CPU, Storage) другому пользователю, которые могут быть им использованы по его усмотрению (в отличие от этой операции delegatevote
делегирует ресурсы, которые могут быть использованы только на голосование).
Параметры:
grantor_name
— имя аккаунта, делегатора части стейка.recipient_name
— имя аккаунта, получателя делегируемой части стейка.quantity
— количество делегируемого стейка. Значение должно быть положительным.
Такие ресурсы стейка как RAM, NET, CPU и Storage не могут делегироваться частями в том виде, в котором они представлены в системе. Поэтому делегирование средств стейка выполняется в стоимостном их выражении. Для делегатора вычисляется стоимость потребленных им ресурсов в соответствии с текущими ценами и сравнивается с имеющимся у него стейком.
Делегированная часть стейка не учитывается при расчетах голосов для делегатора, но учитывается при расчетах голосов для получателя этих средств.
При вызове операции delegateuse
смарт-контракт cyber.stake
отправляет уведомление создателю токена, который принимает окончательное решение о делегировании стейка.
В случае делегирования системного токена создателем токена является cyber
. При этом решение о выводе токена принимает смарт-контракт cyber.bios
. Перед делегированием системного токена проверяется стоимость израсходованных делегатором ресурсов. Делегирование выполняется, если остаток у делегатора части средств покрывает затраты на израсходованные им ресурсы.
recalluse
Операция-действие recalluse
используется для отзыва делегированной части стейка.
Параметры:
grantor_name
— имя аккаунта, который отзывает делегируемую им часть стейка.recipient_name
— имя аккаунта, у которого отзывается делегируемая часть стейка.quantity
— количество отзываемой части стейка. Значение должно быть положительным.
Делегированная часть стейка отзываются у получателя сразу и переходит в «замороженное» состояние. Длительность «замороженного» состояния определяется параметром depriving_window
при вызове операции create
. Делегатор может использовать возвращенную ему часть стейка только по истечении этого периода.
Если после делегирования определенной суммы средств аккаунту recipient_name
обратно запрашивается только половина этих средств, а затем запрашивается оставшаяся их часть, то после второго вызова recalluse
возвращаемые средства могут быть использованы только по истечении времени depriving_window
.
claim
Операция-действие claim
используется для получение разрешения на использование отозванных делегированных средств.
Параметры:
grantor_name
— имя аккаунта, который отзывает делегируемую им часть стейка.recipient_name
— имя аккаунта, у которого отзывается делегируемая часть стейка.token_code
— количество отзываемой части стейка. Значение должно быть положительным.
По истечении срока пребывания в «замороженном» состоянии отозванные средства могут быть использованы делегатором не сразу, а только после получения соответствующего разрешения. Вызов claim
запрашивает у смарт-контракта cyber.stake
разрешения на использование выведенных из «замороженного» состояния средств.
Операция привязана ко времени восстановления ресурсов. Средства сразу возвращаются в полном объеме.
Если после вызова recalluse
делегатор примет решение возвратить отозванные средства (или часть средств) обратно аккаунту recipient_name
, то средства для повторного делегирования будут списываться из той части, которая находится в «замороженном» состоянии.
Для выполнения операции требуется авторизация делегатора средств.
get_votes_sum
Встраиваемая функция get_votes_sum
возвращает суммарное количество голосов, имеющихся у кандидатов в валидаторы, получивших наибольшее количество голосов.
Параметры:
token_code
— символ застейканных токенов, по которому определялись голоса.limit
— запрашиваемое количество первых из спискаpriority
кандидатов, у которых определяется суммарное количество голосов. Первыми в списке располагаются кандидаты, получившие наибольшее количество голосов. По умолчанию параметр принимает нулевое значение. Если запрашиваемое количество кандидатов нулевое, то возвращается количество голосов, которые есть у всех кандидатов из спискаpriority
.
get_top
Встраиваемая функция get_top
возвращает список наиболее рейтинговых кандидатов, составленный по определенному принципу.
Параметры:
token_code
— символ застейканных токенов, по которому определялись голоса.elected_num
— запрашиваемое количество кандидатов, получивших наибольшее количества голосов среди избранных в валидаторы.reserve_num
— запрашиваемое количество резервных кандидатов, не попавших в перечень избранных в валидаторы. В перечень резервных попадают кандидаты, набравшие наибольшее количество голосов среди оставшихся с учетом времени, в течение которого каждый из кандидатов не появлялся в списке валидаторов.strict
— условный параметр. Значениеtrue
разрешает в возвращаемом результатеget_top
не учитывать голоса кандидатов, у которых отсутствует публичный ключ. По умолчанию —true
.
Операция get_top
возвращает список кандидатов, составленный из запрашиваемого количества elected_num
избранных в валидаторы и добавленного в него количества reserve_num
резервных с учетом параметра strict
.
Last updated