Наши нынешние системы, основанные на представительной демократии, сталкиваются со многими проблемами. Фактически, они дисфункциональны в том смысле, что не выполняют основную цель демократии, которая заключается в обеспечении того, чтобы воля большинства возобладала.
Следующая диаграмма знакома каждому:
Стратегически выбирая избирательные округа, может случиться так, что партия победит, даже если ее поддержало лишь меньшинство избирателей. Но это лишь одна из многих проблем. Участие в политике требует больших денег, что делает политическую систему уязвимой для финансового влияния. Системы, которые мы считаем демократическими, на самом деле служат частным интересам и корпорациям, а не избирателям (см. Захват государства ).
Решением было бы участие людей в принятии решений гораздо более прямым способом, через прямую демократию или ликвидную демократию. Конечно, в реальности невозможно организовать бумажные референдумы по каждому вопросу, поскольку такое голосование чрезвычайно ресурсоемко. Но разве нельзя решить эту проблему цифровым способом, с низкими затратами, при этом обеспечивая анонимность и безопасность бумажного голосования? Я начал искать ответ на этот вопрос около двух лет назад. Так я наткнулся на миксеры монет и технологию защиты с нулевым разглашением.
Суть миксеров монет заключается в том, чтобы сделать транзакции блокчейна неотслеживаемыми. Такой миксер работает как большой пул. Пользователи вносят свои монеты на одну сторону и снимают их на другой. Ключ в том, что мы не знаем, кто снимает какую монету на другой стороне, при этом гарантируя, что каждый может снять только ту же сумму, которую он внес. Это именно та система, которая нужна для анонимного голосования. Каждый получает бюллетень, в котором он может отдать свой голос. Мы не знаем, кто отдал какой голос, но мы можем быть уверены, что каждый человек отдал только один голос.
Итак, я углубился в исходный код одного из самых популярных миксеров монет, Tornado Cash, чтобы понять, как он работает. Об этом также была написана статья . Как только я полностью понял функционал, я выделил основные функции и создал библиотеку под названием zk-merkle-tree , которую любой может использовать для проведения анонимного голосования. Также было разработано приложение для голосования с подтверждением концепции , которое позволяет любому человеку создать свою собственную систему. Система основана на блокчейне, что делает ее безопасной, но в то же время это также делает ее очень сложной в использовании. Если мы строим на существующем блокчейне, возникают транзакционные издержки, такие как развертывание смарт-контрактов и подобные проблемы, в то время как эксплуатация нашего собственного блокчейна становится еще большей проблемой. Я хотел решение, которое не использует блокчейн и легко настраивается за несколько минут. Так родился zkDemocracy .
zkDemocracy — это традиционная система на базе NodeJS и MySQL, которую можно настроить всего за несколько минут. Она может работать в автономном режиме, где zkDemocracy служит полным внутренним слоем, или как служба, интегрированная в более крупную систему.
Первый вопрос, который возникает при использовании такой системы: как можно обеспечить безопасность на уровне блокчейна в базе данных MySQL?
Блокчейн идеален, поскольку это решение только для добавления, где модификации невозможны, что помогает отфильтровать большинство видов мошенничества. В действительности, единственный способ обмануть — это проголосовать от имени других или проголосовать тому, кто не имеет на это полномочий. Эти возможности можно предотвратить с помощью надлежащей идентификации избирателей. Если это обеспечено, мошенничество становится теоретически невозможным. Поэтому, если мы сможем создать такую систему только для добавления поверх MySQL, мы сможем обеспечить тот же уровень безопасности, который предлагает блокчейн.
Решение zkDemocracy этой проблемы заключается в том, что каждая строка, вставленная в таблицы базы данных, связана с «хэшем контрольной точки». Это хэш keccak256, который состоит из данных из полей и хэша контрольной точки предыдущей строки. Подобно блокчейну, хэши контрольных точек связаны в цепочку, поэтому если что-то изменится в базе данных, хэш контрольной точки каждой строки после измененной также изменится.
Когда кто-то регистрируется в качестве избирателя или голосует, система выдает заверенную квитанцию с цифровой подписью, подтверждающую, что транзакция была завершена. Эта квитанция также содержит хэш контрольной точки. Поскольку и список участников, и список голосов полностью общедоступны после голосования, любой может проверить, произошли ли какие-либо изменения, и если да, то он может использовать заверенную цифровой подписью квитанцию, предоставленную сервером, чтобы доказать это.
Текущий список зарегистрированных избирателей и последний хэш контрольной точки можно получить из системы в любое время, что делает любое мошенничество мгновенно доказуемым. Кроме того, есть возможность записывать хэш контрольной точки в блокчейн через регулярные интервалы (например, каждые 10 минут), что дополнительно гарантирует невозможность изменения базы данных после записи хеша в блокчейн. Это решение обеспечивает полную безопасность на уровне блокчейна, поскольку любая попытка подделать данные потребует также изменения хеша в блокчейне.
Очевидно, что при использовании вышеописанного решения можно достичь того же уровня безопасности, который обеспечивает блокчейн, используя при этом привычные технологии (например, кластеры MySQL) для работы системы.
Я использовал библиотеку Semaphore для генерации и проверки доказательств с нулевым разглашением. Она работает аналогично zk-merkle-tree, но прошла аудит и имеет большую базу разработчиков.
zkДемократия имеет два основных элемента: группу и голосование. Группа — это набор избирателей, например, избиратели из определенного избирательного округа, акционеры компании и т. д. Аналогично голосование представляет собой событие голосования, которое может быть президентскими выборами, референдумом, принятием корпоративных решений и т. д. Несколько групп могут участвовать в одном мероприятии голосования; например, в референдуме все избирательные округа участвуют в голосовании, а результаты суммируются. Аналогично группа может участвовать в нескольких мероприятиях голосования. Таким образом, если группы для избирательных округов созданы, с этими группами можно провести несколько референдумов. Другими словами, группы и голосования имеют связь nm.
Давайте теперь посмотрим, как будет работать референдум, построенный на системе zkDemocracy.
Первый шаг — определить людей, имеющих право голоса. В системе голосования на бумажных носителях это делается путем предоставления каждому избирательному округу списка имеющих право голоса избирателей для этого округа. Когда кто-то приходит голосовать, его имя вычеркивается из списка, гарантируя, что он может проголосовать только один раз.
В цифровом или онлайн-голосовании этот процесс намного проще. Если государство предоставляет какую-либо форму цифровой идентификации, то проверка может быть полностью автоматизирована. Избиратель представляет уникальное обязательство, которое записывается вместе с его именем в базу данных. Это половина доказательства с нулевым разглашением. Список избирателей и обязательств является публичным, защищен хэшем контрольной точки, и в любое время можно запросить сертифицированный список с цифровой подписью. Поэтому, если система идентификации защищена, мошенничество на этом этапе становится теоретически невозможным.
Если цифровой идентификационный документ не предоставлен, требуется ручная идентификация. Это можно сделать лично или даже через систему видеоконференций (хотя онлайн-идентификация имеет свои риски из-за передовой технологии deep fake). Идентификацию может провести один человек, но она более безопасна, если ее проводят несколько случайно выбранных лиц. Дополнительная безопасность обеспечивается, если делается видеозапись идентификации и хранится в течение ограниченного времени. В течение этого периода независимая организация может проводить выборочные проверки записей, чтобы еще больше минимизировать вероятность мошенничества. Эта система идентификации так же безопасна, как и та, которая используется в текущем голосовании на бумажных носителях, или даже более безопасна, чем та, которая используется в текущем голосовании на бумажных носителях.
После успешного завершения регистрации процесс становится очень простым, так как избиратель может участвовать в стольких голосованиях, в скольких пожелает. Благодаря хэшу контрольной точки и общедоступному списку избирателей гарантируется, что голосовать могут только имеющие право лица. Вся база данных для каждого события голосования также является общедоступной и защищена хэшем контрольной точки. Любой может проверить, используя доказательства с нулевым разглашением, исходит ли данный голос от действительного избирателя, и каждый избиратель может в любое время проверить, правильно ли записан его собственный голос в базе данных. Избиратели могут легко доказать любое мошенничество, используя квитанцию с цифровой подписью, предоставленную системой.
Очевидно, что с помощью системы zkDemocracy можно гарантировать, что базы данных являются общедоступными и доступными для всех, а также что согласованность базы данных может быть доказана, при этом сохраняется анонимность избирателей.
Система доступна на GitHub по следующему URL-адресу: https://github.com/TheBojda/zkdemocracy
Я также планирую написать еще одну статью специально для разработчиков. А пока подробную документацию для разработчиков и примеры кода для использования системы можно найти на GitHub.
Моя цель в этой разработке — доказать, что технологические условия для улучшения наших демократических систем существуют. От нас зависит, как мы сможем использовать эти возможности...