VIZ.cx
denis-skripnik posted text :

Протокол опросов 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