Публикация

Назначение смарт-контракта golos.publication

Смарт-контракт golos.publication обеспечивает работу с постами, в том числе предоставляет возможность пользователям выполнять следующие действия: публиковать посты, оставлять комментарии, голосовать за посты и закрывать посты, а также обеспечивает выплату вознаграждения авторам постов.

Операции-действия смарт-контракта golos.publication

Cмарт-контракт golos.publication поддерживает следующие операции-действия: setlimit, setrules, createmssg, updatemssg, deletemssg, downvote, upvote, closemssg, reblog, setcurprcnt, setmaxpayout, calcrwrdwt, paymssgrwrd, setparams.

Операция-действие setlimit

Операция-действие setlimit устанавливает правила, ограничивающие действия пользователей. Механизм ограничения действий пользователей основан на взаимодействии смарт-контрактов публикации и батарейки (golos.charge). Создается привязка конкретного действия смарт-контракта публикации к конкретной батарейке смарт-контракта батарейки. В операции-действия указывается название действия (например, голосование или публикация поста), указывается идентификатор и параметры определенной батарейки.

Операция-действие setlimit имеет следующий вид:

setlimit(
    std::string act,
    symbol_code token_code,
    uint8_t     charge_id,
    int64_t     price,
    int64_t     cutoff,
    int64_t     vesting_price,
    int64_t     min_vesting
);

Параметры: act — название действия; token_code — код токена (тип данных, однозначно определяющий токен); charge_id — идентификатор батарейки, ресурсами которой ограничивается действие act. К одной батарейке может быть создана привязка нескольких действий. Для действий голосования (upvote, downvote, unvote) значение идентификатора батарейки устанавливается нулевым; price — цена (в условных единицах) расходуемого ресурса батарейки с идентификатором charge_id за совершаемое действие act. Значение ресурса батарейки уменьшается при каждом совершаемом действии и восстанавливается со временем; cutoff — пороговое значение, ограничивающее снизу ресурс батарейки, при достижении которого действие act блокируется; vesting_price — значении вестинга, которое необходимо выплатить пользователю за выполнение действия act, в случае исчерпания ресурса батарейки (достижение порогового значения снизу). Действие act будет выполнено, если пользователь разрешит снять с его баланса указанную сумму вестинга. Для оплаты необходимо, чтобы на балансе пользователя имелась необходимая сумма вестинга в разблокированном состоянии; min_vesting — минимальное значение вестинга, которое необходимо иметь пользователю на его балансе для выполнения действия act.

Взаимодействие смарт-контрактов публикации и батарейки позволяет гибко настраивать ограничения на действия пользователей (например, действия по голосованию за посты, по публикации постов и оставлению комментариев можно соотнести с ресурсами трех разных батареек и тем самым ограничить активность пользователя по каждому из этих действий. Также все эти действия могут иметь привязку к одной и той же батарейки, то есть быть ограниченными ресурсами одной батарейки). За каждое выполняемое пользователем действие ему начисляется значение, соответствующее стоимости расходуемого ресурса батарейки. При достижении в смарт-контракте батарейки порогового значения используемого ресурса батарейки, действия пользователя блокируются до появления в ней необходимого ресурса.

Операция-действие setrules

Операция-действие setrules устанавливает правила в рамках приложения (сообщества) по распределению вознаграждения между пользователями за публикации постов и курирование. Операция-действие setrules имеет следующий вид:

void setrules(
    const funcparams& mainfunc,
    const funcparams& curationfunc,
    const funcparams& timepenalty,
    int64_t           curatorsprop,
    symbol            tokensymbol
);

Параметры: mainfunc — функция, вычисляющая суммарное значение вознаграждения для автора и кураторов поста в соответствии с установленным алгоритмом (например, линейным алгоритмом или алгоритмом квадратного корня). Используемый в функции алгоритм выбирается делегатами голосованием. Функция содержит два параметра: математическое выражение (непосредственно алгоритм), по которому вычисляется сумма вознаграждения, и максимально допустимое значение аргумента для функции. При установке значений параметров для setrules выполняется их проверка на корректность (в том числе на монотонность и неотрицательность); curationfunc — функция, вычисляющая значение вознаграждения для каждого из кураторов в соответствии с установленным алгоритмом (аналогично вычислению для mainfunc); timepenalty — функция, вычисляющая вес голоса с учетом времени голосования и длительности штрафного окна; maxtokenprop — максимально возможное значение вознаграждения (сумма токенов и вестингов), которое может получить автор. Этот параметр устанавливается делегатами голосованием; tokensymbol — тип токена (в рамках приложения Голос предусматривается хождение только токенов Голоса).

