Смарт-контракт Воркер

Назначение смарт-контракта cyber.worker

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

Используемая терминология

Предложение — поступившая от пользователя заявка на проведение работы с целью улучшения функциональных возможностей или иных характеристик блокчейна CyberWay. Заявка может быть подана в виде отдельного поста с описанием идеи без способа ее реализации или с описанием идеи и уже готовым техническим решением для ее реализации.

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

Отчет — публикация, содержащая описание результатов работы, выполненной в соответствии с ТЗ.

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

Параметры, жестко устанавливаемые в cyber.worker

Параметры, прописанные в коде:

constexpr int witness_count = 21;
constexpr int witness_count_51 = witness_count / 2 + 1;
constexpr int witness_count_75 = witness_count * 3 / 4 + 1;

constexpr unsigned payout_expiration_sec  = 3*60*60;
constexpr unsigned payout_sender_id = 1;
constexpr size_t max_payed_tspecs_per_action = 10;

Идентификатор поста или комментария

При публикации поста c Предложением или комментария к посту клиентское приложение создает для них уникальный идентификатор с типом comment_id_t. Идентификатор представляет собой целочисленное беззнаковое 64-битовое значение, в том числе 0.

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

В зависимости от вида вызываемых операций-действий идентификатор создается в следующих вариантах:

  • идентификатор в варианте уникального автоинкрементного первичного ключа в таблице (идентификатор записи в клиентском приложении);

  • идентификатор в варианте уникального первичного ключа, содержащего первые 64 бита хеш-суммы адреса (CPU-permlink) комментария в клиентском приложении.

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

В состав смарт-контракта cyber.worker входят операции-действия addcomment , editcomment, delcomment, addpropos, editpropos, delpropos, addtspec, edittspec, deltspec, apprtspec, dapprtspec, unapprtspec, startwork, cancelwork, acceptwork, unacceptwork, payout.

Публикация Предложения

addcomment

Операция-действие addcomment используется для создания поста с текстом Предложения, ТЗ или Отчёта, а также комментария к посту с таким содержанием. На основе данного поста вызовом addpropos создается Предложение. Операция имеет вид:

[[eosio::action]] void addcomment(
    comment_id_t comment_id,
    name author,
    std::optional<comment_id_t> parent_id,
    const string& text
);

Параметры:

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

  • author — имя аккаунта, автора поста или комментария.

  • parent_id — идентификатор родительского поста или комментария, к которому публикуется дочерний комментарий. Данный параметр остается пустым, если публикуется пост.

  • text — строка с текстом поста или комментария.

Для вызова данной операции требуются права аккаунта author.

editcomment

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

[[eosio::action]] void editcomment(
    comment_id_t comment_id,
    const string& text
);

Параметры:

  • comment_id — идентификатор редактируемого поста или комментария к нему.

  • text — строка с измененным текстом поста или комментария.

Ограничение: Текст комментария text не должен быть пустым.

Для вызова данной операции требуются права автора поста, в случае редактирования текста поста, или автора комментария, в случае редактирования текста комментария.

delcomment

Операция-действие delcomment используется для удаления поста, содержащего Предложение, ТЗ или Отчет, а также комментария к нему. Операция имеет вид:

[[eosio::action]] void delcomment(
    comment_id_t comment_id
);

Параметр comment_id — идентификатор удаляемого поста или комментария.

Ограничения:

  • Удаление поста допускается в том случае, если к нему не были созданы Предложение, ТЗ или Отчет и у него отсутствуют комментарии.

  • Удаление комментария допускается в том случае, если он не содержит дочерних комментариев.

