Стейк-токены

Назначение смарт-контракта 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 используется для создания стейка отдельному виду (символу) токенов. После создания стейка токены данного вида могут переводиться пользователями в состояние стейка.

void create(
    symbol token_symbol, 
    std::vector<uint8_t> max_proxies, 
    int64_t depriving_window, 
    int64_t min_own_staked_for_election
)

Параметры:

  • token_symbol — символ токена, для которого создается стейк.

  • max_proxies — максимально допустимые значения прокси-аккаунта. Нулевой элемент вектора устанавливает максимально допустимое количество пользователей, которым можно поручить (делегировать) право голосования, если уровень прокси-аккаунта первый. Первый элемент вектора устанавливает максимально допустимое количество частей, на которое может быть разделен стейк, если уровень прокси-аккаунта второй. При наличии в системе прокси четвертого и более уровней вектор будет содержать три и более элементов.

  • depriving_window — длительность периода (в секундах), в течение которого отозванные обратно делегатору средства не могут быть им использованы. Средства могут быть отозваны вызовом операции recallvote. Отозванные средства в течение данного периода не могут учитываться при расчете доли ресурсов.

  • min_own_staked_for_election — минимально допустимое количество застейканных токенов, которое должен иметь пользователь, чтобы быть кандидатом в валидаторы.

Обычные пользователи могут проголосовать либо за одного валидатора, либо передать право голосования только одному прокси-аккаунту.

Прокси-аккаунт может одновременно голосовать за несколько валидаторов. Максимально допустимое количество валидаторов, за которые прокси-аккаунт может голосовать — 30.

Для вызова create требуются права создателя токена token_symbol. Создатель токена, вызвав create, дает возможность другим пользователям переводить токены данного вида в состояние стейка. При создании стейка для системного токена необходимо обладать системными правами.

enable

Операция-действие enable позволяет вывести на время из использования определенный вид токена. Данная операция устанавливает флаг enable в значение true.

void enable(symbol token_symbol)

Параметр token_symbol — символ токена, на который действует установленный в значение true флаг enable.

Данная операция применяется в тестировании для отключения использования токенов определенного символа. На время тестирования флаг enable устанавливается в значение false, то есть отключается ограничение по ресурсам определенного вида токенов. По окончании тестирования флаг должен быть обратно установлен в значение true. Если token_symbol является системным, то при установленном флаге enable на ноде включается ограничение на использование ресурсов по стейку.

Для вызова операции требуются права создателя токена token_symbol.

open

Операция-действие open используется для открытия баланса конкретному пользователю.

void open(
    name owner, 
    symbol_code token_code, 
    std::optional<name> ram_payer = std::nullopt
)

Параметры:

  • owner — имя пользователя, которому открывается баланс.

  • token_code — символ токена, который будет находиться на балансе.

  • ram_payer — имя аккаунта, который оплачивает открытие баланса. Если параметр принимает значение по умолчанию std::nullopt, то открытие баланса оплачивает сам owner.

Для вызова операции требуются права пользователя, который оплачивает открытие баланса. По умолчанию требуются права пользователя owner.

delegatevote

Операция-действие delegatevote используется для делегирования другому аккаунту права на использование стейка (или доли стейка), которым этот аккаунт может распоряжаться по своему усмотрению при голосовании за валидаторов.

void delegatevote(
    name grantor_name, 
    name recipient_name, 
    asset quantity
)

Параметры:

  • grantor_name — имя аккаунта, который делегирует право на использование стейка (или доли стейка). Этим аккаунтом может быть либо обычный пользователь, либо прокси аккаунт с уровнем, выше чем уровень уровень прокси-аккаунта recipient_name.

  • recipient_name — имя прокси-аккаунта, которому доверяется право голоса.

  • quantity — количество застейканных токенов, которыми прокси-аккаунт recipient_name может воспользоваться при голосовании. Параметр должен быть больше нуля.

Пользователь может не принимать участие в голосовании за валидаторов, а передать свое право голоса прокси-аккаунту, делегировав ему свое право на использование определенного количества застейканных токенов. Эти токены (стейка) могут быть использованы только при голосовании за валидаторов.

