Skip to content

golos.publication_contract.md

Ilya Lebedev edited this page Jul 23, 2019 · 3 revisions

Смарт-контракт Golos.publication

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

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

Экшен-операции смарт-контракта golos.publication

Cмарт-контракт golos.publication поддерживает следующие экшен-операции пользователей: setlimit, setrules, createmssg, updatemssg, deletemssg и downvote, upvote.

Экшен-операция 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,
    int64_t 		maxtokenprop,
    symbol 		tokensymbol
);

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

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

Экшен-операция createmssg

Экшен-операция 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;
vestpaymenttrue, если пользователь дает разрешение на оплату в вестингах отправки сообщения в случае исчерпания ресурса батарейки (сообщение отправляется независимо от ресурса батарейки). По умолчанию принимает значение false;
headermssg — заголовок сообщения;
bodymssg — тело сообщения;
languagemssg — язык сообщения;
tags — тэг, который присваивается сообщению;
jsonmetadata — метаданные в формате JSON.

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

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

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

Экшен-операция updatemssg

Экшен-операция 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 используется для удаления пользователем ранее отправленного им сообщения.

Экшен-операция deletemssg имеет следующий вид:

void deletemssg(
    name account,
    std::string permlink
);

Параметры:
account — имя аккаунта-автора сообщение;
permlink — строковое представление относительного адреса удаляемого сообщения.

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

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

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

Экшен-операция upvote

Экшен-операция 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» при голосовании за сообщение.
Экшен-операция downvote имеет следующий вид:

void downvote(
    name voter,
    name author,
    std::string permlink,
    uint16_t weight
);

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

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

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

Экшен-операция unvote

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

void unvote(
    name voter,
    name author,
    std::string permlink
);

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

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

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

Другие параметры, используемые и настраиваемые в смарт-контракте golos.publication

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

  • cashout_window — интервал времени, по истечении которого осуществляется выплата вознаграждения за пост;
  • max_vote_changes — максимально возможное количество переголосований пользователя за пост (показывает, сколько раз пользователь может поменять свой голос за пост);
  • max_beneficiaries — максимально возможное количество бенефициаров;
  • max_comment_depth — максимально возможная глубина комментариев (показывает допустимый уровень вложенности дочерних комментариев относительно родительского;
  • social_acc — имя аккаунта social;
  • referral_acc — имя аккаунта referral.