Skip to content

golos.social_contract.md

Alexander Nazarov edited this page Mar 13, 2019 · 1 revision

Смарт-контракт golos.social

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

Смарт-контракт golos.social предоставляет пользователям следующие возможности:
создание и редактирование профилей (метаданных) пользователей;
определение репутации каждого пользователя на основании результатов голосования за его посты или оставленные им комментарии;
заведение пин-списка, позволяющего его владельцу получать информацию о публикациях интересующих его пользователей;
заведение «черного» списка, позволяющего блокировать общение владельца данного списка с нежелательными по его мнению пользователями.

Терминология, используемая в описании смарт-контракта golos.social

Профиль пользователя — метаданные пользователя, хранящиеся в базе данных клиентского приложения в виде структуры, характеризующей пользователя. Профиль пользователя создается и редактируется самим пользователем. Смарт-контракт golos.social не отвечает за сохранность метаданных пользователя, а только контролирует наличие права пользователя на изменение или удаление метаданных.
Репутация пользователя — целочисленное значение, которое может быть как положительным, так и отрицательным. Репутация пользователя показывает отношение других пользователей к публикациям и комментариям данного пользователя. Значение репутации пользователя увеличивается или уменьшается на единицу за каждый отданный ему голос «upvote» или «downvote» соответственно.

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

«Черный» список пользователя — элемент базы данных, содержащий перечень имен аккаунтов, которых данный пользователь характеризует как нежелательных. «Черный» список пользователя создается и редактируется самим пользователем. Использование «черного» списка позволяет пользователю блокировать комментарии и голоса аккаунтов, имена которых содержатся в данном списке. Смарт-контракт golos.publication проверяет наличие имени аккаунта в данном списке при выполнении операций createmsg, upvote и downvote.

Экшен-операция (англ. action) — отправка транзакции в смарт-контракт, вызванная внешним обращением объекта к данному смарт-контракту. В качестве объекта может выступать пользователь, другой смарт-контракт, а также отдельный программный компонент.

Экшен-операции, поддерживаемые смарт-контрактом golos.social

Смарт-контракт golos.social поддерживает следующие экшен-операции пользователей: pin, unpin, block, unblock, changereput, updatemeta и deletemeta.

Объявление accountmeta

Объявление accountmeta используется для описания профиля пользователя и представляет собой структуру следующего вида:

struct accountmeta {
    optional<std::string> type;             //  Тип

    optional<std::string> app;              // Приложение, которому принадлежит профиль аккаунта

    optional<std::string> email;            // Адрес электронной почты пользователя
    optional<std::string> phone;            // Номер телефона пользователя
    optional<std::string> facebook;         // Имя пользователя в соцсети facebook
    optional<std::string> instagram;        // Имя пользователя в соцсети instagram
    optional<std::string> telegram;         // Имя пользователя в соцсети telegram
    optional<std::string> vk;               // Имя пользователя в соцсети vk
    optional<std::string> website;          // Название личного веб-сайта

    optional<std::string> first_name;       // Имя пользователя
    optional<std::string> last_name;        // Фамилия пользователя
    optional<std::string> name;             // Имя аккаунта
    optional<std::string> birth_date;       // Дата рождения
    optional<std::string> gender;           // Пол
    optional<std::string> location;         // Регион проживания
    optional<std::string> city;             // Город проживания

    optional<std::string> about;            // О пользователе
    optional<std::string> occupation;       // Занятость
    optional<std::string> i_can;            // Возможности пользователя
    optional<std::string> looking_for;      // Целенаправленность пользователя 
    optional<std::string> business_category; // Профессия

    optional<std::string> background_image; // Изображение на заднем фоне
    optional<std::string> cover_image;      // Изображение на обложке
    optional<std::string> profile_image;    // Изображение (аватар) пользователя 
    optional<std::string> user_image;       // Фото пользователя
    optional<std::string> ico_address;      // ico адрес

    optional<std::string> target_date;      // Дата (срок выполнения) достижения плана
    optional<std::string> target_plan;      // Установленный план пользователя 
    optional<std::string> target_point_a;   // Установленная веха А в достижении плана
    optional<std::string> target_point_b;   // Установленная веха В в достижении плана
}

Объявление accountmeta задается в качестве параметра в экшен-операциях updatemeta и deletemeta.

Таблица pinblock

Таблица pinblock является элементом базы данных и содержит информацию о взаимоотношении одного пользователя к другому. Данные из таблицы используются для создания пин-списка и списка заблокированных пользователей.

Таблица pinblock содержит следующие поля:
(name) _SCOPE_ — имя аккаунта (первое имя из пары), который вносит имя интересующего его аккаунта в один из списков — пин-список или список заблокированных аккаунтов;
(name) account — имя аккаунта, которое было добавлено в один из списков — пин-список или список заблокированных аккаунтов;
(bool) pinningtrue означает, что имя аккаунта добавлено в пин-список;
(bool) blockingtrue означает, что имя аккаунта добавлено в список заблокированных аккаунтов.