Правом на запуск операции-действия setrules обладает делегат приложения. Для запуска операции-действия setrules требуется наличие в транзакции подписи смарт-контракта golos.publication (multisig-аккаунта).

Операция-действие createmssg

Операция-действие createmssg используется для создания сообщения в виде ответа на ранее полученное (родительское) сообщение. Операция-действие createmssg имеет следующий вид:

void createmssg(
    mssgid          message_id,
    mssgid          parent_id,
    std::vector<structures::beneficiary> beneficiaries,
    int64_t         tokenprop,
    bool            vestpayment,
    std::string     headermssg,
    std::string     bodymssg,
    std::string     languagemssg,
    std::vector<structures::tag> tags,
    std::string     jsonmetadata,
    std::optional<uint16_t> curators_prcnt,
    std::optional<asset> max_payout
);

Параметры: message_id — идентификатор ответного сообщения. Параметр имеет вид структуры, содержащую поля: author — автор сообщения, permlink — уникальное имя сообщения в рамках публикаций конкретного автора; parent_id — идентификатор родительского сообщения. Параметр содержит поля: author — автор родительского сообщения, permlink — уникальное имя сообщения в рамках публикаций автора родительского сообщения; beneficiaries — значение в виде структуры, содержащей имена бенефициаров и долю (в процентах) выплаты им от суммы вознаграждения за сообщение; tokenprop — размер вознаграждения (количество токенов). Данное значение ограничено сверху параметром maxtokenprop, задаваемым в set_rules; vestpaymenttrue, если пользователь дает разрешение на оплату в вестингах отправки сообщения в случае исчерпания ресурса батарейки (сообщение отправляется независимо от ресурса батарейки). По умолчанию принимает значение false; headermssg — заголовок сообщения; bodymssg — тело сообщения; languagemssg — язык сообщения; tags — тэг, который присваивается сообщению; jsonmetadata — метаданные в формате JSON; curators_prcnt — доля (в процентах), отчисляемая кураторам, от общей суммы вознаграждения за созданное сообщение. Значение параметра задается автором сообщения в рамках диапазона значений, установленного делегатами. По умолчанию данный параметр принимает нулевое значение curators_prcnt = std::nullopt; max_payout — максимально возможная сумма вознаграждения за сообщение, выплачиваемая из пула, к которому данное сообщение имеет привязку. Сумма устанавливается автором в том виде средств (токенов), которые имеются в данном пуле. Параметр является произвольным (необязательным) и по умолчанию принимает значение asset::max_amount.

Параметры parentaccи parentprmlnk идентифицируют родительское сообщение, на которое создается ответ с использованием createmssg в виде сообщения.

Для запуска операции-действия createmssg требуется наличие в транзакции подписи аккаунта-автора сообщения.

Ключ, по которому ведется поиск сообщения, имеет привязку к параметрам account и permlink.

Операция-действие updatemssg

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

Операция-действие updatemssg имеет следующий вид:

void updatemssg(
    mssgid          message_id,
    std::string     headermssg,
    std::string     bodymssg, 
    std::string     languagemssg,
    std::vector<structures::tag> tags,
    std::string     jsonmetadata
);

Параметры: message_id — идентификатор редактируемого сообщения. Параметр содержит поля: author — автор редактируемого сообщения, permlink — уникальное имя сообщения в рамках публикаций данного автора; headermssg — заголовок редактируемого сообщения; bodymssg — тело редактируемого сообщения; languagemssg — язык редактируемого сообщения; tags — тэг, который будет присвоен редактируемому сообщению; jsonmetadata — метаданные в формате JSON.

