Алгоритм сервиса референдума

19 дней назад
79 в голос

Здравствуйте. Как мы все знаем, после ХФ с воркерами надо будет решать, куда распределять токены из аккаунта референдума @gc-referendum.

Для этого необходим инструмент, который позволил бы проводить референдумы. Да и в целом, опросы бы не помешали...

Важные моменты:

  1. Для создания опроса необходимо, чтобы сжигалось в @null определённое количество GBG;
  2. Но в то же время, чтобы пользователи могли голосовать, авторизуясь при помощи постинг ключа;
  3. Должен быть интерфейс для удобного голосования и просмотра результатов;
  4. Аккаунт проекта должен публиковать комментарии с опросами/референдумами и обновлять их по мере голосования участниками. Комментарии, потому что на Голосе, если больше 4 постов в сутки, штраф на выплату, а проекту надо зарабатывать на чём-то;
  5. Приниматься должен только первый голос во избежании спама;
  6. Результаты должны подсчитываться на основе СГ участников;
  7. Необходимо, чтобы каждый разработчик при желании мог пропарсить блокчейн и получить все опросы с их результатами.

Решение

@ksantoprotein описал в постах отличную вещь, как софт-смартконтракты. Это и возьмём за основу. Но в отличие от описанных, наши не будут токенами и действиями, связанными с ними, а опросами (их созданием и голосованием за них).

Алгоритм:

  1. Сервис парсит блоки в поисках операции transfer к null. Найдя, проверяет, что там json, и если это так, проверяет contractName. Если он votes, смотрит contractAction;
  2. Если contractAction - createVote, проверяет валидность для создания опроса в contractPayload;
  3. Если там 3 элемента: question (строка), answers (массив) и end_date (integer unixtime), то всё ок. Первое поле - опрос, второе - список ответов, третье - дата и время завершения опроса в формате unixtime.
  4. Если всё ок, опрос добавляется в базу данных и получает свой id, который является и пермлинком. Кроме того, туда в таком-же виде добавляется вопрос и список ответов;
  5. Также скрипт проекта парсит custom с id votes.
  6. Если найден json с contractName votes и contractAction voteing, проверяет валидность contractPayload;
  7. Если там есть voteId (integer, представляющий собой unixtime) и answerId - integer варианта ответа (от 0 до n, где n - количество вариантов), всё ок;
  8. Далее проверяет наличие в базе данных опроса с таким id. Если есть,, и unixtime получения <= unixtime окончания опроса, проверяет наличие ответа с таким идентификатором. Всё ок - происходит добавление ответа в базу ответов.
    При этом, помимо указанных полей (id опроса и варианта) указывается логин и GESTS на момент голосования (берётся из get_accounts - только личные GESTS).
  9. Также вызывается метод, выводящий все ответы на данный опрос.
    Создаётся массив вариантов ответа, в котором id элементов - это id соответствующего ответа. В значении после преобразования в float суммируются GESTS, относящиеся к нему.
    Далее производится суммирование всех GESTS всех вариантов и выявляется процент каждого из них относительно других.
    Этот результат и публикуется в посте опроса
  10. Создаётся страница, у которой есть get параметр vote_id. Введя его и id опроса, пользователь попадает на страницу со списком вариантов ответа. Они подгружаются из базы данных со списком опросов. value радиокнопок - это id вариантов ответа.
    По клику по "Голосовать" передаётся всё это javascript функции, которая проверяет авторизацию. Если её нет, запрашивается логин и постинг ключ. Если есть, производится отправка custom операции формата голосования.
  11. Ещё одна страница, которая выводит предварительные результаты опроса. Это производится путём получения текста комментария через get_content.

Примеры кода

1. Создание опроса:

{"contractName": "votes", "contractAction": "createVote", "contractPayload": {"question": "Куда распределить GOLOS аккаунта референдума", "answers": ["всем распределить","в фонд воркеров","сжечь"], "end_date": 1103928734}}

2. Голосование:

{"contractName": "votes", "contractAction": "voteing", "contractPayload": {"voteId": 1001900954, "answerId": 1}}