Примечание:
Наличие true одновременно в полях pinningи blocking недопустимо.
Имя аккаунта удаляется из пин-списка и списка заблокированных аккаунтов, если поля pinningи blocking содержат значение false.

Таблица reputation

Таблица reputation является элементом базы данных и используется для хранения репутации аккаунтов.

Таблица reputation содержит следующие поля:
(name) _SCOPE_) — имя аккаунта, которому принадлежит репутация;
(int64) reputation — значение репутации аккаунта с именем в поле _SCOPE_.

Примечание:
Имя аккаунта с нулевой репутацией содержится в таблице reputation, если ранее значение его репутации было отличным от нуля.

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

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

void pin(
    name pinner,
    name pinning
);

Параметры:
pinner — имя аккаунта, который добавляет в свой пин-список имя аккаунта, заданного в поле pinning;
pinning — имя аккаунта, которое добавляется в пин-список.

Правами на запуск экшен-операции pin обладает аккаунт pinner.

На экшен-операцию pin введены следующие ограничения:

  • добавление своего имени аккаунта в пин-список недопустимо, то есть поле pinning не должно содержать значение поля pinner;
  • добавление в пин-список уже имеющегося в нем имени аккаунта недопустимо;
  • добавление имени аккаунта в пин-список, при наличии его в списке заблокированных аккаунтом pinner, недопустимо.

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

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

void unpin(
    name pinner,
    name pinning
);

Параметры:
pinner — имя аккаунта, который удаляет из своего пин-список имя аккаунта, заданного в поле pinning;
pinning — имя аккаунта, который удаляется из пин-списка.

Правами на запуск экшен-операции pin обладает аккаунт pinner.

На экшен-операцию unpin введены следующие ограничения:

  • удаление своего имени аккаунта из пин-список недопустимо, то есть поле pinning не должно содержать значение поля pinner;
  • удаление из пин-списка не имеющегося в нем имени аккаунта недопустимо.

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

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

void block(
    name blocker,
    name blocking
);

Параметры:
blocker — имя аккаунта, который добавляет в свой «черный» список имя аккаунта, заданного в поле blocking;
blocking — имя аккаунта, которое добавляется в «черный» список.

Правами на запуск экшен-операции block обладает аккаунт blocker.

На экшен-операцию block введены следующие ограничения:

  • блокирование своего имени аккаунта недопустимо, то есть поле blocking не должно содержать значение поля blocker;
  • добавление в «черный» список уже имеющегося в нем имени аккаунта недопустимо.

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

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

void unblock(
    name blocker,
    name blocking
);

Параметры:
blocker — имя аккаунта, который удаляет из своего «черного» списка имя аккаунта, заданного в поле blocking;
blocking — имя аккаунта, который удаляется из «черного» списка.

Правами на запуск экшен-операции unblock обладает аккаунт blocker.

На экшен-операцию unblock введены следующие ограничения:

  • удаление своего имени аккаунта из «черного» списка недопустимо, то есть поле blocking не должно содержать значение поля blocker;
  • удаление из «черного» списка не имеющегося в нем имени аккаунта недопустимо.

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

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

void changereput(
    name voter,
    name author, 
    int64_t rshares
);

Параметры:
voter — имя проголосовавшего аккаунта. Данное имя содержится в changereput для того, чтобы проверить действия данного аккаунта на соответствие нормативной этики по отношению к аккаунту author;
author — имя аккаунта, у которого обновляется репутация;
rshares — значение голоса, в соответствии с которым уменьшается или увеличивается репутация аккаунта. Голос вида «downvote» уменьшает репутацию аккаунта на единицу, а голос вида «upvote» увеличивает ее на такое же значение.

Правами на запуск экшен-операции changereput обладает только смарт-контракт golos.publication. Экшен-операция changereput вызывается из операции downvote или upvote смарт-контракта golos.publication.

Вызов экшен-операции changereput из клиентского приложения не допускается.

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

Экшен-операция updatemeta используется для заполнения, изменения или удаления значений полей профиля аккаунта.
Экшен-операция updatemeta имеет следующий вид:

void updatemeta(
    name account,
    accountmeta meta
);

Параметры:
account — имя аккаунта, профиль которого редактируется;
meta — значение в виде структуры объявления accountmeta.

Правами на запуск экшен-операции updatemeta обладает аккаунт, указанный в поле account.

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

Правами запуска экшен-операции updatemeta обладает аккаунт, редактирующий свой профиль.

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

Экшен-операция deletemeta используется для удаления профиля аккаунта. Экшен-операция delelemeta имеет следующий вид:

void deletemeta(name account);  

Параметры:
account — имя аккаунта, профиль которого удаляется.

Экшен-операция deletemeta не выполняет каких-либо действий с базой данных, а только проверяет права пользователя, удаляющего свой профиль.
Удаление метаданных пользователя из базы данных реализуется в клиентском приложении.

Правами на запуск экшен-операции deletemeta обладает аккаунт, удаляющий свой профиль.