Для запуска операции-действия updatemssg требуется наличие в транзакции подписи аккаунта-автора сообщения.

Операция-действие deletemssg

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

Операция-действие deletemssg имеет следующий вид:

void deletemssg(mssgid   message_id);

Параметр message_id — идентификатор удаляемого сообщения. Параметр содержит поля: author — имя аккаунта автора сообщения, permlink — уникальное имя сообщения в рамках публикаций данного автора.

Сообщение не может быть удалено в следующих случаях:

  • на сообщение создан комментарий;

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

Для запуска операции-действия deletemssg требуется наличие в транзакции подписи аккаунта-автора сообщения.

Операция-действие upvote

Операция-действие upvote используется для подачи пользователем голоса в виде «upvote» при голосовании за сообщение. Операция-действие upvote имеет следующий вид:

void upvote(
    name     voter,
    mssgid   message_id,
    uint16_t weight
);

Параметры: voter — имя голосующего аккаунта; message_id — идентификатор поста, за который голосует voter. Параметр содержит поля: author — автор поста, permlink — уникальное имя поста в рамках публикаций данного автора; weight — вес голоса аккаунта voter.

Операция-действие upvote требует наличия подписи в транзакции аккаунта voter.

Операция-действие downvote

Операция-действие downvote используется для подачи пользователем голоса в виде «downvote» при голосовании за сообщение. Операция-действие downvote имеет следующий вид:

void downvote(
    name      voter,
    mssgid    message_id,
    uint16_t  weight
);

Параметры: voter — имя голосующего аккаунта; message_id — идентификатор поста, за который голосует voter. Параметр содержит поля: author — автор поста, permlink — уникальное имя поста в рамках публикаций данного автора; weight — вес голоса аккаунта voter.

Операция-действие downvote требует наличия подписи в транзакции аккаунта voter.

Операция-действие unvote

Операция-действие unvote используется для отзыва пользователем собственного голоса вида upvote или downvote, отданного им ранее. Операция-действие unvote имеет следующий вид:

void unvote(
    name     voter,
    mssgid   message_id
);

Параметры: voter — имя аккаунта, удаляющего свой голос с сообщения; message_id — идентификатор поста, у которого отзывается голос. Параметр содержит поля: author — автор поста, permlink — уникальное имя поста в рамках публикаций данного автора.

Операция-действие unvote требует наличия подписи в транзакции аккаунта voter.

Операция-действие closemssg

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

void close_message(mssgid message_id)

Параметр: message_id — идентификатор закрывающегося поста. Параметр содержит поля: author — автор поста, permlink — уникальное имя поста в рамках публикаций данного автора.

Операция-действие closemssg требует выполнения условий:

  • закрытие поста должно происходить по истечении времени cashout_window:window;

  • транзакция должна быть подписана аккаунтом смарт-контракта Golos.publication.

Операция-действие reblog

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

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

Операция-действие reblog имеет следующий вид:

void reblog(
    name rebloger,
    structures::mssgid message_id,
    std::string headermssg,
    std::string bodymssg
)

Параметры: rebloger — имя аккаунта, выполняющего публикацию заимствованного поста; message_id — идентификатор поста-оригинала. Параметр содержит поля: author — автор поста-оригинала, permlink — уникальное имя поста-оригинала в рамках публикаций его автора; headermssg — заголовок добавляемой заметки. Данное поле может быть пустым; bodymssg — тело добавляемой заметки. Данное поле может быть пустым.

На операцию-действие reblog введены следующие ограничения:

  • Не допускается выполнять reblog собственного поста, то есть автором которого является аккаунт rebloger.

  • Не допускается выполнять reblog только одного заголовка поста-оригинала. Наличие тела поста-оригинала обязательно.

  • Длина строки заголовка добавляемой заметки не должна превышать 256 символов.

Операция-действие reblog требует наличия подписи в транзакции аккаунта rebloger.

Операция-действие setcurprcnt

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

Операция-действие setcurprcnt имеет следующий вид:

void set_curators_prcnt(
    structures::mssgid message_id,
    uint16_t curators_prcnt
)

