Публикация

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

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

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

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

Используемые типы данных

процент 16-битовое значение с типами объявления int16_t или uint16_t и точностью до сотых долей процента. Процент принимает значения от -10000 до 10000 (например: -10000 = -100 %, 0 = 0 %, 10000 = 100 %, 1234 = 12,34 %). Отрицательные значения процента задаются типом объявления int16_t.

mssgid Идентификатор сообщения, структура, содержащая поля:

  • author — автор сообщения;

  • permlink — уникальное имя сообщения в рамках публикаций конкретного автора.

    struct mssgid {
    name author;
    std::string permlink;
    }

beneficiary Бенефициар, структура, содержащая поля:

  • account — аккаунт бенефициара;

  • weightпроцент, доля выплаты бенефициару от суммы авторского вознаграждения за сообщение.

    struct beneficiary {
    name account;
    uint16_t weight;
    };

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 — название действия. Контракт поддерживает значения 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 имеет следующий вид:

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

Параметры:

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

  • curationfunc — функция, вычисляющая значение вознаграждения для каждого из кураторов в соответствии с установленным алгоритмом (аналогично вычислению для mainfunc);

  • timepenalty — функция, вычисляющая вес голоса с учетом времени голосования и длительности штрафного окна;

  • maxtokenprop — максимально возможное значение вознаграждения (сумма токенов и вестингов), которое может получить автор. Этот параметр устанавливается делегатами голосованием;

  • tokensymbol — тип токена (в рамках приложения Голос предусматривается хождение только токенов Голоса).

Для вызова операции-действия setrules требуется наличие в транзакции подписей большинства лидеров.

Пример setrules с заданием линейных функций вознаграждения и кураторской, а также с отключенным штрафным окном и размером вознаграждения в токене не более 50 %.

setrules({
    "mainfunc":     {"str":"x", "maxarg":fixp_max},
    "curationfunc": {"str":"x", "maxarg":fixp_max},
    "timepenalty":  {"str":"1", "maxarg":8192},
    "maxtokenprop": 5000,
    "tokensymbol":  "3,GOLOS"
})

createmssg

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