В зависимости от настроек стейка, право голоса на использование токенов стейка может быть передано далее (вызовом delegatevote) получателю recipient_name, у которого уровень прокси proxy_level меньше, чем у отправителя grantor_name.

Примечание: Поскольку в текущем релизе количество уровней прокси-аккаунтов ограничено тремя (нулевой — валидатор, первый — непосредственно прокси-аккаунт, второй — рядовой пользователь), передача голоса от одного прокси-аккаунта другому невозможна. Прокси-аккаунт, получив право голоса от рядового пользователя может воспользоваться им только при голосовании за валидаторов.

Стейк разделяется на несколько долей. Количество долей зависит от настроек стейка при выполнении операции create и ограничено значением max_proxies. Для обычного пользователя это значение равно единице, дающее право пользователю проголосовать только за одного валидатора.

Для вызова операции delegatevote требуются права аккаунта grantor_name.

recallvote

Операция-действие recallvote используется для возврата права на использование делегированного стейка при голосовании за валидаторов. Объем стейка, право на использование которого отзывается, указывается в процентах и может быть отозван как частично, так и полностью.

void recallvote(
    name grantor_name, 
    name recipient_name, 
    symbol_code token_code, 
    int16_t pct
)

Параметры:

  • grantor_name — имя аккаунта, который отзывает право на использование стейка (или доли стейка) при голосовании за валидаторов.

  • recipient_name — имя аккаунта, от которого отзывается право на использование стейка (доли стейка) при голосовании.

  • token_code — символ застейканного токена.

  • pct — доля стейка (в процентах), право на использование которой отзывается.

    Отозванная доля стейка может быть использована аккаунтом grantor_name сразу по завершении операции recallvote.

Для вызова операции recallvote требуются права аккаунта grantor_name.

setgrntterms

Операция-действие setgrntterms используется для распределения дополнительно выделенных застейканных токенов между валидаторами при голосовании в соответствии с уже установленными пропорциями.

void setgrntterms(
    name grantor_name, 
    name recipient_name, 
    symbol_code token_code, 
    int16_t pct, 
    int16_t break_fee, 
    int64_t break_min_own_staked
)

Параметры:

  • 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 используется для вывода токенов из состояния стейка в состояние ликвидных.

void withdraw(
    name account, 
    asset quantity
)

Параметры:

  • account — имя аккаунта, который выводит токены из стейка.

  • quantity — количество выводимых токенов. Значение должно быть положительным.

При вызове операции withdraw смарт-контракт cyber.stake отправляет уведомление создателю токена, который принимает окончательное решение о выводе токенов. Вывод токенов выполняется сразу без какой-либо задержки.

В случае вывода из стейка системного токена создателем токена является cyber. При этом решение о выводе токена принимает смарт-контракт cyber.bios. Перед выводом системного токена проверяется стоимость использованных пользователем ресурсов. Вывод выполняется, если остаток стейка у пользователя с учетом выводимых средств покрывает затраты на использованные им ресурсы.

Для вызова операции withdraw требуются права аккаунта account.

setproxylvl

Операция-действие setproxylvl устанавливает пользователю уровень прокси-аккаунта.

void setproxylvl(
    name account, 
    symbol_code token_code, 
    uint8_t level
)

Параметры:

  • account — имя аккаунта, для которого устанавливается уровень прокси-аккаунта.

  • token_code — количество токенов пользователя account, находящихся в состоянии стейка.

  • level — устанавливаемый уровень.

Если пользователь намеревается получить статус кандидата в валидаторы, для него должен быть установлен нулевой уровень. Если пользователь намеревается получить статус прокси-аккаунта, для него должен быть установлен первый уровень (в текущем релизе).

Для вызова операции setproxylvl требуются права аккаунта account.

setproxyfee

Операция-действие setproxyfee устанавливает размер комиссии для агента (кандидата в валидаторы), за которого голосовали пользователи.

void setproxyfee(
    name account, 
    symbol_code token_code, 
    int16_t fee
)