Параметры: message_id — идентификатор поста, за курирование которого устанавливается доля отчисления. Параметр содержит поля: author — автор поста, permlink — уникальное имя поста в рамках публикаций данного автора; curators_prcnt— доля (в процентах), отчисляемая кураторам от общей суммы вознаграждения.

После начала голосования за пост изменение доли выплаты кураторам недопустимо.

Операция-действие setcurprcnt требует наличия подписи в транзакции автора поста message_id.author.

Операция-действие setmaxpayout

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

Операция-действие setmaxpayout имеет следующий вид:

void setmaxpayout(
    mssgid message_id,
    asset max_payout
);

Параметры: message_id — идентификатор сообщения, за курирование которого устанавливается выплата. Параметр содержит поля: author — автор сообщения, permlink — уникальное имя сообщения в рамках публикаций данного автора; max_payout — максимально возможная сумма вознаграждения за сообщение, выплачиваемая из пула, к которому данное сообщение имеет привязку. Сумма устанавливается автором в том виде средств (токенов), которые имеются в данном пуле.

На изменение параметра max_payout накладываются следующие ограничения:

  • параметр можно изменять только для открытых сообщений;

  • параметр можно изменять только для сообщений, которые еще не имеют голосов;

  • параметр можно изменять только в сторону уменьшения по отношению к предыдущему его значению. Значение параметра должно быть положительным. Сохранять старое значение параметра также недопустимо.

Операция-действие setmaxpayout требует наличия в транзакции подписи автора сообщения.

Операция-действие calcrwrdwt

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

Операция-действие имеет следующий вид:

void calcrwrdwt(
    name    account,
    int64_t mssg_id,
    int64_t post_charge
)

Параметры: account— имя аккаунта автора поста; mssg_id— внутренний идентификатор поста; post_charge— текущий ресурс батарейки, ограничивающий активность пользователя в рамках размещения постов. С увеличением количества постов, размещаемых автором за определенное время, уменьшается ресурс батарейки и сумма выплат за посты.

Для выполнения данной операции требуется подпись аккаунта смарт-контракта golos.publication.

Операция-действие paymssgrwrd

Операция-действие paymssgrwrd является внутренней и пользователю недоступна. Используется для выплат сумм вознаграждений за пост кураторам, бенефициарам и автору. Операция-действие имеет следующий вид:

void paymssgrwrd(mssgid message_id)

message_id — идентификатор поста, за который выплачиваются суммы вознаграждений. Параметр содержит поля: author — автор сообщения, permlink — уникальное имя поста в рамках публикаций данного автора.

Для выполнения данной операции требуется подпись аккаунта смарт-контракта golos.publication.

Операция-действие setparams

Операция-действие setparams используется для настройки параметров смарт-контракта golos.publication. Операция-действие имеет следующий вид:

void set_params(std::vector<posting_params> params)

Параметр params — значение в виде структуры, содержащей поля с настраиваемыми параметрами.

