Как работает WE.Vote¶
Процесс голосования в системе WE.Vote разделен на четыре основных этапа. В данном разделе описана работа элементов системы для каждого из этапов. Пользовательские сценарии работы приведены в разделе Как пользоваться сервисом.
1.Создание голосования и приглашение участников¶
Администратор создает голосование в клиентском приложении WE.Vote. Голосование содержит следующие данные:
описание голосования;
дата и время проведения голосования;
список вопросов и ответов к ним;
список участников голосования;
дополнительные документы для ознакомления участников голосования.
Дата и время проведения голосования передаются в блокчейн в открытом виде.
Описание голосования, список вопросов и ответов, а также дополнительные документы хэшируются, их хэш-суммы также публикуются в блокчейне. Этот процесс позволяет избежать подмены данных:
при изменении исходных данных меняется их хэш-сумма;
подмена данных обнаруживается на стороне участника путем сверки полученных данных с их хэш-суммами, опубликованными в блокчейне.
Также при создании голосования в блокчейн отправляются публичные ключи приглашенных участников. При этом, персональные и контактные данные учетных записей не передаются в сеть: при голосовании транзакция подписывается приватным ключом участника, а публичный ключ становится его единственным открытым идентификатором.
Исходные данные, опубликованные в блокчейне в виде хэш-сумм, также не передаются по сети из соображений конфиденциальности: они сохраняются в локальной базе сервера и доступны только участникам голосования при успешной аутентификации. Это позволяет надежно ограничить доступ не только к результатам голосования, но и к его повестке.
2. Формирование и публикация общего публичного ключа (MainPublicKey)¶
Мастер-сервер получает из блокчейна данные о подготовке нового голосования, после чего определяет список доступных криптографических сервисов на серверах. На каждый из них мастер-сервер отправляет запрос на создание ключевой пары для голосования. В ответ на запрос, каждый криптографический сервис возвращает публичную часть созданного ключа (см. раздел Генерация ключей).
Мастер-сервер генерирует из полученных публичных ключей общий публичный ключ и публикует его в блокчейн на адрес голосования. В дальнейшем, общий публичный ключ используется сервисами шифрования участников для шифрования заполненных бюллетеней.
После формирования и публикации общего публичного ключа, система получает все необходимые данные для инициации голосования:
исходные данные голосования сохранены локально в БД каждого сервера;
хэш-суммы данных опубликованы в блокчейне и служат для контроля целостности материалов голосования;
общий публичный ключ, необходимый для шифрования голосов участников, также опубликован в блокчейне.
При этом, ни один из участников не располагает каким-либо общим приватным ключом, при помощи которого можно было бы осуществить расшифровку бюллетеней. Соответственно, ни организатор голосования, ни сами участники не имеют возможности подменить данные в бюллетенях, а подсчет голосов осуществляется путем гомоморфного сложения зашифрованных результатов с предварительным и последующим контролем целостности данных (см. разделы Шифрование и Доказательства с нулевым разглашением главы Криптографические алгоритмы).
3. Проведение голосования¶
После формирования и публикации общего публичного ключа в блокчейне, система ожидает установленного времени начала голосования. Каждый из приглашенных администратором участников голосования получает уведомление о голосовании по электронной почте.
Зарегистрировавшись на сервере и получив доступ к своей учетной записи (см. раздел Регистрация в сервисе), участник может ознакомиться с вопросами и материалами голосования. При этом, клиентское приложение участника запрашивает у сервера сохраненные данные голосования. Запрос подписывается соответствующим ключом, выданным участнику при регистрации.
Получив от сервера метариалы голосования, клиентское приложение участника вычисляет их хэш-суммы и сравнивает их с суммами, сохраненными в блокчейне на стадии создания голосования. Это гарантирует участнику целостность данных.
С началом голосования, участник получает возможность дать ответы на вопросы, внесенные в повестку:
участник заполняет бюллетень;
клиентское приложение шифрует заполненный бюллетень при помощи общего публичного ключа;
клиентское приложение подписывает транзакцию на публикацию зашифрованного бюллетеня в блокчейн ключом участника.
Данные, публикуемые в блокчейн, общедоступны. Поэтому транзакция на публикацию зашифрованного бюллетеня доступна всем участникам голосования. Однако, ни один из них не имеет возможности ознакомиться с опубликованными ответами, поскольку не располагает приватным ключом, соовтетствующим общему публичному ключу голосования.
При публикации зашифрованного бюллетеня, криптографический сервис проверяет корректность установленных диапазонов, не расшифровывая данных бюллетеня (см. раздел Доказательство корректности диапазона в бюллетене). Если установлен факт подмены данных, транзакция отклоняется.
В ходе голосования, каждый участник имеет возможность изменить свои варианты ответов. При этом, клиентское приложение шифрует и публикует в блокчейне новый бюллетень участника при помощи повторной транзакции. К подсчету голосов принимается только последний зашифрованный бюллетень, опубликованный участником.
По истечении периода голосования, который был определен администратором при его создании, любые транзакции от участников голосования отклоняются системой.
4. Подведение итогов голосования¶
По завершении голосования, все сервера системы независимо проводят подсчет голосов. Подсчет голосов производится без расшифровки результатов голосования, поскольку ни один криптографический сервис не имеет общего приватного ключа для расшифровки.
Результаты голосования по каждому из вопросов подсчитываются путем гомоморфного сложения зашифрованных величин (см. раздел Шифрование). В результате, каждый криптографический сервис независимо получает зашифрованное значение суммы голосов участников для каждого из вопросов.
Затем, каждый криптографический сервис приступает к предварительной расшифровке итогов голосования. Для этого сервис применяет собственный приватный ключ, который использовался на шаге 2 для генерации общего публичного ключа. В результате расшифровки, каждый сервис получает нечитаемый предварительный итог голосования.
На этом этапе производится контроль целостности результатов расшифровки при помощи алгоритма ZKP Chaum-Pedersen (см. раздел Доказательство расшифровки). Это позволяет убедиться, что данные голосования не были скомпрометированы каким-либо из криптографических сервисов.
Предварительно расшифрованные итоги голосования от каждого сервиса публикуются в блокчейне при помощи транзакций на соответствующие ноды.
Мастер-сервер собирает результаты предварительной расшифровки, опубликованные в блокчейне. Затем криптографический сервис мастер-сервера суммирует полученные предварительные итоги голосования и окончательно расшифровывает их. Готовые результаты голосования публикуются в блокчейн.
При этом, в случае выхода из строя одного или нескольких серверов, мастер-сервер имеет возможность собрать и расшифровать итоговые результаты голосования, благодаря схеме разделения секрета Шамира. Если в формированиии общего публичного ключа участвовало N серверов, для расшифровки результатов достаточно собрать K < N предварительно расшифрованных результатов голосования.