Публикация
Назначение смарт-контракта golos.publication
Смарт-контракт golos.publication
обеспечивает работу с постами, в том числе предоставляет возможность пользователям выполнять следующие действия: публиковать посты, оставлять комментарии, голосовать за посты и закрывать посты, а также обеспечивает выплату вознаграждения авторам постов.
Операции-действия смарт-контракта golos.publication
Cмарт-контракт golos.publication
поддерживает следующие операции-действия:
сообщения: createmssg, updatemssg, deletemssg, reblog, erasereblog, setcurprcnt, setmaxpayout;
системные: closemssgs, calcrwrdwt, paymssgrwrd, deletevotes.
Используемые типы данных
процент
16-битовое значение с типами объявления int16_t
или uint16_t
и точностью до сотых долей процента. Процент принимает значения от -10000 до 10000 (например: -10000 = -100 %, 0 = 0 %, 10000 = 100 %, 1234 = 12,34 %).
Отрицательные значения процента задаются типом объявления int16_t
.
mssgid Идентификатор сообщения, структура, содержащая поля:
author
— автор сообщения;permlink
— уникальное имя сообщения в рамках публикаций конкретного автора.
beneficiary Бенефициар, структура, содержащая поля:
account
— аккаунт бенефициара;weight
— процент, доля выплаты бенефициару от суммы авторского вознаграждения за сообщение.
setlimit
Операция-действие setlimit
устанавливает правила, ограничивающие действия пользователей. Механизм ограничения действий пользователей основан на взаимодействии смарт-контрактов публикации и батарейки (golos.charge
). Создается привязка конкретного действия смарт-контракта публикации к конкретной батарейке смарт-контракта батарейки. В операции-действии указывается название действия (например, голосование или публикация поста), указывается идентификатор и параметры определенной батарейки.
Операция-действие setlimit
имеет следующий вид:
Параметры:
act
— название действия. Контракт поддерживает значенияpost
,comment
,vote
иpost bandwidth
;token_code
— код токена (тип данных, однозначно определяющий токен);charge_id
— идентификатор батарейки, ресурсами которой ограничивается действиеact
. К одной батарейке может быть создана привязка нескольких действий. Для действий голосования (upvote
,downvote
,unvote
) значение идентификатора батарейки устанавливается нулевым;price
— цена (в условных единицах) расходуемого ресурса батарейки с идентификаторомcharge_id
за совершаемое действиеact
. Значение ресурса батарейки уменьшается при каждом совершаемом действии и восстанавливается со временем;cutoff
— пороговое значение, ограничивающее снизу ресурс батарейки, при достижении которого действиеact
блокируется;vesting_price
— значении вестинга, которое необходимо выплатить пользователю за выполнение действияact
, в случае исчерпания ресурса батарейки (достижение порогового значения снизу). Действиеact
будет выполнено, если пользователь разрешит снять с его баланса указанную сумму вестинга. Для оплаты необходимо, чтобы на балансе пользователя имелась необходимая сумма вестинга в разблокированном состоянии. (Внимание: в текущем релизе этот параметр не используется и должен быть равен «0»);min_vesting
— минимальное значение вестинга, которое необходимо иметь пользователю на его балансе для выполнения действияact
. (Внимание: в текущем релизе этот параметр не используется и должен быть равен «0»).
Для выполнения операции требуется подпись большинства лидеров.
Взаимодействие смарт-контрактов публикации и батарейки позволяет гибко настраивать ограничения на действия пользователей (например, действия по голосованию за посты, по публикации постов и оставлению комментариев можно соотнести с ресурсами трех разных батареек и тем самым ограничить активность пользователя по каждому из этих действий. Также все эти действия могут иметь привязку к одной и той же батарейки, то есть быть ограниченными ресурсами одной батарейки). За каждое выполняемое пользователем действие ему начисляется значение, соответствующее стоимости расходуемого ресурса батарейки. При достижении в смарт-контракте батарейки порогового значения используемого ресурса батарейки, действия пользователя блокируются до появления в ней необходимого ресурса.
setrules
Операция-действие setrules
устанавливает правила в рамках приложения (сообщества) по распределению вознаграждения между пользователями за публикации постов и курирование.
Операция-действие setrules
имеет следующий вид:
Параметры:
mainfunc
— функция, вычисляющая суммарное значение вознаграждения для автора и кураторов поста в соответствии с установленным алгоритмом (например, линейным алгоритмом или алгоритмом квадратного корня). Используемый в функции алгоритм выбирается делегатами голосованием. Функция содержит два параметра: математическое выражение (непосредственно алгоритм), по которому вычисляется сумма вознаграждения, и максимально допустимое значение аргумента для функции. При установке значений параметров для setrules выполняется их проверка на корректность (в том числе на монотонность и неотрицательность);curationfunc
— функция, вычисляющая значение вознаграждения для каждого из кураторов в соответствии с установленным алгоритмом (аналогично вычислению дляmainfunc
);timepenalty
— функция, вычисляющая вес голоса с учетом времени голосования и длительности штрафного окна;maxtokenprop
— максимально возможное значение вознаграждения (сумма токенов и вестингов), которое может получить автор. Этот параметр устанавливается делегатами голосованием;tokensymbol
— тип токена (в рамках приложения Голос предусматривается хождение только токенов Голоса).
Для вызова операции-действия setrules
требуется наличие в транзакции подписей большинства лидеров.
Пример setrules
с заданием линейных функций вознаграждения и кураторской, а также с отключенным штрафным окном и размером вознаграждения в токене не более 50 %.
createmssg
Операция-действие createmssg
используется для создания сообщения (поста или комментария). Операция-действие имеет следующий вид:
Параметры:
message_id
— идентификатор сообщения;parent_id
— идентификатор родительского сообщения. Для создания поста полеparent_id.author
должно быть пустым;beneficiaries
— список бенефициаров, может быть пустым;tokenprop
— доля вознаграждения, выплачиваемая в ликвидных токенах (остаток выплачивается в вестинге). Данное значение ограничено сверху параметромmaxtokenprop
, задаваемым вset_rules
;vestpayment
—true
, если пользователь дает разрешение на оплату вестингом перерасхода ресурса батарейки (сообщение отправляется независимо от ресурса батарейки). (Внимание: этот параметр в текущем релизе не используется и должен принимать значениеfalse
);headermssg
— заголовок сообщения;bodymssg
— тело сообщения;languagemssg
— язык сообщения;tags
— список тэгов;jsonmetadata
— метаданные в формате JSON;curators_prcnt
— доля (в процентах), отчисляемая кураторам, от общей суммы вознаграждения за созданное сообщение. Значение параметра задается автором сообщения в рамках диапазона значений, установленного лидерами. Параметр является необязательным и по умолчанию принимает значение параметраmin_curators_prcnt
;max_payout
— максимально возможная сумма вознаграждения за сообщение, выплачиваемая из пула, к которому данное сообщение имеет привязку. Сумма вознаграждения устанавливается автором. Параметр является необязательным и по умолчанию принимает значениеasset::max_amount
. Этот параметр также может быть использован для создания сообщений без выплат.
Параметр parent_id
идентифицирует родительское сообщение, на которое создается ответ с использованием createmssg
в виде сообщения.
Для запуска операции-действия createmssg
требуется наличие в транзакции подписи аккаунта-автора сообщения.
Ключ, по которому ведется поиск сообщения, имеет привязку к параметрам account
и permlink
.
updatemssg
Операция-действие updatemssg
используется для внесения пользователем изменений в ранее отправленное им сообщение. Операция-действие updatemssg
имеет следующий вид:
Параметры:
message_id
— идентификатор редактируемого сообщения;headermssg
— заголовок редактируемого сообщения;bodymssg
— тело редактируемого сообщения;languagemssg
— язык редактируемого сообщения;tags
— тэг, который будет присвоен редактируемому сообщению;jsonmetadata
— метаданные в формате JSON.
Транзакция, содержащая операцию-действие updatemssg
, должна быть подписана аккаунтом-автором сообщения.
deletemssg
Операция-действие deletemssg
используется для удаления пользователем сообщения, отправленного им ранее. Операция-действие deletemssg
имеет следующий вид:
Параметр:
message_id
— идентификатор удаляемого сообщения.
Сообщение не может быть удалено в следующих случаях:
на сообщение создан комментарий;
сообщение имеет положительный вес всех отданных за него голосов. Вес голоса пользователя зависит от используемого им вестинга и силы голоса.
Транзакция, содержащая операцию-действие deletemssg
, должна быть подписана аккаунтом-автором сообщения.
upvote
Операция-действие upvote
используется для подачи пользователем голоса вида «за» при голосовании за сообщение. Операция-действие имеет следующий вид:
Параметры:
voter
— имя голосующего аккаунта;message_id
— идентификатор сообщения;weight
— вес голоса (процент) аккаунтаvoter
.
Транзакция, содержащая операцию-действие upvote
, должна быть подписана аккаунтом voter
.
downvote
Операция-действие downvote
используется для подачи пользователем голоса вида «против» при голосовании за сообщение. Операция-действие имеет следующий вид:
Параметры:
voter
— имя голосующего аккаунта;message_id
— идентификатор сообщения;weight
— вес голоса (процент) аккаунтаvoter
(указывается положительное значение веса).
Транзакция, содержащая операцию-действие downvote
, должна быть подписана аккаунтом voter
.
unvote
Операция-действие unvote
используется для отзыва пользователем собственного голоса, отданного им ранее.
Операция-действие unvote
имеет следующий вид:
Параметры:
voter
— имя аккаунта, удаляющего свой голос от сообщения;message_id
— идентификатор сообщения.
Транзакция, содержащая операцию-действие unvote
, должна быть подписана аккаунтом voter
.
closemssgs
Операция-действие closemssgs
является системной и используется для «закрытия» сообщений, для которых наступило время выплат. Операция -действие closemssgs
имеет следующий вид:
Параметр:
payer
— имя аккаунта, оплачивающего хранение данных.
reblog
Операция-действие reblog
используется для размещения поста, заимствованного у другого автора в рамках данного смарт-контракта, а также для добавления собственного заголовка и текста к посту в виде заметки. Операция-действие reblog
имеет следующий вид:
Параметры:
rebloger
— имя аккаунта, выполняющего публикацию заимствованного поста;message_id
— идентификатор поста-оригинала;headermssg
— заголовок добавляемой заметки. Данное поле может быть пустым;bodymssg
— тело добавляемой заметки. Данное поле может быть пустым, если полеheadermssg
также является пустым.
На операцию-действие reblog
введены следующие ограничения:
Не допускается выполнять
reblog
собственного поста, то есть автором которого является аккаунтrebloger
.При наличии заголовка заметки
headermssg
присутствие ее телаbodymssg
является обязательным (реблог без заголовка, а также реблог без заголовка и его тела допускается).Длина строки заголовка добавляемой заметки не должна превышать 256 символов.
Транзакция, содержащая операцию-действие reblog
, должна быть подписана аккаунтом rebloger
.
erasereblog
Операция-действие erasereblog
используется для удаления ранее размещенного реблога. Операция-действие имеет следующий вид:
Параметры:
rebloger
— имя аккаунта, выполняющего удаление реблога;message_id
— идентификатор поста-оригинала.
Транзакция, содержащая операцию-действие erasereblog
, должна быть подписана аккаунтом rebloger
.
setcurprcnt
Операция-действие setcurprcnt
используется автором поста для задания или изменения доли (в процентах), отчисляемой кураторам от общего вознаграждения за пост. Операция-действие setcurprcnt
имеет следующий вид:
Параметры:
message_id
— идентификатор поста;curators_prcnt
— доля (процент) отчисляемая кураторам от общей суммы вознаграждения.
После начала голосования за пост изменение доли выплаты кураторам недопустимо.
Транзакция, содержащая операцию-действие setcurprcnt
, должна быть подписана автора поста message_id.author
.
setmaxpayout
Операция-действие setmaxpayout
используется для установки автором максимально возможного вознаграждения за отправленное им сообщение. Устанавливая нулевое значение, автор отказывается от выплат за сообщение. Операция-действие setmaxpayout
имеет следующий вид:
Параметры:
message_id
— идентификатор сообщения, для которого устанавливается максимальное вознаграждение;max_payout
— максимально возможная сумма вознаграждения за сообщение, выплачиваемая из пула, к которому данное сообщение имеет привязку. Сумма устанавливается автором в том виде средств (токенов), которые имеются в данном пуле.
На изменение параметра max_payout
накладываются следующие ограничения:
параметр можно изменять только для открытых сообщений;
параметр можно изменять только для сообщений, которые еще не имеют голосов;
параметр можно изменять только в сторону уменьшения по отношению к предыдущему его значению. Значение параметра должно быть неотрицательным.
Операция-действие setmaxpayout
требует наличия в транзакции подписи автора сообщения.
calcrwrdwt
Операция-действие calcrwrdwt
является внутренней и пользователю недоступна. Используется для вычисления веса поста с учетом количества публикаций, выполненных автором за определенное время.
Операция-действие имеет следующий вид:
Параметры:
account
— имя аккаунта автора поста;mssg_id
— внутренний идентификатор поста;post_charge
— текущий ресурс батарейки, ограничивающий активность пользователя в рамках размещения постов. С увеличением количества постов, размещаемых автором за определенное время, уменьшается ресурс батарейки и сумма выплат за посты.
Для выполнения данной операции требуется подпись аккаунта смарт-контракта golos.publication
.
paymssgrwrd
Операция-действие paymssgrwrd
является внутренней. Используется для выплат сумм вознаграждений за «закрытое» сообщение кураторам, бенефициарам и автору. Операция-действие имеет следующий вид:
Параметр:
message_id
— идентификатор сообщения, за который выплачиваются суммы вознаграждений.
При вызове paymssgrwrd
возможна только частичная выплата вознаграждений. В этом случае допускаются повторные вызовы paymssgrwrd
.
Операция может быть выполнена любым аккаунтом.
deletevotes
Операция-действие deletevotes
является внутренней. Используется для освобождения памяти, занимаемой записями о голосах за сообщения, для которых выплачены награды. Операция-действие имеет следующий вид:
Параметры:
message_id
— внутренний идентификатор сообщения;author
— автор поста.
При вызове deletevotes
возможно также не полное, а только частичное удаление голосов. В этом случае допускаются повторные вызовы deletevotes
.
Для выполнения данной операции требуется подпись аккаунта смарт-контракта golos.publication
.
setparams
Операция-действие setparams
используется для настройки параметров смарт-контракта golos.publication
. Операция-действие имеет следующий вид:
Параметр:
params
— список структур с изменяемыми параметрами контракта.
Вызов setparams
в смарт-контракте golos.publication
позволяет настроить следующие переменные:
max_vote_changes
— максимально возможное количество переголосований пользователя за сообщение (показывает, сколько раз пользователь может поменять свой голос за сообщение, включая снятие голоса);cashout_window
— параметры окна выплат:window
— интервал времени, по истечении которого осуществляется выплата вознаграждения за сообщение;upvote_lockout
— интервал времени перед «закрытием» поста, на протяжении которого запрещается подача голоса вида «за», но разрешается голос вида «против»;
max_beneficiaries
— максимально возможное количество бенефициаров;max_comment_depth
— максимально возможная глубина комментариев (показывает допустимый уровень вложенности дочерних комментариев относительно корневого);social_acc
— имя аккаунта social;referral_acc
— имя аккаунта referral;curators_prcnt
— доля (в процентах), отчисляемая кураторам, от общей суммы вознаграждения за сообщение. Устанавливает пороговые значения (min_curators_prcnt
иmax_curators_prcnt
), в рамках которых автор сообщения может задавать собственное процентное значение отчислений кураторам;bwprovider
— аккаунт провайдера ресурсовbandwidth
и используемое разрешение (типpermission_level
);min_abs_rshares
— минимальное абсолютное значениеrshares
для операций голосования. Голоса с меньшим значением будут отклонены.
Определение сумм вознаграждений за публикацию на веб-сайте приложения Голос
После публикации сообщения, но до момента его закрытия, его автор, кураторы и бенефициары могут проявлять интерес к процессу голосования за это сообщение, а также к прогнозируемым суммам вознаграждений за него. Пользователям предоставляется возможность на веб-сайте приложения Голос получать актуальную информацию о процессе голосования и прогнозируемых выплатах за сообщение.
В смарт-контракте golos.publication
реализована логика, позволяющая рассчитать все необходимые выплаты за пост и отобразить текущие результаты расчета на веб-сайте приложения Голос. Расчёт основан на обработке актуальных данных, получаемых из сообщений от событийной модели Event Engine. Результаты расчета корректируются в реальном времени после каждого принятого сообщения от Event Engine и зависят в основном от таких параметров как размер пула вознаграждений, количество появляющихся сообщений, а также «вес» каждого голосующего пользователя.
В этом разделе приводятся методы, которые могут быть применены в приложениях для определения (прогнозируемых) сумм вознаграждений в процессе голосования за пост в режиме реального времени, в том числе:
общей суммы вознаграждения за пост;
общей суммы вознаграждения кураторам поста;
сумм вознаграждения для каждого из кураторов поста;
общей суммы вознаграждения бенефициарам поста;
сумм вознаграждения для каждого из бенефициаров поста;
суммы вознаграждения автору поста.
Данные, на основе которых определяются вознаграждения за пост
С момента создания поста и до момента его закрытия проводится голосование за этот пост. Размер вознаграждения за созданный пост в основном зависит от результатов голосования за него и наличия средств в пуле вознаграждений. Пул вознаграждения выбирается по времени создания поста.
Каждый поданный за пост голос регистрируется в смарт-контракте публикации как событие, информация о котором отправляется в событийную модель Event Engine и далее по запросу в приложение Голос.
Методы вычисления сумм вознаграждений за пост в режиме реального времени в каждом из приложений могут быть различными. Рекомендуется в методах использовать получаемую от Event Engine информацию о следующих событиях: rewardweight
, poststate
, poolstate
и votestate
.
Событие rewardweight
Структура события rewardweight
содержит данные о весе вознаграждения за пост.
Параметры:
message_id
— идентификатор поста;rewardweight
— выплачиваемая доля вознаграждения (в процентах) за пост с учетом наложенного штрафа.
Активность каждого автора ограничена, то есть автор может опубликовать только определенное количество постов за установленный интервал времени. Если активность автора не превышает установленное для него ограничение, то штраф автору не начисляется и параметр rewardweight
принимает значение 100%. В противном случае за каждую сверх-нормативную публикацию автору будет динамически начисляться штраф в размере от 0 до 100 %. Соответственно значение rewardweight
за каждую сверх-нормативную публикацию будет уменьшаться на величину штрафа.
Событие rewardweight
отсылается только в случае штрафа, при 100 % вознаграждении событие не отсылается.
Событие poststate
Структура события poststate
содержит данные о текущем состоянии поста.
Параметры:
message_id
— идентификатор сообщения;netshares
— доля вознаграждения, выделяемая в пуле за пост (значение параметра вычисляется как сумма положительных значенийvoteshares
всех голосов);voteshares
— доля вознаграждения за пост, определяемая отдельным голосом с учётом его знака (значение отдельного голоса вычисляется как произведение количества вестинга голосующего на его вес. Параметр может принимать как положительное, так и отрицательное значения. Голосу вида «против» присваивается знак «минус», голосу вида «за» присваивается знак «плюс»);sumcuratorsw
— суммарный вес голосов всех кураторов на текущий момент времени.sharesfn
— значение, вычисленное функцией вознаграждения (mainfunc
), применённой кnetshares
сообщения.
Событие poolstate
Структура события poolstate
содержит данные о текущем состоянии пула вознаграждений.
Параметры:
created
— время создания пула (идентификатор пула);msgs
— количество сообщений, ожидающих вознаграждений из пулаcreated
;funds
— количество токенов в пуле вознаграждений;rshares
— суммарное значениеrshares
всех постов в пуле;rsharesfn
— суммарное значениеsharesfn
всех постов в пуле.
Событие votestate
Структура события votestate
содержит данные о текущих результатах голосования за сообщение.
Параметры:
voter
— имя аккаунта (пользователя), который голосует за сообщение;message_id
— идентификатор сообщения;weight
— вес голоса аккаунтаvoter
(процент). Во время голосования вес голоса указывается с точностью до сотой доли процента в виде целочисленного значения в интервале от 0 до 10000 (значение 10000 соответствует 100 %). Вес голоса «против» указывается со знаком «минус»;curatorsw
— «вес» куратора);rshares
— условный параметр, используемый в расчетах вознаграждений за пост. Значение параметра определяется как произведение количества активного вестинга голосующего на вес голоса в процентах (rshares = eff_vesting * weight / 10000
). Параметр может принимать как положительное, так и отрицательное значения. Голосу вида «против» присваивается знак «минус».
Метод вычисления общей суммы вознаграждения за пост
Для определения прогнозируемой суммы вознаграждения за пост в режиме реального времени рекомендуется воспользоваться формулой
Компоненты формулы:
payout
— результирующая общая сумма вознаграждения за пост на момент получения данных от событийной модели;reward_weight = rewardweight::reward_weight
— вес вознаграждения за пост;funds = poolstate::state.funds
— общее количество токенов в пуле вознаграждений;sharesfn = poststate::sharesfn
— доля токенов, выделенных на вознаграждение за пост, от общего их количества в пуле вознаграждения (значение параметра зависит от веса поста);rsharesfn = poolstate::state::rsharesfn
— количество токенов, выделенных на вознаграждение всех постов в пуле вознаграждения (значение параметра зависит от суммарного веса всех постов).
Компонента reward_weight
показывает долю авторского вознаграждения за публикацию с учетом возможного наложенного на данную публикацию штрафа. Количество публикаций в сутки по умолчанию не должно превышать четырех. За превышение этого количества автору начисляется штраф. Значение reward_weight
рассчитывается (как и в блокчейне Голос) по формуле
Компонента postbw_charge
показывает ресурс соответствующей батарейки. Каждое использование батарейки изменяет ресурс на 100 %. Ресурс воcстанавливается полностью, если в течение суток с момента создания предыдущего поста не создается ни один пост (линейное восстановление, пропорциональное разряду и времени относительно предыдущего созданного поста).
Для вычисления payout
по формуле (1) необходимо использовать данные, полученные от событийной модели только в один и тот же момент времени.
Метод вычисления сумм вознаграждения кураторам за пост
Общая сумма кураторских вознаграждений представляет собой часть средств в виде процентного отчисления от общей суммы вознаграждения за пост. Значение процентного отчисления curators_prcnt
автор может указать самостоятельно во время создания поста. Если автор не указывает этот параметр, то в качестве него из таблицы pstngparams
берется параметр min_curators_prcnt
— минимально возможная доля, выделяемая кураторам от общего вознаграждения за пост.
Для определения общей суммы вознаграждения кураторов рекомендуется воспользоваться формулой
Компоненты формулы:
curation_payout
— результирующая общая сумма вознаграждения кураторам за пост на момент получения данных от событийной модели;curators_prcnt
— доля (в процентах), отчисляемая кураторам от общей суммы вознаграждения за пост;payout
— общая сумма вознаграждения за пост, вычисленная по формуле (1).
Вычисленная по формуле (2) общая сумма вознаграждения распределяется между кураторами в соответствии с правилами, принятыми в приложении. Ниже приводится рекомендуемый метод определения суммы вознаграждения для каждого из кураторов.
Для определения суммы вознаграждения curator_rewardⱼ
отдельному куратору j рекомендуется воспользоваться формулой
Компоненты формулы:
curation_payout
— общая сумма вознаграждения кураторам за пост, вычисленная по формуле (2);curatorswⱼ = votestate::curatorswⱼ
— вес голоса куратора j, отдавшего за пост голос вида «за»;weights_sum = poststate::weights_sum
— общий вес голосов кураторов, отдавших за пост голоса вида «за»;(curatorswⱼ / weights_sum)
— доля, выделяемая куратору j от общей суммы вознаграждения кураторам.
Вычисление суммы вознаграждения по формуле (3) выполняется для каждого куратора, данные о котором содержатся в структуре vote_event
.
После вычисления всех сумм вознаграждений кураторам может появиться остаточная (невостребованная) сумма, образуемая за счет штрафов во время голосования (например, за раннее голосование). Этот штраф не учитывается в суммарном значении sumcuratorsw
, но влияет на величину curatorsw
конкретного голоса. Возможная остаточная сумма в виде «сдачи» будет возвращена обратно в пул вознаграждения за посты. Эта остаточная сумма unclaimed_rewards
вычисляется по формуле
Компоненты формулы:
curation_payout
— общая сумма вознаграждения кураторам за пост, вычисленная по формуле (2);∑(curator_rewardⱼ)
— сумма всех выплат, вычисленных по формуле (3).
Метод вычисления сумм вознаграждения бенефициарам за пост
Та часть средств, которая выделяется автору в виде вознаграждения за пост, распределяется между бенефициарами и автором этого поста. Доля общей суммы вознаграждений, выделяемой бенефициарам, а также количество бенефициаров, определяется самим автором во время публикации поста. Правила, в соответствии с которыми распределяется вознаграждение между бенефициарами, устанавливаются для каждого приложения отдельно. Ниже приводится рекомендуемый метод определения суммы вознаграждения для каждого из кураторов.
Для определения суммы вознаграждения ben_rewardⱼ
бенефициару j рекомендуется воспользоваться формулой
Компоненты формулы:
payout
— общая сумма вознаграждения за пост, вычисленная по формуле (1);curation_payout
— общая сумма вознаграждения кураторам за пост, вычисленная по формуле (2);(payout - curation_payout)
— общая сумма вознаграждения, выделяемая бенефициарам и автору поста;weightⱼ
— вес вознаграждения, выделяемая бенефициару j. Устанавливается автором во время публикации поста.
Вычисление суммы вознаграждения по формуле (5) выполняется для каждого бенефициара, данные о котором приводятся в таблице message
поля beneficiaries
— массив, содержащий структуры с полями имен и процентных отчислений.
Общая сумма выплат бенефициарам ben_payout_sum
вычисляется по формуле
Определение размера вознаграждения автору поста
Для определения размера вознаграждения author_reward
автору поста рекомендуется воспользоваться формулой
Компоненты формулы:
payout
— общая сумма вознаграждения за пост, вычисленная по формуле (1);curation_payout
— общая сумма вознаграждения кураторам за пост, вычисленная по формуле (2);ben_payout_sum
— общая сумма выплат бенефициарам, вычисленная по формуле (6).
Определение общей суммы вознаграждения за пост в токенах и вестинге
Часть вознаграждения за пост выплачивается в виде вестинга, а часть — в виде токенов. Процентное их соотношение указывается во время создания поста. После вычисления суммы вознаграждения за пост по формуле (1) можно определить количество ликвидных токенов, а также вестинга, составляющих данное вознаграждение.
Для вычисления количества ликвидных токенов token_payout
, выделяемых в виде вознаграждения за пост в режиме реального времени, рекомендуется воспользоваться формулой
Компоненты формулы:
payout
— общая сумма вознаграждения за пост, вычисленная по формуле (1);tokenprop = post::tokenprop
— процентное содержание токенов в вознаграждении.
Количество вестинга в вознаграждении vesting_payout
составляет
Заключение
Представленные методы вычисления сумм вознаграждений за пост в режиме реального времени предназначены для их применения в приложении Голос. Данные методы носят рекомендательный характер и могут быть также применены в других приложениях.
Last updated