void createmssg(
    mssgid          message_id,
    mssgid          parent_id,
    std::vector<structures::beneficiary> beneficiaries,
    int16_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 — идентификатор сообщения;

  • parent_id — идентификатор родительского сообщения. Для создания поста поле parent_id.author должно быть пустым;

  • beneficiaries — список бенефициаров, может быть пустым;

  • tokenprop — доля вознаграждения, выплачиваемая в ликвидных токенах (остаток выплачивается в вестинге). Данное значение ограничено сверху параметром maxtokenprop, задаваемым в set_rules;

  • vestpaymenttrue, если пользователь дает разрешение на оплату вестингом перерасхода ресурса батарейки (сообщение отправляется независимо от ресурса батарейки). (Внимание: этот параметр в текущем релизе не используется и должен принимать значение 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 имеет следующий вид:

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

Параметры:

  • message_id — идентификатор редактируемого сообщения;

  • headermssg — заголовок редактируемого сообщения;

  • bodymssg — тело редактируемого сообщения;

  • languagemssg — язык редактируемого сообщения;

  • tags — тэг, который будет присвоен редактируемому сообщению;

  • jsonmetadata — метаданные в формате JSON.

Транзакция, содержащая операцию-действие updatemssg, должна быть подписана аккаунтом-автором сообщения.

deletemssg

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

void deletemssg(mssgid  message_id);

Параметр:

  • message_id — идентификатор удаляемого сообщения.

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

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

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

Транзакция, содержащая операцию-действие deletemssg, должна быть подписана аккаунтом-автором сообщения.

upvote

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

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

Параметры:

  • voter — имя голосующего аккаунта;

  • message_id — идентификатор сообщения;

  • weight — вес голоса (процент) аккаунта voter.

Транзакция, содержащая операцию-действие upvote, должна быть подписана аккаунтом voter.

downvote

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

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

Параметры:

  • voter — имя голосующего аккаунта;

  • message_id — идентификатор сообщения;

  • weight — вес голоса (процент) аккаунта voter(указывается положительное значение веса).

Транзакция, содержащая операцию-действие downvote, должна быть подписана аккаунтом voter.

unvote

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

void unvote(
    name     voter,
    mssgid   message_id
);

Параметры:

  • voter — имя аккаунта, удаляющего свой голос от сообщения;

  • message_id — идентификатор сообщения.

Транзакция, содержащая операцию-действие unvote, должна быть подписана аккаунтом voter.

closemssgs

Операция-действие closemssgs является системной и используется для «закрытия» сообщений, для которых наступило время выплат. Операция -действие closemssgs имеет следующий вид:

void close_messages(name payer)

Параметр:

  • payer — имя аккаунта, оплачивающего хранение данных.

reblog

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

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

Параметры:

  • rebloger — имя аккаунта, выполняющего публикацию заимствованного поста;

  • message_id — идентификатор поста-оригинала;

  • headermssg — заголовок добавляемой заметки. Данное поле может быть пустым;

  • bodymssg — тело добавляемой заметки. Данное поле может быть пустым, если поле headermssg также является пустым.

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

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

  • При наличии заголовка заметки headermssg присутствие ее тела bodymssg является обязательным (реблог без заголовка, а также реблог без заголовка и его тела допускается).

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

Транзакция, содержащая операцию-действие reblog, должна быть подписана аккаунтом rebloger.

erasereblog

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

void erasereblog(
    name rebloger,
    mssgid message_id
)

Параметры:

  • rebloger — имя аккаунта, выполняющего удаление реблога;

  • message_id — идентификатор поста-оригинала.

Транзакция, содержащая операцию-действие erasereblog, должна быть подписана аккаунтом rebloger.

setcurprcnt

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

void set_curators_prcnt(
    mssgid message_id,
    uint16_t curators_prcnt
)

Параметры:

  • message_id — идентификатор поста;

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

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

Транзакция, содержащая операцию-действие setcurprcnt, должна быть подписана автора поста message_id.author.

setmaxpayout

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

void setmaxpayout(
    mssgid message_id,
    asset max_payout
);

Параметры:

  • message_id — идентификатор сообщения, для которого устанавливается максимальное вознаграждение;

  • 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 — идентификатор сообщения, за который выплачиваются суммы вознаграждений.

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

Операция может быть выполнена любым аккаунтом.

deletevotes

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

void deletevotes(int64_t message_id, name author)

Параметры:

  • message_id — внутренний идентификатор сообщения;

  • author — автор поста.

При вызове deletevotes возможно также не полное, а только частичное удаление голосов. В этом случае допускаются повторные вызовы deletevotes.

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

setparams

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

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

Параметр:

  • 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 содержит данные о весе вознаграждения за пост.

struct reward_weight_event {
    mssgid message_id;
    uint16_t rewardweight;
};

Параметры:

  • message_id — идентификатор поста;

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

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

Событие rewardweight отсылается только в случае штрафа, при 100 % вознаграждении событие не отсылается.

Событие poststate

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

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

Параметры:

  • message_id — идентификатор сообщения;

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

  • voteshares — доля вознаграждения за пост, определяемая отдельным голосом с учётом его знака (значение отдельного голоса вычисляется как произведение количества вестинга голосующего на его вес. Параметр может принимать как положительное, так и отрицательное значения. Голосу вида «против» присваивается знак «минус», голосу вида «за» присваивается знак «плюс»);

    sumcuratorsw — суммарный вес голосов всех кураторов на текущий момент времени.

  • sharesfn — значение, вычисленное функцией вознаграждения (mainfunc), применённой к netshares сообщения.

Событие 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 — суммарное значение sharesfn всех постов в пуле.

Событие votestate

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

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

Параметры:

  • voter — имя аккаунта (пользователя), который голосует за сообщение;

  • message_id — идентификатор сообщения;

  • 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