Для вызова операции `delcomment требуется авторизация автора поста, в случае удаления поста, или автора комментария, в случае удаления комментария.

addpropos

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

[[eosio::action]] void addpropos(
    comment_id_t proposal_id,
    name author,
    uint8_t type
);

Параметры:

  • proposal_id — идентификатор поста, который также является идентификатором Предложения.

  • author — имя аккаунта, публикующего Предложение.

  • type — тип публикуемого Предложения. В зависимости от детализации описания идеи в данном параметре указывается тип Предложения:

    • TYPE_TASK = 0 — Предложение содержит описание идеи без технического решения ее реализации;

    • TYPE_DONE = 1 — Предложение содержит описание идеи с уже готовым техническим решением для ее реализации.

Для вызова addpropos необходима авторизация автора поста author.

Ограничения:

  • Комментарии второго и более уровней (не родительские) не допускаются.

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

editpropos

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

[[eosio::action]] void editpropos(
     comment_id_t proposal_id,
     uint8_t type
);

Параметры:

  • proposal_id — идентификатор редактируемого поста с текстом Предложения.

  • type — тип публикуемого Предложения.

Ограничение: Изменение текста Предложения не допускается, если для него уже создано ТЗ.

Для вызова editpropos необходима авторизация автора Предложения (поста).

delpropos

Операция-действие delpropos используется для удаления ранее опубликованного Предложения. Операция имеет вид:

[[eosio::action]] void delpropos(
    comment_id_t proposal_id
);

Параметр proposal_id — идентификатор удаляемого Предложения (поста).

Ограничение: Удалять Предложение разрешается, если для него не создано ТЗ. После создания для него ТЗ удаление Предложения не допускается.

Для вызова delpropos необходима авторизация автора Предложения (поста).

Публикация Технического Задания

addtspec

Операция-действие addtspec используется для публикации составленного ТЗ для Предложения. Операция имеет вид:

[[eosio::action]] void addtspec(
    comment_id_t tspec_id,
    name author,
    comment_id_t proposal_id,
    const tspec_data_t& tspec,
    std::optional<name> worker
);

Параметры:

  • tspec_id — идентификатор ТЗ (поста).

  • author — имя аккаунта, автора ТЗ (поста).

  • proposal_id — идентификатор Предложения, для которого составлено ТЗ.

  • tspec — параметры распределения вознаграждения за работу, выполняемую в соответствии с ТЗ:

    • asset specification_cost — сумма вознаграждения автору ТЗ;

    • asset development_cost — сумма вознаграждения воркеру;

    • int16_t payments_count — кол-во платежей, необходимых для выплаты указанных сумм вознаграждений;

    • uint32_t payments_interval — интервал проводимых выплат (в секундах). Первая выплата осуществляется по окончании интервала.

  • worker - имя аккаунта воркера, назначенного на реализацию Предложения в соответствии с ТЗ. Для Предложения с типом, отличного от TYPE_DONE, воркер назначается во время вызова startwork.

Для вызова операции addtspec требуется авторизация автора ТЗ (поста).

edittspec

Операция-действие edittspec используется для редактирования (доработки) ранее опубликованного ТЗ, а также для замены воркера. Операция имеет вид:

[[eosio::action]] void edittspec(
    comment_id_t tspec_id,
    const tspec_data_t& tspec,
    std::optional<name> worker
);

Параметры:

  • tspec_id — идентификатор ТЗ (поста).

  • tspec — параметры распределения вознаграждения за работу, выполняемую в соответствии с ТЗ.

  • worker — имя аккаунта воркера, назначаемого на реализацию Предложения.

Ограничение: Замена воркера возможна в том случае, если Предложение имеет тип, отличный от TYPE_DONE.

Для вызова операции edittspec требуется авторизация автора ТЗ (поста).

deltspec

Операция-действие deltspec используется для удаления ранее опубликованного ТЗ. Операция имеет вид:

[[eosio::action]] void deltspec(
    comment_id_t tspec_id
);

Параметр tspec_id — идентификатор удаляемого ТЗ (поста)..

Ограничение: Не допускается удалять ТЗ, если по нему уже начата выплата вознаграждений.

Для вызова операции deltspec требуется авторизация автора ТЗ (поста).

Принятие Технического Задания

apprtspec

Операция-действие apprtspec используется валидаторами для подачи голоса вида «ЗА» при голосовании за принятие ТЗ. Операция имеет вид:

[[eosio::action]] void apprtspec(
    comment_id_t tspec_id,
    name approver
);

Параметры:

  • tspec_id — идентификатор ТЗ (поста).

  • approver — имя аккаунта валидатора, голосующего за принятие ТЗ.

Операция apprtspec отменяет отданный валидатором голос вида «ПРОТИВ», если ранее им была вызвана операция dapprtspec.

dapprtspec

Операция-действие dapprtspec используется валидатором для подачи голоса вида «ПРОТИВ» при голосовании за принятие ТЗ. Операция имеет вид:

[[eosio::action]] void dapprtspec(
    comment_id_t tspec_id,
    name approver
);

Параметры:

  • tspec_id — идентификатор ТЗ (поста).

  • approver — имя аккаунта валидатора, голосующего против принятия ТЗ.

Операция dapprtspec отменяет отданный валидатором голос вида «ЗА», если ранее им была вызвана операция apprtspec.

unapprtspec

Операция-действие unapprtspec используется валидатором для отмены ранее поданного ими голоса при голосовании за принятие ТЗ. Вызов операции аналогичен подаче голоса вида «ВОЗДЕРЖАЛСЯ». Операция имеет вид:

[[eosio::action]] void unapprtspec(
    comment_id_t tspec_id,
    name approver
);

Параметры:

  • tspec_id — идентификатор ТЗ (поста).

  • approver — имя аккаунта валидатора, голосующего как «ВОЗДЕРЖАЛСЯ».

Выполнение работы. Публикация Отчета

startwork

Операция-действие startwork используется автором ТЗ для назначения воркера на выполняемую в соответствии с ТЗ работу. Вызов операции означает начало работы. Операция имеет вид:

[[eosio::action]] void startwork(
    comment_id_t tspec_id,
    name worker
);

Параметры:

  • tspec_id — идентификатор ТЗ (поста), в соответствии с которым начинает выполняться работа.

  • worker — имя назначенного воркера.

Для вызова операции startwork требуется авторизация автора ТЗ.

cancelwork

Операция-действие cancelwork используется автором ТЗ или воркером для отказа от дальнейшего выполнения работы в соответствии с ТЗ. Вызов операции означает прекращение работы. Операция имеет вид:

[[eosio::action]] void cancelwork(
    comment_id_t tspec_id,
    name initiator
);

Параметры:

  • tspec_id — идентификатор ТЗ (поста), в соответствии с которым выполнялась работа.

  • initiator — имя аккаунта, инициатора отказа выполнения работы. Указывается имя аккаунта либо автора ТЗ, либо воркера.

Для вызова операции cancelwork требуются права воркера, если инициатором отказа является воркер, или права автора ТЗ в остальных случаях.

acceptwork

Операция-действие acceptwork используется автором ТЗ для публикации Отчета о результатах выполненной работы. Операция имеет вид:

[[eosio::action]] void acceptwork(
    comment_id_t tspec_id,
    comment_id_t result_comment_id
);

Параметры:

  • tspec_id — идентификатор ТЗ (поста), в соответствии с которым была выполнена работа.

  • result_comment_id — идентификатор Отчета (поста).

Ограничение: Не допускается публикация Отчета в виде комментария. Текст Отчета должен быть размещен в отдельном посте для предоставления его на голосование валидаторам.

Для вызова операции acceptwork требуются права автора ТЗ.

unacceptwork

Операция-действие unacceptwork используется автором ТЗ для удаления ранее опубликованного им Отчета о выполненной воркером работе. Операция имеет вид:

[[eosio::action]] void unacceptwork(
    comment_id_t tspec_id
);

Параметр tspec_id — идентификатор ТЗ (поста), в соответствии с которым была выполнена работа. Опубликованный Отчет о результатах выполнения данной работы удаляется.

Ограничение: Операция unacceptwork не может быть вызвана до завершения голосования валидаторов за принятие результатов работы.

Для вызова операции acceptwork требуются права автора ТЗ.

Выплата вознаграждения

payout

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

[[eosio::action]] void payout(
    name ram_payer
);

Параметр ram_payer — имя аккаунта, который вызывает операцию payout.

Операция может быть вызвана либо смарт-контрактом cyberway.worker из контракта эмиссии, либо пользователем. Каких-либо прав для вызова не требуется.

Аккаунт с именем ram_payer оплачивает транзакцию, если количество ТЗ, по которым производится выплата, превышает значение параметра max_payed_tspecs_per_action.

Last updated