Здравствуйте. Как мы все знаем, после ХФ с воркерами надо будет решать, куда распределять токены из аккаунта референдума @gc-referendum.
Для этого необходим инструмент, который позволил бы проводить референдумы. Да и в целом, опросы бы не помешали...
Важные моменты:
- Для создания опроса необходимо, чтобы сжигалось в @null определённое количество GBG;
- Но в то же время, чтобы пользователи могли голосовать, авторизуясь при помощи постинг ключа;
- Должен быть интерфейс для удобного голосования и просмотра результатов;
- Аккаунт проекта должен публиковать комментарии с опросами/референдумами и обновлять их по мере голосования участниками. Комментарии, потому что на Голосе, если больше 4 постов в сутки, штраф на выплату, а проекту надо зарабатывать на чём-то;
- Приниматься должен только первый голос во избежании спама;
- Результаты должны подсчитываться на основе СГ участников;
- Необходимо, чтобы каждый разработчик при желании мог пропарсить блокчейн и получить все опросы с их результатами.
Решение
@ksantoprotein описал в постах отличную вещь, как софт-смартконтракты. Это и возьмём за основу. Но в отличие от описанных, наши не будут токенами и действиями, связанными с ними, а опросами (их созданием и голосованием за них).
Алгоритм:
- Сервис парсит блоки в поисках операции transfer к null. Найдя, проверяет, что там json, и если это так, проверяет contractName. Если он votes, смотрит contractAction;
- Если contractAction - createVote, проверяет валидность для создания опроса в contractPayload;
- Если там 3 элемента: question (строка), answers (массив) и end_date (integer unixtime), то всё ок. Первое поле - опрос, второе - список ответов, третье - дата и время завершения опроса в формате unixtime.
- Если всё ок, опрос добавляется в базу данных и получает свой id, который является и пермлинком. Кроме того, туда в таком-же виде добавляется вопрос и список ответов;
- Также скрипт проекта парсит custom с id votes.
- Если найден json с contractName votes и contractAction voteing, проверяет валидность contractPayload;
- Если там есть voteId (integer, представляющий собой unixtime) и answerId - integer варианта ответа (от 0 до n, где n - количество вариантов), всё ок;
- Далее проверяет наличие в базе данных опроса с таким id. Если есть,, и unixtime получения <= unixtime окончания опроса, проверяет наличие ответа с таким идентификатором. Всё ок - происходит добавление ответа в базу ответов.
При этом, помимо указанных полей (id опроса и варианта) указывается логин и GESTS на момент голосования (берётся из get_accounts - только личные GESTS). - Также вызывается метод, выводящий все ответы на данный опрос.
Создаётся массив вариантов ответа, в котором id элементов - это id соответствующего ответа. В значении после преобразования в float суммируются GESTS, относящиеся к нему.
Далее производится суммирование всех GESTS всех вариантов и выявляется процент каждого из них относительно других.
Этот результат и публикуется в посте опроса - Создаётся страница, у которой есть get параметр vote_id. Введя его и id опроса, пользователь попадает на страницу со списком вариантов ответа. Они подгружаются из базы данных со списком опросов. value радиокнопок - это id вариантов ответа.
По клику по "Голосовать" передаётся всё это javascript функции, которая проверяет авторизацию. Если её нет, запрашивается логин и постинг ключ. Если есть, производится отправка custom операции формата голосования. - Ещё одна страница, которая выводит предварительные результаты опроса. Это производится путём получения текста комментария через 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.
Всё.
Думаю сделаю на этой неделе или, максимум, на следующей.
@denis-skripnik вот ещё один вопросик. создание опроса через сжегание, а кто может иницировать опрос? - любой кто сожгёт просто гбг?
@erikkartmen Да. Сожгет с указанием определённого memo. Ну или воспользуется инструментом генерации url перевода.
@denis-skripnik плохо! что любой может, так как за всё время существования голоса я тут столько неадекватов повидал и как не странно им всем нужна слава, чтоб их слушали и читали и внимание - ради такого многие последнее продадут и купят гбгшек сжечь и притянуть на себя внимание, а там глядишь и бунт устроят)))) последнее это уже шуточки шучу))))
@erikkartmen Никто не мешает установить цену сжигания в 1000, а то и несколько десятков тысяч GBG.
@upromo ладно, хорошо - смотрим, по реальному пегу гбгшка должна порядка трёх рублей русских стоить - 1000 гбг = 3000 рублей - да любой сумасшедший их тогда может инициировать!
вариант 2: порог в 10000 гбг - хорошо, тут уже 30000 рублей - может и не каждый сжечь, так как по карману может ударить, но тогда при таком пороге мы тоже будем выкидывать грубо говоря на ветер такую сумму просто за ради создать полезный и нужный опрос.
я не критикую, а наоборот поощеряю создание проектов и приложений (вообще движ это ж хорошо!) , а просто пытаюсь показать уязвимую сторону (уязвимую не в коде, а в головах!)
@erikkartmen Ок. А какая альтернатива? Всё же лучше, чем без сжигания, делать создание опросов, считаю. Правда согласен, что 10К ГБГ - это слишком. Максимум 500.
@denis-skripnik ну я пока не придумал ещё)))
@denis-skripnik есть ряд вопросов по данному предложению:
если на референдум будут выноситься вопросы (предложения), касающейся развития Голоса, в т.ч. внесение различных изменений - для того чтобы данные изменения были рассмотрены и приняты делегатами, (возможно) должен быть установлен ряд порогов
@on0tole Здравствуйте.
Делегаты - это люди, и они будут рассматривать тогда, когда посчитают нужным. Такого действия, как передача на рассмотрение, не будет - это можно сделать при общении с ними (передать ссылку на результаты).
И опять же, организаторы референдума могут публично сообщить у себя, состоялся он или нет, и если нет, почему.
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.
Hello, @denis-skripnik. You received 90% upvote from Flotilia.
Здравствуйте, @denis-skripnik. Вы получили 90% апвот от Флотилии.