Как создать систему электронного голосования на блокчейне?

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

Для чего нужен блокчейн в системе голосования?

Голосование, как процесс принятия решений по важнейшим для общества вопросам, известно человечеству тысячи лет. Было время, когда решения принимались узким кругом уполномоченных лиц путём бросания цветных шариков в специальную амфору или же по жесту руки. Однако, население росло, общество развивалось и в процессе принятия решений стали принимать участие всё больше людей – сотни тысяч и даже миллионы. Тогда на смену таким простым методам подсчёта голосов пришли более сложные: стали создаваться избирательные участки, амфоры заменили на урны для голосования, а шарики – на избирательные бюллетени. Хотя такой подход к голосованию позволил учитывать мнение огромных масс населения, он имеет ряд минусов:

  • Технические: возможность вброса бюллетеней; использование исчезающих чернил на участках для подделки результатов; подделка протоколов; нарушение тайны голосования; преднамеренные ошибки в подсчётах; низкая скорость подсчёта результатов.
  • Социальные: подкуп («карусели» и т.д.); административное давление на избирателя.
  • Экономические: высокая стоимость для государственного бюджета. Например, выборы 2015 года в России стоили почти 100 000 000$.

Часть из описанных проблем решают электронные системы голосования (применяются в таких странах как Индия, Бразилия, Эстония, Нидерланды, США Германия), хотя их использование также несёт в себе ряд минусов:

  • Проблемы с безопасностью (электронные системы могут быть взломаны, зачастую с этим связаны громкие скандалы)
  • Проблемы с верификацией результатов выборов (в отличии от бумажных бюллетеней, которые можно пересчитать)
  • Возможность некорректной работы системы из-за ошибок в ПО

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

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

В основе технологии блокчейн лежит транзакционная модель: у каждого пользователя есть кошелёк, с уникальными публичным и приватным ключами, которыми он подтверждает любое изменение данных. Вся информация о транзакциях хранится в последовательно записанных блоках, таким образом, хэш данных предыдущего блока входит в данные следующего. Так обеспечивается неизменность данных – изменение любого блока автоматически сделает невалидными все последующие. Блокчейн хранит всю информацию о всех транзакциях в полном объеме одновременно на всех узлах, и она не может быть изменена или удалена. Наиболее широкое применение блокчейн нашел именно в сфере регистрации данных о движении имущественных прав на некие цифровые объекты – на этой идее построены все современные криптовалюты. Такие объекты, называемые обычно «монетами» или «токенами», могут либо создаваться автоматически, по заранее оговоренному алгоритму, в процессе эксплуатации системы («майниться») либо выпускаться имеющим на это права участником системы.