В БД. добавляется "login":"user","gests":10302435.

Всё.

Думаю сделаю на этой неделе или, максимум, на следующей.

Порядок сортировки:  Популярное
74
  ·  16 дней назад

@denis-skripnik вот ещё один вопросик. создание опроса через сжегание, а кто может иницировать опрос? - любой кто сожгёт просто гбг?

·
79
  ·  16 дней назад

@erikkartmen Да. Сожгет с указанием определённого memo. Ну или воспользуется инструментом генерации url перевода.

·
·
74
  ·  16 дней назад

@denis-skripnik плохо! что любой может, так как за всё время существования голоса я тут столько неадекватов повидал и как не странно им всем нужна слава, чтоб их слушали и читали и внимание - ради такого многие последнее продадут и купят гбгшек сжечь и притянуть на себя внимание, а там глядишь и бунт устроят)))) последнее это уже шуточки шучу))))

·
·
·

@erikkartmen Никто не мешает установить цену сжигания в 1000, а то и несколько десятков тысяч GBG.

·
·
·
·
74
  ·  16 дней назад

@upromo ладно, хорошо - смотрим, по реальному пегу гбгшка должна порядка трёх рублей русских стоить - 1000 гбг = 3000 рублей - да любой сумасшедший их тогда может инициировать!
вариант 2: порог в 10000 гбг - хорошо, тут уже 30000 рублей - может и не каждый сжечь, так как по карману может ударить, но тогда при таком пороге мы тоже будем выкидывать грубо говоря на ветер такую сумму просто за ради создать полезный и нужный опрос.
я не критикую, а наоборот поощеряю создание проектов и приложений (вообще движ это ж хорошо!) , а просто пытаюсь показать уязвимую сторону (уязвимую не в коде, а в головах!)

·
·
·
·
·
79
  ·  16 дней назад

@erikkartmen Ок. А какая альтернатива? Всё же лучше, чем без сжигания, делать создание опросов, считаю. Правда согласен, что 10К ГБГ - это слишком. Максимум 500.

·
·
·
·
·
·
74
  ·  15 дней назад

@denis-skripnik ну я пока не придумал ещё)))

73
  ·  19 дней назад

Hello, @denis-skripnik. You received 90% upvote from Flotilia.


Здравствуйте, @denis-skripnik. Вы получили 90% апвот от Флотилии.

Hello, @denis-skripnik. You received 100% upvote from UPRomo for burned GBG. Promoted this post in the queue: @denis-skripnik.
Possible profit of like 2.33% (may vary greatly due to fluctuations in the pool).

The instruction for burning, for promotion or a drop of posts.

Invest in UPRomo and promote increase in number of the burned GBG.

Agreement on the use of service UPRomo.


Здравствуйте, @denis-skripnik. Вы получили 100% апвот от UPRomo за сожженные GBG. Продвигали этот пост в очереди: @denis-skripnik.
Возможная доходность апа 2.33% (может сильно отличаться из-за колебаний пула).

Инструкция по сжиганию для продвижения или задвигания постов.

Инвестируйте в UPRomo и способствуйте увеличению количества сжигаемых GBG.

Соглашение об использовании UPRomo.

67
  ·  16 дней назад

@denis-skripnik есть ряд вопросов по данному предложению:

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

  • установление минимального порога голосующей СГ (например 10???% от всей СГ) - этот момент спорный, есть аргументы как за, так и против
  • установление отношения процента голосов ЗА к проценту голосов ПРОТИВ для того, чтобы предложение считалось одобренным (например не менее 10%). То есть как минимум 55% голосов должны быть отданы ЗА
  • установление временного интервала, в течение которого должно сохраняться требуемое соотношение голосов (например ЗА не менее чем на 10% больше чем против) в днях...
·
79
  ·  16 дней назад

@on0tole Здравствуйте.

Делегаты - это люди, и они будут рассматривать тогда, когда посчитают нужным. Такого действия, как передача на рассмотрение, не будет - это можно сделать при общении с ними (передать ссылку на результаты).
И опять же, организаторы референдума могут публично сообщить у себя, состоялся он или нет, и если нет, почему.