Вызов set_params в смарт-контракте golos.publication позволяет настроить следующие переменные:

  • cashout_window — интервал времени, по истечении которого осуществляется выплата вознаграждения за пост;

  • max_vote_changes — максимально возможное количество переголосований пользователя за пост (показывает, сколько раз пользователь может поменять свой голос за пост);

  • max_beneficiaries — максимально возможное количество бенефициаров;

  • max_comment_depth — максимально возможная глубина комментариев (показывает допустимый уровень вложенности дочерних комментариев относительно родительского;

  • social_acc — имя аккаунта social;

  • referral_acc — имя аккаунта referral;

  • curators_prcnt — доля (в процентах), отчисляемая кураторам, от общей суммы вознаграждения за пост. Устанавливает пороговые значения, в рамках которых автор поста может задавать собственное процентное значение отчислений кураторам.

Определение сумм вознаграждений за публикацию на веб-сайте приложения Голос

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

В смарт-контракте golos.publication реализована логика, позволяющая рассчитать все необходимые выплаты за пост и поместить текущие результаты расчета на веб-сайте приложения Голос. Работа логики основана на обработке актуальных данных, получаемых из сообщений от событийной модели Event Engine. Результаты расчета корректируются после каждого принятого сообщения от Event Engine и зависят в основном от таких параметров как размер пула вознаграждений, количества появляющихся постов, а также веса каждого голосующего пользователя.

В этом разделе приводятся методы, которые могут быть применены в приложениях для определения (прогнозируемых) сумм вознаграждений в процессе голосования за пост в режиме реального времени, в том числе:

  • общей суммы вознаграждения за пост;

  • общей суммы вознаграждения кураторам поста;

  • сумм вознаграждения для каждого из кураторов поста;

  • общей суммы вознаграждения бенефициарам поста;

  • сумм вознаграждения для каждого из бенефициаров поста;

  • суммы вознаграждения автору поста.

Данные, на основе которых определяются вознаграждения за пост

С момента создания поста и до момента его закрытия проводится голосование за этот пост. Размер вознаграждения за созданный пост в основном зависит от результатов голосования за него и наличием средств в пуле вознаграждений. Пул вознаграждения выбирается по времени создания поста.

Каждый поданный за пост голос регистрируется в смарт-контракте публикации как событие, информация о котором отправляется в событийную модель Event Engine и далее по запросу в приложение Голос. На основе получаемой от Event Engine актуальной информации о событиях, относящихся к процессу голосования за пост, появляется возможность на веб-сайте приложения отображать в режиме реального времени интересующие пользователей (прогнозируемые) суммы вознаграждений за данный пост.

Методы вычисления сумм вознаграждений за пост в режиме реального времени в каждом из приложений могут быть различными. Рекомендуется в методах использовать получаемую от Event Engine информацию о следующих событиях: rewardweight, poststate, poolstate и votestate.

Событие rewardweight

Структура события rewardweight содержит данные о весе вознаграждения за пост.

struct reward_weight_event {
    mssgid message_id;
    uint16_t rewardweight;
};

Параметры: message_id — идентификатор поста, для которого устанавливается выплачиваемая доля от вознаграждения. Параметр содержит поля: author — автор поста, permlink — уникальное имя поста в рамках публикаций данного автора; rewardweight — выплачиваемая доля вознаграждения за пост с учетом наложенного штрафа (параметр принимает целочисленное значение, показывает процент выплаты с точностью до сотой доли. Значение 10000 соответствует 100 %).

Событие rewardweight показывает величину доли (в процентах) от вознаграждения за пост, которая будет выплачена с учетом наложенного штрафа на автора поста.

Активность каждого автора ограничена, то есть автор может опубликовать только определенное количество постов за установленный интервал времени. Если активность автора не превышает установленное для него ограничение, то штраф автору не начисляется и параметр rewardweight принимает значение 100 %. В противном случае за каждую сверх-нормативную публикацию автору будет динамически начисляться штраф в размере от 0 до 100 %. Соответственно значение rewardweight за каждую сверх-нормативную публикацию будет уменьшаться на величину штрафа.

Событие poststate

Структура события poststate содержит данные о текущем состоянии поста.

struct post_event {
    mssgid message_id;
    base_t netshares;
    base_t voteshares;
    base_t sumcuratorsw;
    base_t sharesfn;
};

Параметры: message_id — идентификатор поста, для которого устанавливается выплачиваемая доля от вознаграждения. Параметр содержит поля: author — автор поста, permlink — уникальное имя поста в рамках публикаций данного автора; netshares — доля вознаграждения, выделяемая в пуле за пост (значение параметра вычисляется как сумма значений voteshares всех голосов); voteshares — доля вознаграждения за пост, определяемая отдельным голосом с учётом его знака (значение отдельного голоса вычисляется как произведение количества вестинга голосующего на его вес. Параметр может принимать как положительное, так и отрицательное значения. Голосу вида «против» присваивается знак «минус», голосу вида «за» присваивается знак «плюс»); sumcuratorsw — суммарный вес голосов всех кураторов на текущий момент времени. sharesfn — функция для расчета вознаграждений, применимая к shares поста.

Событие poolstate

Структура события poolstate содержит данные о текущем состоянии пула вознаграждений.

struct pool_event {
    uint64_t created;
    counter_t msgs;
    eosio::asset funds;
    wide_t rshares;
    wide_t rsharesfn;
};

Параметры: created — время создания поста (идентификатор пула); msgs — количество постов, вознаграждения за которые выплачиваются из пула created; funds — количество токенов в пуле вознаграждений; rshares — суммарное значение rshares всех постов в пуле; rsharesfn — суммарное значение rsharesfn всех постов в пуле.

Событие votestate

Структура события votestate содержит данные о текущих результатах голосования за пост.

struct vote_event {
    name voter;
    mssgid message_id;
    int16_t weight;
    base_t curatorsw;
    base_t rshares;
};

Параметры: voter — имя аккаунта (пользователя), который голосует за пост; message_id — идентификатор поста. Параметр содержит поля: author — автор поста, permlink — уникальное имя поста в рамках публикаций данного автора; weight — вес голоса аккаунта voter. Во время голосования вес голоса указывается с точностью до сотой доли процента в виде целочисленного значения в интервале от 0 до 10000 (значение 10000 соответствует 100 %). Вес голоса «против» указывается со знаком «минус»; curatorsw — процент кураторского вознаграждения (доля вознаграждения, выделяемая отдельному куратору от общей суммы вознаграждения кураторам. Величина доли зависит от веса данного куратора); rshares — условный параметр, используемый в расчетах вознаграждений за пост. Значение параметра определяется как произведение количества активного вестинга голосующего на вес голоса в процентах (rshares = eff_vesting * weight / 10000). Параметр может принимать как положительное, так и отрицательное значения. Голосу вида «против» присваивается знак «минус».

Метод вычисления общей суммы вознаграждения за пост

Для определения прогнозируемой суммы вознаграждения за пост в режиме реального времени рекомендуется воспользоваться формулой

payout = reward_weight × funds × (sharesfn / rsharesfn)      (1)

Компоненты формулы: payout — результирующая общая сумма вознаграждения за пост на момент получения данных от событийной модели; reward_weight = rewardweight::reward_weight — вес вознаграждения за пост; funds = poolstate::state.funds — общее количество токенов в пуле вознаграждений; sharesfn = poststate::sharesfn — доля токенов, выделенных на вознаграждение за пост, от общего их количества в пуле вознаграждения (значение параметра зависит от веса поста); rsharesfn = poolstate::state::rsharesfn — количество токенов, выделенных на вознаграждение всех постов в пуле вознаграждения (значение параметра зависит от суммарного веса всех постов).

Компонента reward_weight показывает долю авторского вознаграждения за публикацию с учетом возможного наложенного на данную публикацию штрафа. Количество публикаций в сутки по умолчанию не должно превышать четырех. За превышение этого количества автору начисляется штраф. Значение reward_weight рассчитывается (как и в блокчейне Голос) по формуле

 reward_weight = min{100 %, (400 %)² / postbw_charge²}      (1.1)

Компонента postbw_charge показывает ресурс соответствующей батарейки. Каждое использование батарейки изменяет ресурс на 100 %. Ресурс воcстанавливается полностью, если в течение суток с момента создания предыдущего поста не создается ни один пост (линейное восстановление, пропорциональное разряду и времени относительно предыдущего созданного поста).

Для вычисления payout по формуле (1) необходимо использовать данные, полученные от событийной модели только в один и тот же момент времени.

Метод вычисления сумм вознаграждения кураторам за пост

Общая сумма кураторских вознаграждений представляет собой часть средств в виде процентного отчисления от общей суммы вознаграждения за пост. Значение процентного отчисления curators_prcnt автор может указать самостоятельно во время создания поста. Если автор не указывает этот параметр, то в качестве него из таблицы pstngparams берется параметр min_curators_prcnt — минимально возможная доля, выделяемая кураторам от общего вознаграждения за пост.

Для определения общей суммы вознаграждения кураторов рекомендуется воспользоваться формулой

curation_payout = curators_prcnt × payout                   (2)

Компоненты формулы: curation_payout — результирующая общая сумма вознаграждения кураторам за пост на момент получения данных от событийной модели; curators_prcnt — доля (в процентах), отчисляемая кураторам от общей суммы вознаграждения за пост; payout — общая сумма вознаграждения за пост, вычисленная по формуле (1).

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

Для определения суммы вознаграждения curator_rewardⱼ отдельному куратору j рекомендуется воспользоваться формулой

curator_rewardⱼ = curation_payout × (curatorswⱼ / weights_sum)      (3)

Компоненты формулы: curation_payout — общая сумма вознаграждения кураторам за пост, вычисленная по формуле (2); curatorswⱼ = votestate::curatorswⱼ — вес голоса куратора j, отдавшего за пост голос вида «за»; weights_sum = poststate::weights_sum — общий вес голосов кураторов, отдавших за пост голоса вида «за»; (curatorswⱼ / weights_sum) — доля, выделяемая куратору j от общей суммы вознаграждения кураторам.

Вычисление суммы вознаграждения по формуле (3) выполняется для каждого куратора, данные о котором содержатся в структуре vote_event.

После вычисления всех сумм вознаграждений кураторам может появиться остаточная (невостребованная) сумма, образуемая за счет штрафов во время голосования (например, за раннее голосование). Этот штраф не учитывается в суммарном значении sumcuratorsw, но влияет на величину curatorsw конкретного голоса. Возможная остаточная сумма в виде «сдачи» будет возвращена обратно в пул вознаграждения за посты. Эта остаточная сумма unclaimed_rewards вычисляется по формуле

unclaimed_rewards = curation_payout - ∑(curator_rewardⱼ)      (4)

Компоненты формулы: curation_payout — общая сумма вознаграждения кураторам за пост, вычисленная по формуле (2); ∑(curator_rewardⱼ) — сумма всех выплат, вычисленных по формуле (3).

Метод вычисления сумм вознаграждения бенефициарам за пост

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

Для определения суммы вознаграждения ben_rewardⱼ бенефициару j рекомендуется воспользоваться формулой

ben_rewardⱼ = (payout - curation_payout) × weightⱼ      (5)

Компоненты формулы: payout — общая сумма вознаграждения за пост, вычисленная по формуле (1); curation_payout — общая сумма вознаграждения кураторам за пост, вычисленная по формуле (2); (payout - curation_payout) — общая сумма вознаграждения, выделяемая бенефициарам и автору поста; weightⱼ — вес вознаграждения, выделяемая бенефициару j. Устанавливается автором во время публикации поста.

Вычисление суммы вознаграждения по формуле (5) выполняется для каждого бенефициара, данные о котором приводятся в таблице message поля beneficiaries — массив, содержащий структуры с полями имен и процентных отчислений.

Общая сумма выплат бенефициарам ben_payout_sum вычисляется по формуле

ben_payout_sum = ∑(ben_rewardⱼ)                         (6)

Определение размера вознаграждения автору поста

Для определения размера вознаграждения author_reward автору поста рекомендуется воспользоваться формулой

       author_reward = payout - curation_payout - ben_payout_sum

Компоненты формулы: payout — общая сумма вознаграждения за пост, вычисленная по формуле (1); curation_payout — общая сумма вознаграждения кураторам за пост, вычисленная по формуле (2); ben_payout_sum — общая сумма выплат бенефициарам, вычисленная по формуле (6).

Определение общей суммы вознаграждения за пост в токенах и вестингах

Часть вознаграждения за пост выплачивается в виде вестинга, а часть — в виде токенов. Процентное их соотношение указывается во время создания поста. После вычисления суммы вознаграждения за пост по формуле (1) можно определить количество ликвидных токенов, а также вестингов, составляющих данное вознаграждение.

Для вычисления количества ликвидных токенов token_payout, выделяемых в виде вознаграждения за пост в режиме реального времени, рекомендуется воспользоваться формулой

        token_payout = payout × tokenprop

Компоненты формулы: payout — общая сумма вознаграждения за пост, вычисленная по формуле (1); tokenprop = post::tokenprop — процентное содержание токенов в вознаграждении.

Количество вестингов в вознаграждении vesting_payout составляет

        vesting_payout = payout - token_payout

Заключение

Представленные методы вычисления сумм вознаграждений за пост в режиме реального времени предназначены для их применения в приложении Голос. Данные методы носят рекомендательный характер и могут быть также применены в других приложениях.

Last updated