GO_LOSOVANIE

GO_LOSOVANIE позволяет проводить электронные голосования без единого центрального посредника, выполняющего учет голосов и подведение итогов.

Система распределенная, не имеет единой точки отказа, ответственность за корректность голосования равномерно разделяется между всеми участниками сети, число которых на практике может быть порядка нескольких тысяч. При этом гарантируется, что голосование пройдет корректно, если менее 1/3 обеспечивающих безопасность участников будут пытаться его сфальсифицировать. Используется алгоритм консенсуса Tendermint.

ПО решает проблему определения подлинности бюллетени и голоса путем использования криптографии на эллиптических кривых. Используется кривая secp256k1, подпись ECDSA.

Контроль за отсутствием повторных голосов осуществляется за счет учета всех голосов. При этом существующими считаются только голоса, записанные в базу данных распределенной системы, а повторные голоса при попытке записи обнаруживаются и отвергаются.

Система позволяет избавиться от рисков, связанных с заинтересованностью узкого круга лиц в результатах голосования, бумажных бюллетеней, необходимости их ручного подсчета и наблюдения за корректностью подсчета, и обеспечить корректное удаленное голосование.

Установка

Для запуска необходим компьютер под управлением ОС Linux (автор использовал Ubuntu 20.10).

Исходный код может быть получен из ветки master репозитория github.com/Santalov/GO_LOSOVANIE.

git clone https://github.com/Santalov/GO_LOSOVANIE.git

Для запуска необходимо вручную установить Go по инструкции с официального сайта и Docker инструкция. Установка Go зависимостей не требуется, так как используется система Go Modules. Для последующей настройки важно, чтобы были выставлены переменные окружения

echo export GOPATH=\"\$HOME/go\" >> ~/.bashrc
echo export PATH=\"\$PATH:\$GOPATH/bin\" >> ~/.bashrc

Затем необходимо установить Tendermint версии 0.34.10.

git clone 
https://github.com/tendermint/tendermint.git
cd tendermint
git checkout v0.34.10
make install
make build

Для сборки и настройки части зависимостей необходимы компиляторы gcc и g++.8

sudo apt-get update
sudo apt-get install gcc g++

Настройка

Важно, что все скрипты настройки зависят от директории запуска, поэтому отклонения от инструкции могут привести к ошибкам.

Перед запуском необходимо сгенерировать код для работы клиента и валидатора с Protocol Buffers, для чего необходимо установить компилятор Protoc и плагин protoc-gen-go нужных версий. Автоматическая установка осуществляется путем запуска скрипта proto/install.sh.

cd GO_LOSOVANIE/proto/
./install.sh

Для генерации кода из той же папки необходимо выполнить build.sh.

./build.sh core

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

cd ../
./configure.sh single

И аргументом testnet для сети из четырех валидаторов.

cd ../
./configure.sh testnet

Рассмотрим создаваемые скриптом файлы:

  • config/client<номер п.п.>.sh, config/db<номер п.п.>.sh, config/val<номер п.п.>.sh, config/tm<номер п.п.>.sh – скрипты для запуска клиента, базы данных, приложения валидатора, Tendermint Core соответственно.9
  • config/validators.json – файл с массивом валидаторов: их открытые ключи, адреса для обращения к API, адреса, используемые консенсусом Tendermint Core;
  • config/client<номер п.п.>/golosovanie_private_key.json – файл с закрытым ключом клиента;
  • config/node<номер п.п.>/ – папка с настройками валидатора, смысл каждого файла и настроек в них подробно описан в официальной документации Tendermint Core;
  • config/node<номер п.п.>/golosovanie_private_key.json – файл с закрытым ключом валидатора, используемым им при создании транзакций, но не используемым в консенсусе;
  • config/node<номер п.п.>/ip_and_port – временный файл с адресом, на котором валидатор будет ожидать запросы к API;

Запуск валидатора

Сначала необходимо запустить СУБД.

cd GO_LOSOVANIE/config/
./db<номер п.п.>.sh

Затем, после успешного запуска, когда в выводе СУБД перестанут появляться новые строки, запустить приложение валидатора.

./val<номер п.п.>.sh

Сразу после запускается Tendermint Core:

./tm<номер п.п.>.sh

Когда будет запущено 2𝑓 + 1 валидаторов, начнут производиться блоки.

Запуск клиента

Когда запущенная сеть производит блоки, можно запустить клиента.

cd GO_LOSOVANIE/config/
./client<номер п.п.>.sh