Параметры:

  • account — имя агента, за которого проголосовали пользователи.

  • token_code — символ токенов, составляющих вознаграждение агенту.

  • fee — размер комиссионных отчислений от суммы вознаграждения, которые получает агент. Параметр рассчитывается в момент выплаты вознаграждения (в момент выполнения reward). Параметр принимает значения от «0» до «10000» включительно. Значение «0» соответствует «0 %», а «10000» соответствует «100 %».

От поступившей суммы вознаграждения, выделенной агенту, отчисляется комиссия fee и передается агенту account. Остальная часть вознаграждения распределяется между всеми пользователями, проголосовавшими за данного агента.

setminstaked

Операция-действие setminstaked устанавливает минимально возможный размер стейка, выделяемого на голосование самим агентом (кандидатом в валидаторы).

void setminstaked(
    name account, 
    symbol_code token_code, 
    int64_t min_own_staked
)

Параметры:

  • account — имя агента, кандидата в валидаторы.

  • token_code — символ токена, находящегося в стейке..

  • min_own_staked — минимально возможный размер стейка, который выделяется на голосование самим агентом. Значение не может быть отрицательным.

Если кандидат в валидаторы во время голосования устанавливает значение min_own_staked меньше, чем min_own_staked_for_election, то отданные за него голоса автоматически аннулируются.

setkey

Операция-действие setkey устанавливает валидатору публичный ключ, который он будет использовать при подписании блоков.

void setkey(
    name account, 
    symbol_code token_code, 
    public_key signing_key
)

Параметры:

  • account — имя валидатора, которому устанавливается публичный ключ.

  • token_code — символ застейканного токена.

  • signing_key — устанавливаемый публичный ключ (подпись валидатора).

updatefunds

Операция-действие updatefunds используется для обновления текущего размера стейка пользователя.

void updatefunds(
    name account, 
    symbol_code token_code
)

Параметры:

  • account — имя аккаунта, для которого изменяется размер стейка.

  • token_code — символ застейканного токена.

Размер стейка пользователя может изменяться. Вызовом операции updatefunds устанавливается актуальное значение для размера стейка пользователя. Эта операция упрощает процедуру вычисления вознаграждения пользователей, в том числе позволяет определить долю, выделяемую для конкретного пользователя. Операция updatefunds вызывается также при выполнении других операций-действий, например, при выводе токенов или голосовании. То есть, при выполнении активных операций, требующих обновления стейка.

Вызов операции updatefunds возможен любым пользователем. Авторизация при этом не требуется.

reward

Операция-действие reward используется для выплаты вознаграждений пользователям с зачислением соответствующих сумм на их балансы.

void reward(
    std::vector<std::pair<name, int64_t> > rewards, 
    symbol sym
)

Параметры:

  • rewards — вектор, содержащий имена аккаунтов и соответствующие им выплаты.

  • sym — символ токенов, в которых выплачивается вознаграждение.

Вызов операции требует авторизации создателя токенов.

pick

Операция-действие pick обновляет весь список валидаторов, в том числе кандидатов в валидаторы, и уведомляет контракт cyber.stake об изменениях в списке, а также о появлении нового валидатора, выбранного из числа кандидатов в определенный момент времени.

void pick(
    symbol_code token_code, 
    std::vector<name> accounts
)

Параметры:

  • 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 делегирует ресурсы, которые могут быть использованы только на голосование).

void delegateuse(
    name grantor_name, 
    name recipient_name, 
    asset quantity
)

Параметры:

  • grantor_name — имя аккаунта, делегатора части стейка.

  • recipient_name — имя аккаунта, получателя делегируемой части стейка.

  • quantity — количество делегируемого стейка. Значение должно быть положительным.

Такие ресурсы стейка как RAM, NET, CPU и Storage не могут делегироваться частями в том виде, в котором они представлены в системе. Поэтому делегирование средств стейка выполняется в стоимостном их выражении. Для делегатора вычисляется стоимость потребленных им ресурсов в соответствии с текущими ценами и сравнивается с имеющимся у него стейком.

Делегированная часть стейка не учитывается при расчетах голосов для делегатора, но учитывается при расчетах голосов для получателя этих средств.

При вызове операции delegateuse смарт-контракт cyber.stake отправляет уведомление создателю токена, который принимает окончательное решение о делегировании стейка.

