В первой части мы посмотрели на свойства блокчейна, поняли, чем он является и чем он точно не является, какие задачи умеет решать, а какие - не умеет или решает хуже, чем другие средства.
Теперь посмотрим, как блокчейн применим в жизни.
Конечно, такое изобретение, как блокчейн не могли не попытаться применить для решения разнообразных задач, особенно, после волны успеха, скандалов, опасений, связанных с биткоином. Биткоин - это одна из реализаций блокчейна. С помощью него стало понятно, что блокчейн может с успехом применяться как минимум в одной сфере - децентрализованная платёжная система. Т.е. большое количество пользователей имеет копию базы-блокчейна, а любая транзакция (трата-перевод-получение) проверяется-одобряется-записывается большинством, которому практически невозможно сговориться. Система с одной стороны надёжная, с другой стороны неконтролируемая какой-то одной организацией или правительством.
Где ещё можно применить блокчейн? Мы уже разобрались в его свойствах, и можем сказать, что это должно быть что-то общественное, с большим количеством пользователей. Природа такой базы должна быть линейная, т.е. двигаться из одной точки в прошлом в одну точку в будущем, без изменения существующих блоков. Проверка неизменности должна быть важна для этой базы. Пожалуй, всё.
На самом деле, есть ещё одно свойство, которого мы не касались до этого момента - пользователям должно быть интересно (выгодно) владеть копией базы. Ведь если разобраться - база может быть большая, десятки и даже сотни гигабайтов, всё это должно быть скачано и как можно чаще доступно, в сеть и из сети должны литься гигабайты информации. Т.е. пользователь должен отдавать место на диске, трафик и производительность - и для этого должна быть какая-то цель. В финансовой системе эта цель достигается тем, что каждый пользователь получает комиссию за транзакции (на самом деле всё сложнее, но чтобы не нырять в детали технической реализации, примем такое упрощение).
Итак, куда же ещё можно применить блокчейн? Да вот хотя бы в выборах! Проверим, подходит ли задача с организацией выборов под свойства блокчейна:
- Общественное - да.
- Изменять существующие блоки (голоса) нельзя - да.
- Проверяемость на неизменность - да.
- Пользователям выгодно владеть копией - считаем что да, ведь они хотят прозрачные выборы.
Получается, теоретически блокчейн подходит для организации прозрачных выборов. При которых можно проверить, что все голоса попали в подсчёт и что ни один голос не изменён.
А практически? Как организовать выборы на блокчейне, чтобы они были прозрачными. Кстати, мы не говорим о "честных" выборах, потому что это философское понятие. До сих пор человечество так и не определилось, какая система голосования - самая честная. Поэтому в разных странах и даже в разных сферах в одной стране могут применяться разные системы голосования. Сейчас мы говорим только о прозрачных выборах - выборах, которые должны давать полностью проверяемый результат.
И опять же, упомянутая в первой части статьи новость и комментарии к ней дают понять, что даже теоретическое рассмотрение блокчейна зачастую не дают понимания, как это работает на практике. Поэтому сейчас мы отбросим все предыдущие теоретические выкладки и просто рассмотрим несколько разных вариантов реализации выборов на блокчейне, оценивая каждую по результату.
Прежде всего определимся, какой алгоритм выборов мы считаем идеальным. Думаю, такой вариант подходит под определение "прозрачный":
- Пользователь А отправляет данные Х (свой голос за какой-то вариант) в блокчейн, который имеет какое-то состояние БЧ1.
- Блокчейн формирует хэш БЧ1 + Х = Ъ и делает его общедоступным для проверки.
- Пользователь А в любой момент может вычислить хэш БЧ1 + свой голос Х, для этого ему должен быть всегда доступен хэш БЧ1 (состояние базы до его голоса).
- Наблюдатель Б в любой момент может узнать, что хэш Ъ не изменялся. При этом у него нет доступа к значению А (потому что у нас тайное голосование). Для этого у него, очевидно, должна быть копия всех хэшей на любой момент времени. Проще всего это сделать, если у него будет копия базы, но теоретически это может быть даже переписанный на листочек список (т.е. важна именно возможность проверить, а не её реализация).
Рассмотрим блокчейн, примерно подходящий под описанный в новости, в нескольких вариантах.
Порядок действий:
1. Пользователь А отправляет данные Х (свой голос за какой-то вариант) в блокчейн, который имеет какое-то состояние <...> (неизвестное).
2. Блокчейн формирует хэш <...> (неизвестный пользователю).
3. В конце публикуются результаты.
Видим, что при такой реализации о прозрачности речи быть не может - Пользователь А не знает ни состояния базы, ни свой хэш, проверить он ничего не может, как и Наблюдатель Б, у которого вообще нет никаких данных, кроме результатов. Ясно, что полностью закрытый блокчейн не может быть средством для прозрачных выборов.
Порядок действий:
1. Пользователь А отправляет данные Х в блокчейн, который имеет известное состояние БЧ1.
2. Блокчейн формирует хэш БЧ1 + Х = Ъ и публикует его.
3. В конце публикуются результаты.
На первый взгляд всё красиво. Но можно ли гарантировать, что кроме настоящих данных пользователей не было транзакций, сделанных самим владельцем? Представим сценарий:
1. Пользователь А отправляет данные Х в блокчейн, который имеет известное состояние БЧ1.
2. Владелец блокчейна отправляет данные Ё, Ы, Ж, формирует последовательно хэши БЧ1 + Х = БЧ2, + Ё = БЧ3, + Ы = БЧ4, + Ж = Ь и публикует их.
3. Наблюдатель Б проверяет хэши БЧ1 - БЧ4, а также хэш Ь, все хэши правильные.
4. Пользователь А проверяет свой голос А и хэш Ь - они правильные.
Видим, что при такой организации выборов приватный блокчейн также не обеспечивает прозрачности - владелец может создавать свои транзакции.
Можно представить и более изощрённые схемы подтасовки. Например, владельцу блокчейна известно, что пользователь А - это пенсионерка 1930 г.р. :) С очень высокой долей вероятности такой пользователь не будет проверять свой голос и уж тем более хэши, соответственно, можно сформировать хэш на основе нужных владельцу данных. Или ещё проще вместо такого пользователя А, который никогда не слышал о блокчейнах и в голосовании не участвовал, сформировать нужные данные от его лица.
Итак, в приватном блокчейне организовать прозрачные выборы невозможно. Пока есть какие-то возможности кому-то из пользователей "остаться наедине" с базой (что всегда есть в приватном блокчейне), проверить результаты выборов любому желающему со стороны не представляется возможным.
Попробуем варианты с общественным блокчейном.
1. Пользователь А отправляет данные Х в узел, блокчейн имеет известное состояние БЧ1.
2. Узел формирует хэш БЧ1 + Х = Ъ и рассылает его по узлам.
3. Все узлы подтверждают блок и публикуют хэш.
4. В конце публикуются результаты.
Можно ли где-то здесь подтасовать результаты? Во-первых, у пользователей должен быть какой-то интерфейс голосования, и важно понимать, кому он принадлежит, как управляется. Если интерфейс принадлежит одной заинтересованной стороне или может ею управляться, то дальше уже систему можно не рассматривать, в блокчейн будут отправляться только "нужные" данные. Также всё-таки вспомним теорию из предыдущих пунктов - чем меньше узлов, тем меньше доверие и больше возможность сговора.
Таким образом общественный блокчейн с доступом пользователей через какой-то шлюз, также является сомнительным решением с узкими местами, хотя и даёт место для манёвра меньше, чем приватный блокчейн.
1. Пользователь А отправляет данные Х из своего узла по узлам сети, блокчейн имеет известное состояние БЧ1.
2. На каждом узле получается подтверждение действительности хэша (Ъ) и транзакции, при отстутствии коллизий данные записываются в каждый узел.
3. Результаты доступны в любой момент при наличии нужного количества подтверждений.
Изменить данные в такой реализации (при правильной реализации) невозможно. Отправить данных больше, чем положено (при правильной реализации) невозможно - они будут отвергнуты сетью. Каждый пользователь может проверить свой голос. Каждый пользователь может проверить любое состояние базы. Вроде бы проблема решена...
Но остаётся ещё одно слабое место. Дело в том, что мы не организовали контроль за количеством копий. Представим сценарий:
1. Количество настоящих избирателей - один миллион, каждый получает копию базы.
2. Заинтересованная сторона получает ещё двести тысяч копий и отправляет такое же количество голосов. Уже вполне достаточно для получения преимущества. А если получить один миллион плюс одна копия, то блокчейн превращается в аналог приватного с возможностью полного контроля за результатом.
Хотя до этой проблемы мы добрались только сейчас, но присуща она всем вариантам реализации и на публичном, и на приватном блокчейне, но она была не так очевидна из-за того, что были другие проблемы в реализациях.
Видим, что без контроля за количеством копий даже общественный блокчейн не гарантирует прозрачности выборов. Если идёт речь о выборах в какие-то органы власти, то, очевидно, список избирателей находится в распоряжении заинтересованной стороны, что позволяет выдавать копии по своему усмотрению.
Можно попробовать решить проблему предварительной публикацией количества избирателей и сигнализацией при превышении количества копий базы. Тут также проблемы: во-первых, количество пользователей тоже публикуется заинтересованной стороной и может быть умышленно увеличено для получения свободных копий; во-вторых, такой механизм может использоваться для компрометации выборов - любой пользователь может многократно копировать базу, что сделает выборы недействительными.
Другой попыткой решить проблему могла бы послужить деанонимизация пользователей.
Например, база имеет вид:
Иванов И.И. <хэш>
Петров П.П. <хэш>
Для того, чтобы не дать возможность расшифровать голос, к голосу можно добавлять какую-то случайно генерируемую комбинацию символов ("соль").
Можно ли теперь отдать копию базы для голосования несуществующему пользователю? Можно, но есть какая-то ненулевая возможность того, что обман раскроется, если каким-то образом наблюдатели будут точно знать, что данный пользователь не существует. Но технически мы не обеспечили невозможность проголосовать нелегальному пользователю. Осталась и ещё одна проблема - даже если голос пришёл от легальной копии базы, мы всё ещё не проверяем, действительно ли голосовал сам пользователь. Пенсионерка 1930 г.р., у которой даже компьютера нет, помните? Точно она сама за себя проголосовала?
Проблемы сыпятся как из рога изобилия, а рабочей системы всё нет. Давайте зайдём с другой стороны - придумает идеальный вариант и посмотрим, реализуем ли он на практике.
Итак, к описанному уже алгоритму рабочей системы прозрачных выборов добавляем:
1. Любой пользователь может проверить, что любой другой пользователь проголосовал лично.
2. Любой пользователь может проверить, что любой другой пользователь реально существует и имеет право голосовать.
Для этого должны быть:
1. Открытые общедоступные списки идентификационных данных, которые невозможно подменить - отпечатки пальцев, скан сетчатки глаза и т.п. Номер паспорта или СНИЛС не подойдёт - они выдаются заинтересованной стороной. Сканируется отпечаток пальца, отправляется его хэш в базу вместе с голосом. Каждый пользователь может проверить свой результат, что не изменился хэш отпечатка и хэш голоса.
2. Реализация интерфейса таким образом, чтобы невозможно было отправить эти данные никак, кроме как самим пользователем. Т.е. невозможность создать клиент, который будет отправлять готовый известный хэш отпечатка пальца вместо самого отпечатка. Ну и невозможность отправить "отпечаток отпечатка" - ненастоящий отпечаток.
3. Открытые общедоступные списки всех избирателей, которые можно проверить.
Возможно ли всё это реализовать? Если первый пункт можно реализовать хотя бы теоретически, то например, я слабо представляю себе интерфейс, который сможет распознать ненастоящий отпечаток. С третьим пунктом тоже проблемы - дело в том, что чтобы проверить существование пользователя нужны как минимум адрес и имя, что нарушает конфиденциальность. Поручить такую проверку "компетентным" органам, которые этой информацией располагают, снова означает монополию заинтересованной стороны.
Попробуем пофантазировать.
Вариант "круговая порука".
Пользователь А голосует под надзором пользователя Б, пользователь Б - под надзором пользователя В и так далее. Не работает - никто не мешает заинтересованным пользователям Ш и Щ отправить произвольное количество данных. Всё упирается опять же в списки избирателей.
Вариант "мелкие группы"
Пользователи А-Ё голосуют совмесно, их результат формируется в один блок, который отправляется в цепь. Опять списки избирателей, кто будет формировать группы, кто гарантирует, что один избиратель не входит в несколько групп, что у него нет нескольких паспортов и полностью легальных регистрационных данных?
Получается, модель полностью прозрачных выборов в органы власти нереализуема даже на общественном блокчейне?
Однозначный отрицательный ответ дать я не рискну, но из приведённых примеров видно, что любая реализация упирается в том числе и в нетехнические узкие места. Решение именно таких нетехнических проблем позволило бы подойти к идеальной выборной системе гораздо ближе.
При этом, если задуматься, то, решив эти проблемы, реализация технической части будет возможна и без блокчейна. Ведь если все избиратели будут знать, что проголосовать может только настоящий избиратель и каждый избиратель может проверить конкретно свой голос, то блокчейн становится не нужен.
Но самое важное, наверное, то, что нужно скептически относиться к новостям о "прозрачных" выборах на блокчейне, а не принимать на веру всё, что содержит новомодные словечки.