Протокол опросов viz-votes: примеры кодов
Здравствуйте. Я уже анонсировал, что появился сервис https://dpos.space/viz/polls , позволяющий создавать опросы и голосовать по ним.
Создание опроса
Делается это путём отправки определённого количества VIZ аккаунту @committee (сейчас 100).
Сам код операции, что пишется в memo:
Блок 23648539
{"contractName":"viz-votes","contractAction":"createVote","contractPayload":{"question":"Есть ли у вас планы на следующий год, касающиеся Viz?","answers":["Да: опубликую","Да: оставлю при себе","Нет"],"end_date":1609433940,"consider":0}}
`
- contractName (используется везде) - viz-votes. Это название софт-смарта;
- contractAction - createVote, т.е. создание голосования;
- contractPayload - данные действия:
question - вопрос, answers - массив вариантов ответа, end_date - дата и время окончания опроса в формате Unix time (int), consider - тип учёта соц. капитала: 0 - только личный, 1 - личный + прокси, 2 - как при наградах.
Голосование
Тут отправляется custom транзакция с JSON содержимым.
- id viz-votes;
- Указывается только required_regular_auths с логином голосующего (означает, что участвовать в опросах можно с regular ключом);
- contractName (название контракта) - viz-votes;
- contractAction (действие) - voteing, что означает голосование;
- contractPayload - данные по опросу и голосу:
votePermlink - то, что идентифицирует конкретный опрос, answerId - id варианта ответа (соответствует ключу массива ответов).
Пример JSON:
{"contractName":"viz-votes","contractAction":"voteing","contractPayload":{"votePermlink":"survey-1609241121","answerId":"0"}}
Как работает
1. Парсит блоки в поисках переводов VIZ к committee или custom операций;
`
2. В первом случае проверяется, что memo - json, что действие - createVote, а также что формат соответствует стандарту,
Во втором проверяется id, что действие voteing, а также что формат соответствует коду голосования.
`
## `Создание опроса
`
1. После проверки формата производится добавление пермлинка: survey-unixTime.
`
где "survey-" - это первая часть пермлинка, а unixTime - дата и время перевода (timestamp) в Unix time формате;
2. Добавление в базу данных. В функцию передаются вопрос, ответы, пермлинк опроса/референдума, тип учёта соц. капитала и Unix time завершения опроса;
Голосование
1. После проверки формата и действия получаем опрос по пермлинку из БД., а затем проверяем, что Unix time текущего времени <= unix time окончания опроса.
2. Также проверяется, что answerId такой есть в массиве вариантов ответа. Для этого берётся length-1 массива вариантов и проверяется, что он >= answerId.
3. Далее получаем информацию об аккаунте, после чего, в зависимости от consider считаем соц. капитал: если 0, только личный в parseFloat; если 1, прибавляем к parseFloat личного parseFloat прокси; Если 2, прибавляем к личного parseFloat полученного делегирования и вычитаем отданное делегирование (как при наградах).
4. После того обновляем вариант ответа. Идентификация по пермлинку опроса и логину голосующего, но в функцию передаётся всё в следующем порядке: пермлинк, id варианта ответа, логин (берётся из required_regular_auths) и shares;
5. Если статус равен одному (всё ок).
Как формируются результаты на странице опроса
- получаем список всех голосов по пермлинку опроса;
- Суммируем все SHARES, находя общую сумму, создаём объекты вариантов и голосовавших пользователей;
- Суммируем соц. капитал для каждого варианта ответа благодаря variants, где ключ - это id варианта;
- Также производим формирование массива users, куда добавляем объекты с логином и SHARES пользователя;
- Вычисляем процент для каждого варианта ответа при помощи деления суммы SHARES варианта каждого на общую сумму и умножения на 100 с фиксацией до двух знаков после запятой;
- Далее выводим в объект api строку с уведомлением о методе учёта соц. капитала, после чего формируем массив объектов с вариантами ответов и процентами;
- В конце выводим топ 100 пользователей (от большего соц. капитала к меньшему) по каждому варианту. Для этого проходим циклом по массиву users и, взяв название варианта из базы с опросом, выводим отдельным массивом.
Всё
Напоминаю, что протокол опросов viz-votes создан, чтоб каждый активный участник сообщества мог выяснять, что нужно сообществу Viz в лице владельцев соц. капитала, а что нет.
Добро пожаловать: https://dpos.space/viz/polls
Comments