-
Notifications
You must be signed in to change notification settings - Fork 3
golos.publication_contract.md
Смарт-контракт golos.publication
обеспечивает работу с постами, в том числе предоставляет возможность пользователям выполнять следующие действия: публиковать посты, оставлять комментарии, голосовать за посты и закрывать посты, а также обеспечивает выплату вознаграждения авторам постов.
Cмарт-контракт golos.publication
поддерживает следующие экшен-операции пользователей: setlimit
, setrules
, createmssg
, updatemssg
, deletemssg
и downvote
, upvote
.
Экшен-операция 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
имеет следующий вид:
void setrules(
const funcparams& mainfunc,
const funcparams& curationfunc,
const funcparams& timepenalty,
int64_t curatorsprop,
int64_t maxtokenprop,
symbol tokensymbol
);
Параметры:
mainfunc
— функция, вычисляющая суммарное значение вознаграждения для автора и кураторов поста в соответствии с установленным алгоритмом (например, линейным алгоритмом или алгоритмом квадратного корня). Используемый в функции алгоритм выбирается делегатами голосованием. Функция содержит два параметра: математическое выражение (непосредственно алгоритм), по которому вычисляется сумма вознаграждения, и максимально допустимое значение аргумента для функции. При установке значений параметров для setrules выполняется их проверка на корректность (в том числе на монотонность и неотрицательность);
curationfunc
— функция, вычисляющая значение вознаграждения для каждого из кураторов в соответствии с установленным алгоритмом (аналогично вычислению для mainfunc
);
timepenalty
— функция, вычисляющая вес голоса с учетом времени голосования и длительности штрафного окна;
curatorsprop
— выделяемая доля всем кураторам от суммарного значения вознаграждения;
maxtokenprop
— максимально возможное значение вознаграждения (сумма токенов и вестингов), которое может получить автор. Этот параметр устанавливается делегатами голосованием;
tokensymbol
— тип токена (в рамках приложения Голос предусматривается хождение только токенов Голоса).
Правом на запуск экшен-операции setrules
обладает делегат приложения. Для запуска экшен-операции setrules
требуется наличие в транзакции подписи смарт-контракта golos.publication
(multisig-аккаунта).
Экшен-операция createmssg
используется для создания сообщения в виде ответа на ранее полученное (родительское) сообщение.
Экшен-операция createmssg
имеет следующий вид:
void createmssg(
name account,
std::string permlink,
name parentacc,
std::string parentprmlnk,
std::vector<structures::beneficiary> beneficiaries,
int64_t tokenprop,
bool vestpayment,
std::string headermssg,
std::string bodymssg,
std::string l anguagemssg,
std::vector<structures::tag> tags,
std::string jsonmetadata
);
Параметры:
account
— имя аккаунта-автора сообщения;
permlink
— строковое представление относительного адреса сообщения;
parentacc
— имя аккаунта-автора родительского сообщения, на которое формируется ответ в виде настоящего сообщения. В случае нулевого значения parentacc
, созданное сообщение будет являться постом;
parentprmlnk
— строковое представление относительного адреса родительского сообщения;
beneficiaries
— значение в виде структуры, содержащей имена бенефициаров и долю (в процентах) выплаты им от суммы вознаграждения за сообщение;
tokenprop
— размер вознаграждения (количество токенов). Данное значение ограничено сверху параметром maxtokenprop
, задаваемым в set_rules
;
vestpayment
— true
, если пользователь дает разрешение на оплату в вестингах отправки сообщения в случае исчерпания ресурса батарейки (сообщение отправляется независимо от ресурса батарейки). По умолчанию принимает значение false
;
headermssg
— заголовок сообщения;
bodymssg
— тело сообщения;
languagemssg
— язык сообщения;
tags
— тэг, который присваивается сообщению;
jsonmetadata
— метаданные в формате JSON.
Параметры parentacc
и parentprmlnk
идентифицируют родительское сообщение, на которое создается ответ с использованием createmssg
в виде сообщения.
Для запуска экшен-операции createmssg
требуется наличие в транзакции подписи аккаунта-автора сообщения.
Ключ, по которому ведется поиск сообщения, имеет привязку к параметрам account
и permlink
.
Экшен-операция updatemssg
используется для внесения пользователем изменений в ранее отправленное им сообщение.
Экшен-операция updatemssg
имеет следующий вид:
void updatemssg(
name account,
std::string permlink,
std::string headermssg,
std::string bodymssg,
std::string languagemssg,
std::vector<structures::tag> tags,
std::string jsonmetadata
);
Параметры:
account
— имя аккаунта-автора сообщения;
permlink
— строковое представление относительного адреса редактируемого сообщения;
headermssg
— заголовок редактируемого сообщения;
bodymssg
— тело редактируемого сообщения;
languagemssg
— язык редактируемого сообщения;
tags
— тэг, который будет присвоен редактируемому сообщению;
jsonmetadata
— метаданные в формате JSON.
Для запуска экшен-операции updatemssg
требуется наличие в транзакции подписи аккаунта-автора сообщения.
Экшен-операция deletemssg
используется для удаления пользователем ранее отправленного им сообщения.
Экшен-операция deletemssg
имеет следующий вид:
void deletemssg(
name account,
std::string permlink
);
Параметры:
account
— имя аккаунта-автора сообщение;
permlink
— строковое представление относительного адреса удаляемого сообщения.
Сообщение не может быть удалено в следующих случаях:
- на сообщение создан комментарий;
- сообщение имеет положительное количество голосов. Вес голоса пользователя зависит от используемого им вестинга и силы голоса. Сообщение не может быть удалено, если взвешенная сумма имеет положительное значение.
Для запуска экшен-операции deletemssg
требуется наличие в транзакции подписи аккаунта-автора сообщения.
Экшен-операция upvote
используется для подачи пользователем голоса в виде «upvote» при голосовании за сообщение.
Экшен-операция upvote
имеет следующий вид:
void upvote(
name voter,
name author,
std::string permlink,
uint16_t weight
);
Параметры:
voter
— имя голосующего аккаунта;
author
— имя аккаунта-автора сообщения;
permlink
— строковое представление относительного адреса сообщения, за которое голосует аккаунт voter
;
weight
— вес голоса аккаунта voter
.
Ключ, по которому ведется поиск сообщения, имеет привязку к значениям параметров author
и permlink
.
Экшен-операция upvote
требует наличия подписи в транзакции аккаунта voter
.
Экшен-операция downvote
используется для подачи пользователем голоса в виде «downvote» при голосовании за сообщение.
Экшен-операция downvote
имеет следующий вид:
void downvote(
name voter,
name author,
std::string permlink,
uint16_t weight
);
Параметры:
voter
— имя голосующего аккаунта;
author
— имя аккаунта-автора сообщения;
permlink
— строковое представление относительного адреса сообщения, против которого голосует аккаунт voter
;
weight
— вес голоса аккаунта voter
.
Ключ, по которому ведется поиск сообщения, имеет привязку к значениям параметров author
и permlink
.
Экшен-операция downvote
требует наличия подписи в транзакции аккаунта voter
.
Экшен-операция unvote
используется для отзыва пользователем собственного голоса вида upvote
или downvote
, отданного им ранее.
Экшен-операция unvote
имеет следующий вид:
void unvote(
name voter,
name author,
std::string permlink
);
Параметры:
voter
— имя аккаунта, удаляющего свой голос с сообщения;
author
— имя аккаунта-автора сообщения;
permlink
— строковое представление относительного адреса сообщения, от которого отзывается голос.
Ключ, по которому ведется поиск сообщения, имеет привязку к значениям параметров author
и permlink
.
Экшен-операция unvote
требует наличия подписи в транзакции аккаунта voter
.
Вызов setparams
в смарт-контракте golos.publication
позволяет настроить следующие переменные:
-
cashout_window
— интервал времени, по истечении которого осуществляется выплата вознаграждения за пост; -
max_vote_changes
— максимально возможное количество переголосований пользователя за пост (показывает, сколько раз пользователь может поменять свой голос за пост); -
max_beneficiaries
— максимально возможное количество бенефициаров; -
max_comment_depth
— максимально возможная глубина комментариев (показывает допустимый уровень вложенности дочерних комментариев относительно родительского; -
social_acc
— имя аккаунта social; -
referral_acc
— имя аккаунта referral.