CyberWay. Вычисление вознаграждений за пост в приложении Голос. Часть 1
Уважаемые пользователи платформы!
В данной статье мы затронем тему определения сумм вознаграждений за публикацию на веб-сайте приложения Голос в блокчейне CyberWay.
После публикации поста и до момента закрытия его автор, кураторы и бенефициары могут проявлять интерес к процессу голосования за этот пост, а также к прогнозируемым суммам вознаграждений за него. Пользователям предоставляется возможность на веб-сайте приложения Голос получать актуальную информацию о процессе голосования и прогнозируемых выплатах за пост.
В смарт-контракте golos.publication
реализована логика, позволяющая рассчитать все необходимые выплаты за пост и поместить текущие результаты расчета на веб-сайте приложения Голос. Работа логики основана на обработке актуальных данных, получаемых из сообщений от событийной модели Event Engine. Результаты расчета корректируются после каждого принятого от Event Engine сообщения, и зависят, в основном, от таких параметров, как размер пула вознаграждений, количества появляющихся постов, а также веса каждого голосующего пользователя.
В этой публикации и далее приводятся методы, которые могут быть применены в приложениях для определения (прогнозируемых) сумм вознаграждений в процессе голосования за пост в режиме реального времени, в том числе:
- общей суммы вознаграждения за пост;
- общей суммы вознаграждения кураторам поста;
- сумм вознаграждения для каждого из кураторов поста;
- общей суммы вознаграждения бенефициарам поста;
- сумм вознаграждения для каждого из бенефициаров поста;
- суммы вознаграждения автору поста.
Данные, на основе которых определяются вознаграждения за пост
С момента создания поста и до момента его закрытия происходит голосование за этот пост. Размер вознаграждения за созданный пост, в основном, зависит от результатов голосования за него и наличия средств в пуле вознаграждений. Пул вознаграждения выбирается по показателю времени создания поста.
Каждый поданный за пост голос регистрируется в смарт-контракте публикации как событие, информация о котором отправляется в событийную модель Event Engine и далее, по запросу, в приложение Голос. На основе получаемой от Event Engine актуальной информации о событиях, относящихся к процессу голосования за пост, появляется возможность на веб-сайте приложения отображать в режиме реального времени интересующие пользователей (прогнозируемые) суммы вознаграждений за данный пост.
Методы вычисления сумм вознаграждений за пост в режиме реального времени в каждом из приложений могут быть различными. Рекомендуется в методах использовать получаемую от Event Engine информацию о следующих событиях: rewardweight
, poststate
, poolstate
и votestate
.
rewardweight
Структура события rewardweight
содержит данные о текущем весе поста.
struct reward_weight_event {
mssgid message_id;
uint16_t rewardweight;
};
Параметры:
message_id
— ключ-структура поста;rewardweight
— вес поста на текущий момент времени с учетом размера вознаграждения за него (параметр принимает целочисленное значение, определяет вес поста с точностью до сотой доли процента).
Поскольку каждая публикация может быть оценена читателями с т. з. ее полезности, вводится понятие "вес поста". Это условная характеристика, зависящая от суммарного значения отданных за эту публикацию голосов с учетом количества вестинга каждого голосующего. При этом голос "за" имеет положительное значение, а голос "против" - отрицательное."
Итак, вес поста - это только сумма голос х вестинг
. Вестинг - тот процент, который пользователь выделяет именно на данное голосование. Соответственно, награда за пост - это вес поста с учетом количества токенов, выделенных за этот пост из общего пула наград за посты. Если на текущий момент количества постов незначительное и пул наград большой, то награда за пост будет большой. Если количество постов большое, то награда за пост уменьшается. Здесь оценивается процентное соотношение веса поста на фоне веса всех остальных постов.
poststate
Структура события poststate
содержит данные о текущем состоянии поста.
struct post_event {
name author;
std::string permlink;
base_t netshares;
base_t voteshares;
base_t sumcuratorsw;
base_t sharesfn;
};
Параметры:
author
— имя аккаунта-автора поста;permlink
— относительный адрес сообщения, представленный в виде строки;netshares
— доля вознаграждения, выделяемая в пуле за пост (значение параметра вычисляется как сумма значенийvoteshares
всех голосов);voteshares
— доля вознаграждения за пост, определяемая отдельным голосом с учётом его знака (значение отдельного голоса вычисляется как произведение количества вестинга голосующего на его вес.
Это условная величина, определяющая влияние отдельного голоса (“лепту”, вносимую отдельным голосом) на общий вес голосов за пост. Вес голоса зависит не только от количества вестинга, выделенного голосующем на голосование, но также от веса самого голосующего. Вес голосующего, в свою очередь, зависит от наличия (или отсутствия) штрафов, полученного им во время голосования, например, за голосование во время действия штрафного окна.
Параметр может принимать как положительное, так и отрицательное значения. Голосу вида «против» присваивается знак «минус», голосу вида «за» присваивается знак «плюс»);
sumcuratorsw
— суммарный вес голосов всех кураторов на текущий момент времени.sharesfn
— функция для расчета вознаграждений, применимая кshares
поста.
poolstate
Структура события poolstate
содержит данные о текущем состоянии пула вознаграждений.
struct pool_event {
uint64_t created;
counter_t msgs;
eosio::asset funds;
wide_t rshares;
wide_t rsharesfn;
};
Параметры:
created
— время создания поста (идентификатор пула);msgs
— количество постов, вознаграждения за которые выплачиваются из пулаcreated
;funds
— количество токенов в пуле вознаграждений;rshares
— суммарное значениеrshares
всех постов в пуле;rsharesfn
— суммарное значениеrsharesfn
всех постов в пуле.
votestate
Структура события votestate
содержит данные о текущих результатах голосования за пост.
struct vote_event {
name voter;
name author;
std::string permlink;
int16_t weight;
base_t curatorsw;
base_t rshares;
};
Параметры:
voter
— имя аккаунта (пользователя), который голосует за пост;author
— имя аккаунта автора поста;permlink
— относительный адрес поста;weight
— вес голоса аккаунтаvoter
. Во время голосования вес голоса указывается с точностью до сотой доли процента в виде целочисленного значения в интервале от 0 до 10000 (значение 10000 соответствует 100%). Вес голоса «против» указывается со знаком «минус»;curatorsw
— процент кураторского вознаграждения (доля вознаграждения, выделяемая отдельному куратору от общей суммы вознаграждения кураторам. Величина доли зависит от веса данного куратора);rshares
— условный параметр, используемый в расчетах вознаграждений за пост. Значение параметра определяется как произведение количества активного вестинга голосующего на вес голоса в процентах (rshares = eff_vesting * weight / 10000
). Параметр может принимать как положительное, так и отрицательное значения. Голосу вида «против» присваивается знак «минус».
На этом мы заканчиваем описание данных, на основе которых определяются вознаграждения за пост. В следующей публикации мы познакомим вас с методом вычисления общей суммы вознаграждения за пост.
Cерия статей, раскрывающих идею и принципы функционирования блокчейна CyberWay и приложения Голос:
- Ответы на вопросы о CyberWay часть 4, Часть 3, Часть 2, Часть 1
- Golos.io: Адаптация к блокчейну CyberWay
- Основные положения CyberWay
- CyberWay: предпосылки создания платформы. Основные отличия от EOS
- Разработка новой блокчейн-платформы CyberWay. Дорожная карта проекта
- Функционирование смарт-контрактов приложения Голос на платформе БЧ CyberWay
- Техническая реализация bandwidth на платформе CyberWay
- Testnet: Экспериментальная версия
- Общее о структуре таблиц в MongoDB, Коллекции таблиц (документов) в MongoDB, используемых в системных контрактах, Коллекции таблиц (документов) в MongoDB, используемых в контрактах приложения Голос - коллекция контракта golos.charge, Коллекция контракта golos.publication, Коллекции контракта golos.vesting
- CyberWay. Доменные имена и имена пользователей
- CyberWay. Событийная модель. Часть 1, Часть 2
Каналы коммуникации с Golos•Core
- https://t.me/goloscoretc (решение технических вопросов, связанных с работой блокчейн, нод, api и др.)
- https://t.me/joinchat/BLwf_A118xQ57nsM1Q4MPA (канал для вноса предложений от комьюнити, обсуждение перехода на кодовую базу EOS)
- https://t.me/golos_tools (решение вопросов по различным интерфейсам и дополнительным инструментам, создаваемым Golos•Core)
- https://t.me/goloscore_analytics (решение вопросов по работе экономики блокчейн, статистическим экономическим данным, аналитике данных)
- https://t.me/goloscoretech (новостной канал, с актуальной информацией от Golos•Core)
Мы будем очень рады, если вы поддержите делегата @goloscore. Заходите на страничку https://golos.io/~witnesses голосуйте за делегата Golos•Core!
Спасибо за внимание и хорошего дня!
С уважением,
Команда Golos•Core: @andreypf, @korpusenko, @maslenitsa, @muhazokotuha, @zxcat, @annaeq, @anazarov79, @kaynarov, @s-medvedev, @eugin, @dedbaraded, @jimak.