Идея применения блокчейна в системах голосования напрашивается сама собой: блокчейн позволяет заменить древнюю технологию голосования путем передачи кому-то своего голоса, выраженного физическим объектом (шариком нужного цвета, бумажным бюллетенем и т.п.), на передачу цифрового токена. При этом, как и во многих других случаях перехода бизнес-процесса из физического мира в цифровой, резко сокращаются транзакционные издержки и повышается доступность системы. Кроме того, применение блокчейна дает дополнительные преимущества:

  • Неподдельность результатов. Результаты голосования, организованного с применением блокчейн технологий, невозможно подделать. Всегда можно проверить, сколько голосов было выпущено в начале голосования, как они распределялись по кошелькам и в какое время проводились транзакции
  • Прозрачность процесса. Блокчейн даёт возможность контроля за ходом голосования, так как любое заинтересованное лицо может развернуть узел с полной копией всех данных и самостоятельно проанализировать их на уровне блокчейна.
  • Анонимность. Каждый участник голосования имеет возможность создать пару из публичного и приватного ключа на локальной машине и никто, кроме него не будет знать о том, что конкретный кошелек принадлежит именно ему. Таким образом, никто не может знать, как проголосовал данный участник, за исключением случая, когда участник сам объявит о том, что данный кошелёк принадлежит ему.
  • Скорость обработки данных. Голосование в рамках города, региона, страны или корпорации с офисами в разных странах может быть сопряжено со значительными расходами, организационными сложностями и временными потерями – как на проведение голосования, так и на обработку данных. Децентрализация позволит видеть результаты голосования по всей стране в целом, несмотря на то, что каждый регион/город/район может эксплуатировать свой собственный узел системы для распределения нагрузки.

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

  • Многие из существующих проектов основаны на какой-либо развитой платформе вроде Ethereum или Bitcoin. Хотя в последнее время курс криптовалют очень волатилен, тот же Эфир впечатляюще вырос по сравнению с началом года, что делает голосования, основанные на этой платформе достаточно дорогостоящими.
  • Большинство из этих систем используют алгоритм proof of work, что делает вычисление результатов при масштабном голосовании очень медленным (детально проблемы указанные выше описаны здесь:
  • Они продвигаются исключительно как самостоятельные платформы для голосования (т.е. для проведения голосования или участия в нём вы должны пройти явный процесс регистрации в платформе).
  • Большая часть из них осталась на уровне идеи или перестала развиваться

О процессе голосования

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

В финальной версии приложения мы хотим реализовать различные виды голосований: мажоритарное (решение приниматься простым большинством), альтернативное (выбираются несколько вариантов из предложенных) и рейтинговое (каждому варианту присваивается определённый «вес» в зависимости от его предпочтительности). Все они могут быть открытыми (может подключиться любой желающий) и закрытыми (для участия необходимо приглашение). Сферы, в которых такое голосование может быть полезно, могут быть самые разные: выборы главы ТСЖ, голосование на любом конкурсе, голосование за решение в рамках акционерного общества и т.д.

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

В прототипе процесс создания голосования состоит из нескольких этапов:

  • Пользователь регистрируется в системе и на локальной машине генерирует ключевую пару кошелька. Система просит у пользователя кодовое слово и шифрует им данные кошелька, после чего сохраняет зашифрованный кошелек в тот же блокчейн, для того, чтобы избавить пользователя от необходимости устанавливать специализированное программное обеспечение кошелька. В тоже время, кошелёк в открытом виде обрабатывается только на стороне клиента, что гарантирует наличие доступа к кошельку только у его хозяина. Однако, важно понимать, что при потере кодового слова, пользователь потеряет и доступ к кошельку, и в этом случае помочь ему будет невозможно.
  • На этапе прототипа, мы решили выдавать всем зарегистрированным пользователям 10 IDV токенов, предназначенных для оплаты создания голосования в системе. С их помощью любой зарегистрированный участник сможет организовать голосования и посмотреть, как работает весь процесс. Поэтому сразу после создания кошелька наш процессинговый сервер начисляет на кошелёк пользователя 10 IDV.
  • Стоимость создания голосования в системе составляет 1IDV. Таким образом, когда пользователь создаёт голосование, система проверят баланс и, если средств достаточно, списывает 1 токен, и производит подготовку голосования: создаёт кошельки для вариантов голосований и эмитирует некоторое количество уникальных голосовательных токенов. Результаты создания голосования (было ли оно создано успешно, если нет, то почему) записываются в специальный лог, который также хранится в блокчейне.

Когда пользователь хочет принять участие в голосовании происходит следующее:

  • Он выбирает нужное ему голосование из общего списка и запрашивает разрешение на участие в нём.
  • Система проверяет может ли пользователь принять участие в голосовании и, если да, начисляет ему уникальный токен данного голосования.
  • Пользователь голосует за один из предложенных вариантов, после чего система проверят может ли пользователь голосовать и, если да, голосовательный токен переводится с его кошелька на кошелёк выбранного варианта голосования.

Проверка результатов голосования возможна несколькими способами. Во-первых, в профиле каждого участника есть опция “My Transactions”, где можно посмотреть все транзакции, начиная с создания кошелька. Во-вторых, в списке голосований можно перейти на экран конкретного голосования и в деталях голосования найти транзакцию со своего кошелька на кошелёк выбранного варианта. В-третьих, всегда есть возможность развернуть у себя Read only узел и проверить учёт результатов и работу системы на уровне блокчейна.

Немного о выбранных технологиях

Прежде чем рассказать о технологической составляющей проекта, отметим следующее: основной задачей проекта мы видим предоставление удобных средств для встраивания надёжных голосований на блокчейн платформе в любое стороннее приложение. Именно поэтому особое внимание мы уделяем разработке удобного API. Конечно, мы предоставим собственные клиенты для голосования, однако мы разрабатываем их в первую очередь для демонстрации возможностей нашей платформы для голосования. Ниже рассмотрим технологическую сторону проекта.
Как и в прошлых проектах, за основу мы взяли Mulitchain блокчейн. Мы исходили из следующих соображений:

  • Безопасность. Одна из уязвимостей большинства блокчейн систем кроется в её же достоинстве — анонимности. Когда кто-угодно может развернуть любое количество пишущих узлов, есть риск, что он развернёт 51% от общего числа узлов с изменённой информацией и остальные узлы примут её к записи, так как за ней будет стоять самая длинная цепочка блоков. Это называется атакой 51 процента. Для предотвращения таких атак в большинстве публичных алгоритмов применяется алгоритм подтверждения Proof of Work — каждый узел решает сложную математическую задачу, за что получает определённое вознаграждение («майнит монеты»). Решение задачи требует времени и значительных вычислительных мощностей. Это делает такого рода атаку слишком дорогой и нецелесообразной. Основная особенность Multichain состоит в том, что он специально создан для организации блокчейна по принципу консорциума, т.е. для ограниченного круга лиц, которые знают друг друга, т.е. не анонимны. В нашей реализации все узлы, подключающиеся к блокчейну, по умолчанию являются Read only узлами. То есть они хранят все данные, однако не имеют права на запись новых данных. Для получения права на запись узел должен получить соответствующие права у Master узла. Таким образом, мы обеспечим запись новых данных в систему только аутентифицированными узлами и снизим риски мошенничества. В то же время, Read only узлы получают полную копию всех данных блокчейна и могут самостоятельно анализировать данные голосований на непротиворечивость.
  • Ресурсоемкость. Как было отмечено выше, при применении алгоритма Proof of Work требуются значительные вычислительные, а при росте числа пользователей ещё и временные, ресурсы. Для решения этой проблемы мы отказываемся от алгоритма Proof of Work в пользу Proof of Authority, в этом случае мы даём право на запись информации только идентифицировавшим себя узлам. Таким образом, новая информация попадает в блокчейн значительно быстрее и «цена записи» становится минимальной.
  • Опыт. У нас есть опыт применения этой блокчейн-платформы в прошлых проектах, и мы хорошо знаем, как решать возникающие сложности.

Давайте рассмотрим техническую часть более детально. Структурная схема голосования выглядит следующим образом:

Структура системы разделена на 3 сегмента:

UI – приложения конечного пользователя, которые подключаются к общедоступным REST API (Common Area сегмент) или непосредственно к читающему узлу БЧ (на схеме не отображен). В прототипе для демонстрации функционала мы реализовали UI веб сайт как SPA на Angular. Любой желающий может реализовать свой UI на любой доступной технологии, используя наши REST API или Read only узел Multichain в качестве источника данных.

Common Area – это N узлов системы, на которых развернут Multichain в режиме записи и Web сервер с API для общего доступа.

REST API веб сайт, написанный на ASP.NET Core 1.1. Реализована работа с метаданными голосования, архивом метаданных, самим процессом голосования (выбор варианта и отдача голоса за него), а также кошельком пользователя. Подробное описание API можно посмотреть здесь.

Private Area – закрытая для общего доступа (записи) часть системы, в состав которой входит процессинговый сервер и сервер авторизации пользователей.
В проприетарную часть мы вынесли процессинговый сервер и сервер авторизации пользователей:

Processing Server

Реализован также, как и Common REST API на APS.NET Core 1.1. В прототипе отвечает за:

  • Начисление IDV токенов при регистрации пользователя (для оплаты создаваемых голосований)
  • Создание голосования
  • Управление состоянием голосования (открытие и закрытие согласно заданным условиям)
  • Начисление пользователю голосовательных токенов.

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

Identity Server

Сервер идентификации пользователей системы. Реализован на ASP.NET Core 1.1 с использованием компонента IdentityServer 4.

Функционал:

  • Регистрация пользователей;
  • Аутентификация пользователей;
  • Авторизация пользователей;

Профили пользователей хранятся так же в Multichain в зашифрованном виде.

Ограничения прототипа

Наша система разрабатывается для проведения голосований и опросов различных типов. Однако, для демонстрации возможностей прототипа, мы решили ограничиться сценарием простого мажоритарного голосования с открытым списком участников, т.е. к такому голосованию может присоединиться любой желающий. Поэтому в данной статье мы не будем рассматривать сценарии приглашения людей для участия в закрытых голосованиях, рейтинговых и альтернативных голосованиях. Также в прототипе мы не реализовали строгих механизмов идентификации. Это было сделано сознательно, с целью того, чтобы любой желающий мог самостоятельно их попробовать.

Прототип

Посмотреть прототип и опробовать создание голосования можно здесь. Если вы хотите развернуть у себя Read only узел — свяжитесь с нами через форму на сайте — мы вышлем вам инструкции как это сделать.