Батарейка
Назначение смарт-контракта golos.charge
Смарт-контракт golos.charge
выполняет прикладную функцию — позволяет ограничивать активность пользователей в создании постов, комментариев, а также в голосовании за посты. Непосредственного взаимодействия пользователя со смарт-контактом golos.charge
не происходит, обращение к операциям-действиям происходит через смарт контракт публикации.
Принцип работы смарт-контракта golos.charge
Механизм, регулирующий активность пользователя в системе, реализован на основе батареек. Создание батареек позволяет вести учет как отдельных операций пользователя, так и его общую активность. Количество, выделенных пользователю батареек, может быть более одной, каждая из которых может быть настроена на учет одной из операций, выполняемых этим пользователем за определенный интервал времени (например, учет комментариев осуществляется одной батарейкой, отправка голосов в виде «upvote» — другой). Батарейка содержит количественный ресурс, значение которого зависит от наличия суммы вестинга пользователя и частоты выполняемых им операций. На каждую выполняемую операцию пользователя расходуется часть ресурса батарейки с учетом стоимости этой операции. При достижении граничного значения ресурса батарейки выполнение операции блокируется. Ресурс батарейки полностью восстанавливается по истечении времени.
Обращение к батарейкам происходит через вызовы операций-действий. В смарт-контракте golos.charge
реализованы встраиваемая (англ. inline) функция get_stored
и операции-действия use
, useandstore
, removestored
и setrestorer
.
Одним из обязательных параметров операций-действий является token_code
, идентифицирующий конкретный токен. Аккаунт, выполняющий действие с вызовом любого действия, должен быть наделен правами в соответствии с требованиями авторизации издателя токена, которым может являться либо аккаунт-издатель токена, либо аккаунт, которому аккаунт-издатель токена предоставил соответствующие права.
Каждая батарейка идентифицируется следующими параметрами: кодом токена (token_code
) и непосредственно идентификатором батарейки (charge_id
).
У каждого токена может быть более одной батарейки. Конкретная батарейка конкретного токена задается параметром charge_id
. Батарейка представляет собой значение, которое при использовании увеличивается и по истечении времени уменьшается, то есть восстанавливается.
Операция-действие use
Операция-действие use
используется для учета ресурса батарейки при выполнении пользователем каких-либо действий.
Операция-действие use
имеет вид:
Параметры:
user
— имя аккаунта, используемого ресурс батарейки;
token_code
— код токена, имеющего привязку к батарейке charge_id
;
charge_id
— идентификатор батарейки. Данное значение в совокупности с кодом токена token_code
обеспечивают идентификацию батарейки;
price
— сумма средств (в условных единицах батарейки), начисляемая аккаунту user
за используемую часть ресурса батарейки;
cutoff
— пороговое значение ресурса батарейки, при достижении которого прекращается выполнение действия;
vesting_price
— сумма средств (в вестинге), которую необходимо выплатить пользователю user
за выполняемое им действие в случае нехватки ресурса батарейки, то есть в случае, если значение батарейки превысит пороговое значение cutoff
.
Любой из смарт-контрактов может обратиться к батарейке, но не напрямую, а через вызов операции-действия. В случае, если ресурс батарейки не удовлетворяет значению cutoff
, смарт-контракт батарейки выдает соответствующее сообщение с блокировкой выполнения транзакции, в том числе действия, вызвавшего обращение к батарейке.
Для того, чтобы пользователь смог оплатить выполнение действия в случае нехватки ресурса батарейки, необходимо предоставить доступ смарт-контракту батарейки к средствам вестинга этого пользователя, а также право на «сжигание» соответствующей суммы. На балансе пользователя должна быть необходимая сумма вестинга в разблокированном состоянии.
Операция-действие useandstore
Операция-действие useandstore
также как и use
используется для учета ресурса батарейки при выполнении пользователем каких либо действий. В отличие от use
операция-действие useandstore
сохраняет значения используемых ресурсов батареек в таблицах, находящихся внутри смарт-контракта golos.charge
, и остаются доступными по чтению другим смарт-контрактам.
Операция-действие useandstore
имеет вид:
Параметры:
user
— имя аккаунта, используемого ресурс батарейки;
token_code
— код токена, имеющего привязку к батарейке charge_id
;
charge_id
— идентификатор батарейки. Данное значение в совокупности с кодом токена token_code
обеспечивают идентификацию батарейки;
stamp_id
— идентификатор сохраняемого значения ресурса батарейки charge_id
, используемого аккаунтом user
. Значение сохраняется в отведенной для аккаунта user
таблице данной батарейки;
price
— сумма средств (в условных единицах батарейки), начисляемая аккаунту user
за используемую часть ресурса батарейки.
Операция-действие removestored
Операция-действие removestored
используется для удаления ранее сохраненных данных по использованию ресурсов батареек в смарт-контракте батарейки. Ключом к поиску удаляемых данных является совокупность значений параметров charge_id
, token_code
и stamp_id
. Операция-действие removestored
может быть вызвана из любого смарт-контракта.
Операция-действие removestored
имеет вид:
Параметры:
user
— имя аккаунта, используемого ресурс батарейки;
token_code
— код токена, имеющего привязку к батарейке charge_id
;
charge_id
— идентификатор батарейки. Данное значение в совокупности с кодом токена token_code
обеспечивают идентификацию батарейки;
stamp_id
— идентификатор значения ресурса батарейки charge_id
, используемого аккаунтом user
, которое удаляется из таблицы данной батарейки.
Операция-действие setrestorer
Операция-действие setrestorer
используется для задания алгоритма, по которому происходит восстановление ресурса батарейки.
Операция-действие setrestorer
имеет вид:
Параметры:
token_code
— код токена, имеющего привязку к батарейке charge_id
;
charge_id
— идентификатор батарейки. Данное значение в совокупности с кодом токена token_code
обеспечивают идентификацию батарейки;
func_str
— математическое выражение, задающее функцию восстановления ресурса батарейки;
max_prev
— максимально допустимое значение предыдущего ресурса батарейки;
max_vesting
— максимально возможное значение вестинга, которое может быть израсходовано функцией в качестве аргумента в процессе восстановления ресурса батарейки;
max_elapsed
— максимально допустимый период времени с момента предыдущего обращения к батарейки.
Значение параметра func_str
вычисляется задаваемой функцией с тремя переменными, а именно:
p
— задает предыдущее значение ресурса батарейки;
v
— задает значение вестинга пользователя;
t
— задает период времени с момента последнего вызова setrestorer
.
Например, если в качестве параметра func_str
передается строка вида
sqrt(v / 500000) × (t / 150)
,
то батарейка, идентифицируемая параметрами token_code
и charge_id
, будет восстанавливаться в соответствии с этой функцией. При наличии у пользователя суммы средств равной 500 000 (в вестинге) в течение периода 150 (с) значение func_str
составит
func_str = sqrt(500000 / 500000) × (150 / 150) = 1
То есть, за время 150 с значение батарейки увеличится на единицу.
Встраиваемая функция get_stored
Встраиваемая функция get_stored
позволяет определить ресурс батарейки конкретного пользователя в конкретный момент времени.
Встраиваемая функция get_stored
имеет вид:
Параметры:
code
— идентификатор аккаунта;
user
— имя аккаунта, ресурс батарейки которого определяется;
token_code
— код токена, имеющего привязку к батарейке charge_id
;
charge_id
— идентификатор батарейки. Данное значение в совокупности с кодом токена token_code
обеспечивают идентификацию батарейки;
stamp_id
— идентификатор сохраняемого значения ресурса батарейки charge_id
, используемого аккаунтом user
, которое требуется получить из таблицы батарейки.
Значение ресурса батарейки сохраняется в таблице батарейки при выполнении useandstore
. Впоследствие для получения значения из данной таблицы необходимо вызвать get_stored
. Вызов get_stored
не требует дополнительной авторизации.
Данные о сохраненных значений ресурсов батареек доступны для получения из любого смарт-контракта. Функция get_stored
не обрабатывает данные, а только получает сохраненные значения из таблиц смарт-контракта golos.charge
.
Взаимодействие смарт-контракта батарейки с любым из смарт-контрактов позволяет контролировать действия (активность) пользователя в этих смарт-контрактах. Одна батарейка может взаимодействовать одновременно с действиями нескольких смарт-контрактов.
Last updated