В случае делегирования системного токена создателем токена является cyber. При этом решение о выводе токена принимает смарт-контракт cyber.bios. Перед делегированием системного токена проверяется стоимость израсходованных делегатором ресурсов. Делегирование выполняется, если остаток у делегатора части средств покрывает затраты на израсходованные им ресурсы.

recalluse

Операция-действие recalluse используется для отзыва делегированной части стейка.

void recalluse(
    name grantor_name,
    name recipient_name,
    asset quantity
)

Параметры:

  • grantor_name — имя аккаунта, который отзывает делегируемую им часть стейка.

  • recipient_name — имя аккаунта, у которого отзывается делегируемая часть стейка.

  • quantity — количество отзываемой части стейка. Значение должно быть положительным.

Делегированная часть стейка отзываются у получателя сразу и переходит в «замороженное» состояние. Длительность «замороженного» состояния определяется параметром depriving_window при вызове операции create. Делегатор может использовать возвращенную ему часть стейка только по истечении этого периода.

Если после делегирования определенной суммы средств аккаунту recipient_name обратно запрашивается только половина этих средств, а затем запрашивается оставшаяся их часть, то после второго вызова recalluse возвращаемые средства могут быть использованы только по истечении времени depriving_window.

claim

Операция-действие claim используется для получение разрешения на использование отозванных делегированных средств.

void claim(
    name grantor_name,
    name recipient_name,
    symbol_code token_code
)

Параметры:

  • grantor_name — имя аккаунта, который отзывает делегируемую им часть стейка.

  • recipient_name — имя аккаунта, у которого отзывается делегируемая часть стейка.

  • token_code — количество отзываемой части стейка. Значение должно быть положительным.

По истечении срока пребывания в «замороженном» состоянии отозванные средства могут быть использованы делегатором не сразу, а только после получения соответствующего разрешения. Вызов claim запрашивает у смарт-контракта cyber.stake разрешения на использование выведенных из «замороженного» состояния средств.

Операция привязана ко времени восстановления ресурсов. Средства сразу возвращаются в полном объеме.

Если после вызова recalluse делегатор примет решение возвратить отозванные средства (или часть средств) обратно аккаунту recipient_name, то средства для повторного делегирования будут списываться из той части, которая находится в «замороженном» состоянии.

Для выполнения операции требуется авторизация делегатора средств.

get_votes_sum

Встраиваемая функция get_votes_sum возвращает суммарное количество голосов, имеющихся у кандидатов в валидаторы, получивших наибольшее количество голосов.

static inline int64_t get_votes_sum(
    symbol_code token_code,
    size_t limit = 0
)

Параметры:

  • token_code — символ застейканных токенов, по которому определялись голоса.

  • limit — запрашиваемое количество первых из списка priority кандидатов, у которых определяется суммарное количество голосов. Первыми в списке располагаются кандидаты, получившие наибольшее количество голосов. По умолчанию параметр принимает нулевое значение. Если запрашиваемое количество кандидатов нулевое, то возвращается количество голосов, которые есть у всех кандидатов из списка priority.

get_top

Встраиваемая функция get_top возвращает список наиболее рейтинговых кандидатов, составленный по определенному принципу.

static inline std::vector<elected_t> get_top(
    symbol_code token_code,
    uint16_t elected_num,
    uint16_t reserve_num,
    bool strict = true
)

Параметры:

  • token_code — символ застейканных токенов, по которому определялись голоса.

  • elected_num — запрашиваемое количество кандидатов, получивших наибольшее количества голосов среди избранных в валидаторы.

  • reserve_num — запрашиваемое количество резервных кандидатов, не попавших в перечень избранных в валидаторы. В перечень резервных попадают кандидаты, набравшие наибольшее количество голосов среди оставшихся с учетом времени, в течение которого каждый из кандидатов не появлялся в списке валидаторов.

  • strict — условный параметр. Значение true разрешает в возвращаемом результате get_top не учитывать голоса кандидатов, у которых отсутствует публичный ключ. По умолчанию — true.

Операция get_top возвращает список кандидатов, составленный из запрашиваемого количества elected_num избранных в валидаторы и добавленного в него количества reserve_num резервных с учетом параметра strict.

Last updated