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

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


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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

Структура системы разделена на 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 узел — свяжитесь с нами через форму на сайте — мы вышлем вам инструкции как это сделать.

Комментарии (33)


  1. Djaler
    17.10.2017 19:44

    Нет, ну это нормально? Только придумал тему для диплома, а тут её уже реализовали


  1. denismaster
    17.10.2017 22:56

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


    1. Napitok Автор
      18.10.2017 10:57

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

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


  1. u_story
    18.10.2017 00:19

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


    1. Napitok Автор
      18.10.2017 10:42

      А как Вы это проверите, например, в случае существующего сейчас голосования на дому?:) Если же говорить серьёзно, то наша система не решает все проблемы голосования, такие как голосование под угрозой жизни и здоровью или подкуп избирателя. Но благодаря ей, вы можете точно знать как учтён ваш голос.


      1. u_story
        18.10.2017 12:00

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


    1. UncleAndy
      18.10.2017 15:29

      Риски, на которые не может повлиять разработчик платформы: голосование под принуждением или покупка голосов, не имеет смысла рассматривать.


      1. u_story
        18.10.2017 18:42
        -1

        Почему же?
        Это фактически бизнес-ограничение, которое не позволит внедрить голосование по интернету, например.


        1. Napitok Автор
          18.10.2017 18:47
          +1

          Если представить более-менее крупное голосование (хотя бы тысяч на 200 000 человек), сколько людей с пистолетами понадобиться? :) А если голосование в рамках страны — это миллионы избирателей. Так целую армию нанять придется.


          1. u_story
            18.10.2017 19:39
            -1

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


            1. calg0n
              18.10.2017 23:11

              Я думаю люди с пистолетами это в любом случае не проблема блокчейна :)


              1. u_story
                19.10.2017 08:42

                Это бизнес-ограничения, которые вы не сможете обойти технологически, если мы говорим о гос.выборах на уровне страны.


                1. calg0n
                  19.10.2017 09:17

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


  1. sheknitrtch
    18.10.2017 00:23

    Насколько Я понял из описания вашего проекта, все голоса в системе абсолютно публичны? То есть, в блокчейне хранится информация кто за кого проголосовал. А как же тайна голосования?

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


    1. Napitok Автор
      18.10.2017 10:46

      Второе, известен только номер кошелька. Ассоциировать кошелёк и самого человека можно только в случае если человек сам объявит, что это его кошелёк. Что касается «мёртвых душ» — в прототипе не ставилась задача ограничить кому-либо доступ к голосованию, т.е. мы намеренно сделали, чтобы зарегистрироваться и принять участие мог любой. В дальнейших версиях будут созданы закрытые голосования, для участия в которых нужно будет получить специальное приглашение.


      1. Ark_V
        18.10.2017 13:02

        del


        1. Napitok Автор
          18.10.2017 14:37

          Жаль, что Вы удалили комментарий до того, как я успел ответить. Хорошие вопросы были.


      1. sheknitrtch
        18.10.2017 13:25

        Насколько Я понял, в вашей системе есть центральный сервер, который регистрирует участников голосования и разрешает/запрещает узлы с правом записи. И доверие к системе в целом равносильно доверию к центральному серверу.


        1. Napitok Автор
          18.10.2017 14:36

          Не совсем так.
          1. Существующая аутентификация нужна для демо, в конечном продукте может быть любой другой. К голосованию она отношения не имеет, т.к. голосуют именно блокчейн-кошельки и существующая аутентификация нужна только для того, чтобы продемонстрировать работу с ними. В реальной системе управление кошельками реализуется отдельно, в зависимости от условий решаемой задачи.
          2. Служба организации голосования — централизована. В ее функции входит создание голосовательных токенов (ГТ) и их начальное распределение в соответствии с заявкой организатора. Результаты работы этой службы (сколько ГТ выпущено, как распределено) открыто доступны в блокчейне и могут быть провалидированы любым участником.
          3. Разрешение/запрещение работы узлов — может быть организовано как централизовано (одни узлом) так и децентрализовано (консенсусом полноправных узлов-участников).


    1. Dmitry_7
      18.10.2017 10:47

      Нужна обратная связь для пересчета голосовавших


      1. Napitok Автор
        18.10.2017 11:07

        Поясните, пожалуйста, что Вы имеете в виду?


  1. Napitok Автор
    18.10.2017 10:47

    Коллеги, не могу отредактировать статью и добавить туда схему, поэтому помещу её здесь image


    1. u_story
      18.10.2017 12:01

      Выглядит проще чем у fabric hyperledger.
      Скажите, а вы не смотрели в его сторону?


      1. Napitok Автор
        18.10.2017 12:12

        В сторону hyperledger мы не смотрели, так как с ним у нас нет опыта, а проекты с использованием Multichain мы уже реализовывали и он хорошо подходит под эту задачу.


  1. UncleAndy
    18.10.2017 15:34

    Хабраэффект налицо. Надо приватную часть масштабировать для больших объемов.


    1. Napitok Автор
      18.10.2017 15:48

      Да, сейчас и правда есть некоторые трудности — разбираемся.


  1. PaulMaly
    18.10.2017 18:44

    Реализовали идею, которая уже год не дает покоя. За что большой респект! Срочно внедрять в ЦИК до президентских!


    1. Napitok Автор
      18.10.2017 18:49

      Мы пока её не до конца реализовали, это прототип демонстрирующий возможности. В зависимости от интереса сообщества мы решим, стоит ли дальше развивать это решение.


    1. u_story
      18.10.2017 19:41

      В ЦИК подобные решения уже не один раз предлагали, они все не подходят по законы федеральные.


      1. Napitok Автор
        19.10.2017 10:59

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


        1. u_story
          19.10.2017 19:32

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

          Вот пример: провайдер видит, что из вашей квартиры ушёл пакет на сервер для системы голосования, если он или допустим ФСБ, может расшифровать его, значит он знает за кого вы проголосовали — а этого допустить нельзя.


          1. Napitok Автор
            20.10.2017 11:38

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


    1. vpelipas
      19.10.2017 11:18

      И не только в ЦИК, государственными выборами область применения не ограничивается, прозрачная система электронного голосования может многим пригодиться — от малых коопераций, вроде ТСЖ, и до крупных акционерных обществ.