-
Notifications
You must be signed in to change notification settings - Fork 3
golos.social_contract.md
Смарт-контракт golos.social
предоставляет пользователям следующие возможности:
создание и редактирование профилей (метаданных) пользователей;
определение репутации каждого пользователя на основании результатов голосования за его посты или оставленные им комментарии;
заведение пин-списка, позволяющего его владельцу получать информацию о публикациях интересующих его пользователей;
заведение «черного» списка, позволяющего блокировать общение владельца данного списка с нежелательными по его мнению пользователями.
Профиль пользователя — метаданные пользователя, хранящиеся в базе данных клиентского приложения в виде структуры, характеризующей пользователя. Профиль пользователя создается и редактируется самим пользователем. Смарт-контракт golos.social
не отвечает за сохранность метаданных пользователя, а только контролирует наличие права пользователя на изменение или удаление метаданных.
Репутация пользователя — целочисленное значение, которое может быть как положительным, так и отрицательным. Репутация пользователя показывает отношение других пользователей к публикациям и комментариям данного пользователя. Значение репутации пользователя увеличивается или уменьшается на единицу за каждый отданный ему голос «upvote» или «downvote» соответственно.
Пин-список пользователя — элемент базы данных, содержащий перечень имен аккаунтов, интересующих данного пользователя. Пин-список пользователя создается и редактируется самим пользователем. Пин-список пользователя может использоваться в клиентском приложении для создания подписок, в том числе информировать данного пользователя (подписчика) о появлении нового поста, имя автора которого содержится в его пин-списке.
«Черный» список пользователя — элемент базы данных, содержащий перечень имен аккаунтов, которых данный пользователь характеризует как нежелательных. «Черный» список пользователя создается и редактируется самим пользователем. Использование «черного» списка позволяет пользователю блокировать комментарии и голоса аккаунтов, имена которых содержатся в данном списке. Смарт-контракт golos.publication
проверяет наличие имени аккаунта в данном списке при выполнении операций createmsg
, upvote
и downvote
.
Экшен-операция (англ. action) — отправка транзакции в смарт-контракт, вызванная внешним обращением объекта к данному смарт-контракту. В качестве объекта может выступать пользователь, другой смарт-контракт, а также отдельный программный компонент.
Смарт-контракт golos.social
поддерживает следующие экшен-операции пользователей: pin
, unpin
, block
, unblock
, changereput
, updatemeta
и deletemeta
.
Объявление 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
содержит следующие поля:
(name) _SCOPE_
— имя аккаунта (первое имя из пары), который вносит имя интересующего его аккаунта в один из списков — пин-список или список заблокированных аккаунтов;
(name) account
— имя аккаунта, которое было добавлено в один из списков — пин-список или список заблокированных аккаунтов;
(bool) pinning
— true
означает, что имя аккаунта добавлено в пин-список;
(bool) blocking
— true
означает, что имя аккаунта добавлено в список заблокированных аккаунтов.
Примечание:
Наличие true
одновременно в полях pinning
и blocking
недопустимо.
Имя аккаунта удаляется из пин-списка и списка заблокированных аккаунтов, если поля pinning
и blocking
содержат значение false
.
Таблица reputation
является элементом базы данных и используется для хранения репутации аккаунтов.
Таблица reputation
содержит следующие поля:
(name) _SCOPE_
) — имя аккаунта, которому принадлежит репутация;
(int64) reputation
— значение репутации аккаунта с именем в поле _SCOPE_
.
Примечание:
Имя аккаунта с нулевой репутацией содержится в таблице reputation
, если ранее значение его репутации было отличным от нуля.
Экшен-операция pin
используется для добавления аккаунтом в его пин-список имени другого аккаунта.
Экшен-операция pin
имеет следующий вид:
void pin(
name pinner,
name pinning
);
Параметры:
pinner
— имя аккаунта, который добавляет в свой пин-список имя аккаунта, заданного в поле pinning
;
pinning
— имя аккаунта, которое добавляется в пин-список.
Правами на запуск экшен-операции pin
обладает аккаунт pinner
.
На экшен-операцию pin
введены следующие ограничения:
- добавление своего имени аккаунта в пин-список недопустимо, то есть поле
pinning
не должно содержать значение поляpinner
; - добавление в пин-список уже имеющегося в нем имени аккаунта недопустимо;
- добавление имени аккаунта в пин-список, при наличии его в списке заблокированных аккаунтом
pinner
, недопустимо.
Экшен-операция unpin
используется для удаления аккаунтом из его пин-списка имени другого аккаунта.
Операция unpin
имеет следующий вид:
void unpin(
name pinner,
name pinning
);
Параметры:
pinner
— имя аккаунта, который удаляет из своего пин-список имя аккаунта, заданного в поле pinning
;
pinning
— имя аккаунта, который удаляется из пин-списка.
Правами на запуск экшен-операции pin
обладает аккаунт pinner
.
На экшен-операцию unpin
введены следующие ограничения:
- удаление своего имени аккаунта из пин-список недопустимо, то есть поле
pinning
не должно содержать значение поляpinner
; - удаление из пин-списка не имеющегося в нем имени аккаунта недопустимо.
Экшен-операция block
используется для добавления аккаунтом в его «черный» список имени другого аккаунта.
Экшен-операция block
имеет следующий вид:
void block(
name blocker,
name blocking
);
Параметры:
blocker
— имя аккаунта, который добавляет в свой «черный» список имя аккаунта, заданного в поле blocking
;
blocking
— имя аккаунта, которое добавляется в «черный» список.
Правами на запуск экшен-операции block
обладает аккаунт blocker
.
На экшен-операцию block
введены следующие ограничения:
- блокирование своего имени аккаунта недопустимо, то есть поле
blocking
не должно содержать значение поляblocker
; - добавление в «черный» список уже имеющегося в нем имени аккаунта недопустимо.
Экшен-операция unblock
используется для удаления аккаунтом из своего «черного» списка имени другого аккаунта.
Экшен-операция unblock
имеет следующий вид:
void unblock(
name blocker,
name blocking
);
Параметры:
blocker
— имя аккаунта, который удаляет из своего «черного» списка имя аккаунта, заданного в поле blocking
;
blocking
— имя аккаунта, который удаляется из «черного» списка.
Правами на запуск экшен-операции unblock
обладает аккаунт blocker
.
На экшен-операцию unblock
введены следующие ограничения:
- удаление своего имени аккаунта из «черного» списка недопустимо, то есть поле
blocking
не должно содержать значение поляblocker
; - удаление из «черного» списка не имеющегося в нем имени аккаунта недопустимо.
Экшен-операция 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
имеет следующий вид:
void updatemeta(
name account,
accountmeta meta
);
Параметры:
account
— имя аккаунта, профиль которого редактируется;
meta
— значение в виде структуры объявления accountmeta
.
Правами на запуск экшен-операции updatemeta
обладает аккаунт, указанный в поле account
.
Экшен-операция updatemeta
не выполняет каких-либо действий с базой данных, а только проверяет права пользователя, изменяющего свой профиль.
Изменение метаданных пользователей в базе данных реализуется в клиентском приложении.
Правами запуска экшен-операции updatemeta
обладает аккаунт, редактирующий свой профиль.
Экшен-операция deletemeta
используется для удаления профиля аккаунта. Экшен-операция delelemeta
имеет следующий вид:
void deletemeta(name account);
Параметры:
account
— имя аккаунта, профиль которого удаляется.
Экшен-операция deletemeta
не выполняет каких-либо действий с базой данных, а только проверяет права пользователя, удаляющего свой профиль.
Удаление метаданных пользователя из базы данных реализуется в клиентском приложении.
Правами на запуск экшен-операции deletemeta
обладает аккаунт, удаляющий свой профиль.