Как стать автором
Обновить

Блокчейн нас подвёл? Почему ДЭГ — это плохо и можем ли мы адекватно контролировать процесс подсчёта голосов?

Криптография *Тестирование IT-систем *

Интересно наблюдать, как дискредитируется термин блокчейна на выборах в госдуму. Вроде голосование было на блокчейне, но его якобы подделали. Т.е. блокчейн можно подделать или ЦИК и ДИТ нам подсунули какой-то лохчейн вместо блокчейна?!? И мало кто обсуждает происходящее по существу без эмоций, связанных с результатами партий и кандидатов.

Фоторобот майора ФСБ, управляющего ходом электронного голосования
Фоторобот майора ФСБ, управляющего ходом электронного голосования

За последние пару дней уже появилось несколько хороших статей про Дистанционное электронное голосование и анализ его данных. Например, «Что же не так с ДЭГ в Москве?» Так же есть отличные разборы данных на канале Каца. А так же чуть раньше этой опубликованная статья «Что же не так с любыми электронными голосованиями?», поднимающая схожие вопросы о применимости ДЭГ вообще.

Почему об этом вообще важно писать в ИТ сфере? Наблюдатели - это основа гарантии прозрачности выборного процесса. Быть наблюдателем на участке ТИК может каждый - есть соответствующая подготовка в рядах многих партии, призывающих наблюдателей. А вот наблюдением за ДЭГ нужно заниматься людям, понимающим в блокчейне, способным задать правильные вопросы ДИТ и ЦИК до, во время и после голосования, а так же готовым быстро писать скрипты и программы для независимой проверки результатов.

Честно скажу, в ДЭГ я не очень верил (голосовал на старом добром участке), не ожидал, что в Москве на ДЭГ запишется так много человек, и никакого интереса к технологии до выборов не проявлял. А зря...

Что не так?

  • Записи о голосовании якобы велись на блокчейне. Не проверял - нужно больше информации, а документации фактически нет, времени не было всё поисследовать. Нам предлагается скачать базу с результатами. Но и без документации что-то можно покопать. Данные тут.

  • Судя по тем осколкам описаний, что удалось найти, верификацией блоков занимались всего 4 узла валидатора. Кто это были? ДИТ и ЦИК? Почему всего 4?

  • Сколько было full нод и все ли они были подконтрольны ДИТ/ЦИК? Судя по доке наблюдатели могли видеть данные в каком-то виде, но полную копию в реальном времени делать не могли. Иначе бы не жаловались на пропадание доступа ровно в 20:00 19 сентября (якобы из-за окончания сертификатов ФСБ, но причем тут вообще ФСБ? данные вообще в открытом доступе должны быть). После этого и до выкладывания на сайте данные в теории могли изменяться - проверить это можно только имея слепки всех записей на 20:00. Делал ли кто-то из сторонних независимых наблюдателей такие копии? Не ясно. Вроде в статьях, упомянутых выше, делали и совпало.

  • Вместо принятого в Ethereum или Bitcoin распределённого и децентрализованного блокчейна в голосовании использовали приватный централизованный блокчейн, да ещё и с возможностью повторно переподписать все волеизъявления (см. ниже - мы же не знаем, какой уровень доступа к сертификату пользователей у операторов системы ДЭГ, может они к ним имеют доступ и могут переподписать) и блоки (подписант судя по всему один - это ДИТ).

  • Чем подписывались голоса, хэши которых кладутся в блоки? Если сертификатом избирателя на Госуслугах, то у большинства сертификат лежит на серверах Госуслуг, входят они по паролю и СМС, и они даже открытого ключа своего не знают, тем более приватного. Или вообще по какому-то специально для этого созданному ключу? В общем, проверить избиратели ничего не могут, а их сертификат всё равно доступен кому-то в системе Госуслуг.

  • В теории каждый избиратель, зная свой открытый ключ, мог бы проверить, сколько он раз голосовал и как. Это дало бы возможность каждому из нас проверить, что переголосования (для Москвы), неучёта голоса, многократного учёта голоса или иного подлога не произошло. Однако нехватка ответов на вопросы выше мы не можем ничего проверить. Есть инструкция, но как проверить, если не записал на момент голосования номер своей тразакции?

  • Пожалуй самое важное: Как обстоят дела с анонимностью? Если подписание идёт сертификатом избирателя, то это совсем не анонимно - портал госуслуг (и любой наблюдатель) знает кто и как голосовал. Если для голосования выдавался отдельный голос (токен), то опять же или государство и наблюдатели знают, кому какой токен выдан, т.е. кто как проголосовал, или нельзя гарантировать, что каждому избирателю выдали ровно один токен. Этот контроль нужно осуществлять каким-то другим методом вне блокчейна и с доступом наблюдателей.

  • Данные в системе хранятся в зашифрованном виде, якобы чтобы не раскрывать анонимности голосования. Но ключ для расшифровки явно существует. В федеральном ДЭГ подсчёт голосов (суммирование) велось в зашифрованном виде через "слепую подпись" (хотя и тут не хватает аудита кода, чтобы подтвердить реализацию), но в Москве, где ДИТ решил сделать возможность изменения волеизъявление до окончания голосования, посчитать голоса без расшифровки явно нельзя - нужно оставить только последний голос данного избирателя. И плакала анонимность...

  • Я лично тоже решил проверить все выводы, которые сделала Брюханова, и не понял как выделить переголосования. Получается, выложенных данных на сайте не хватает для полного анализа данных.

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

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

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

Как хотелось бы

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

Цель информационной системы ДЭГ - сделать так, чтобы фальсификация была сложнее, а сам процесс проверки и подсчёта голосов более прозрачным.

Поэтому в текущую систему следовало бы ввести следующие изменения:

  • В идеале выборы надо делать на блокчейне с применением концепции zero knowledge - доказательством факта без знания деталей этого факта (да, проголосовал именно он, но не знаю, как; да, голос за такую-то партию, но кто голосовал, не знаю). Но это направление криптографии пока не достигло должных успехов, чтобы ему доверять. Все попытки применения в странах развитых демократий пока не прошли стадию PoC из-за найденных проблем (кроме Эстонии). Исследования ведут многие страны, а США и Швейцария и скандинавские страны периодически предлагают сообществу и участие в разработке, и в поиске уязвимостей (таких как деанонимизации голосов, возможности вбросов, да и просто дыры). Здесь нужно перенимать опыт.

  • Должно было обязательно быть подписание блоков многими наблюдателями и общественными организациями с правом участия в консенсусе в случае расхождения результатов (тут консенсус не в принятом смысле, а в смысле возможности отменить все блоки после расхождений через ТИК/ЦИК/суд - это как член комиссии с ПРГ, только электронно) в процессе всего голосования, чтобы постфактум ничего нельзя было поменять.

  • Данные должны быть общедоступными (гражданам и наблюдателям, и без всяких ФСБ!), а сама технология, вся математика, алгоритмы и процессы должны быть описаны в открытом доступе с документацией, чтобы каждый мог результат проверить.

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

  • UPD: Наблюдателям должны предоставляться списки избирателей с доказательством того, что они действительно зарегистрированы по указанным адресам. В идеале это бы делать по базе МВД и ФМС, которые тоже должны вестись на открытом децентрализованном блокчейне (как и многие другие гос. базы), чтобы было легко гарантировать, что человек действительно переехал не менее 3 месяцев назад (или сколько там по закону нужно). А наблюдатели должны получать полный доступ к спискам, включающим ФИО, адрес, паспорт как на оффлайн участках. Это уменьшит вероятность регистрации "ботов". Фальсифицировать настолько заранее, да ещё и вбрасывать в базы смежных ведомств и силовых органов затратнее и опаснее.

  • UPD: Уменьшить грануляцию (размер участка) до типичного оффлайн участка (~1000 человек), чтобы были лучше видны статистические отклонения по районам и можно было легче проверять списки избирателей на участках. Это позволит наблюдателям в районах легче отслеживать "мёртвые души". Я например, знаю, кто никогда не голосует в моём доме, и каждые выборы "подсматриваю" в журнал при получении бюллетеня (пока подписываю), чтобы проверить, что за "молчунов" никто ничего не вписал (я прихожу всегда к закрытию участка).

Всё это позволило бы вернуть доверие к ДЭГ. Но, кажется, такой задачи не стоит...

Поэтому пока мы не знаем ни как это работает, не видим полных данных, но конечным числам и графикам должны почему-то доверять. Такой вот zero knowledge и full trust в представлении ЦИК.

Ещё раз про анонимность

UPD

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

Следить тут можно или связав списки (и тогда плакала анонимность), ли выдавать каждому рандомный токен (бюллетень) для голосования (идеально для анонимности человек сам его сгенерирует), не связанный с его личным ключом авторизации на участке, но тогда никто кроме самого избирателя не сможет проверить, что его голос учтён и он за того кандидата, а не за него что-то там вбросили. Т.е. каждый должен стать наблюдателем, а сторонние наблюдатели будут бессильны.

Кроме того если даже как-то обеспечить анонимность (что технически пока никто не умеет нормально делать на блокчейне - см. выше), и при этом вести записи в обоих журналах, то можно уже по времени записей понять, кто за кого голосовал. Фишка оффлайн голосование в урне, в которую кидают бюллетени, не раскрывая в этот момент за кого. А уже при подсчёте смотрят на голоса. Урна - это хранилище. В блокчейне аналогов этому пока нет.

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

В общем, блокчейн тут вообще не к месту. Хайпанули на нём нормально власти, подменив доверие к системе сложным термином.

Тем, кто интересуется, можно почитать ещё вот эту хорошую статью и полистать краткую доку на официальном сайте.

Касаемо результатов, у Брюхановой в видео интересные и грустные выводы, и тут я ей верю - лично проверил на примере моего 208 округа. Не всё ещё проанализировал, но пока всё сходится с данными в видео по 198 округу. Фальсификации были, и видно это даже без заглядывания в приватный блокчейн, который нам показывать не хотят. Видимо там это точно доказуемо.

Картинка от прекрасной petit.pi.

Тем, кто хочет самостоятельно поиграться с данными, прошу под кат

Скрипт для рисования графиков голосования по округам

Скачайте данные по кнопке снизу слева на https://observer.mos.ru/all/servers/1/txs.

Распакуйте и загрузите в PostgreSQL в базу deg

Для тех, кто первый раз пользуется PostgreSQL (как я), сразу ставьте Adminer из их репозитория. Будет легче визуализировать данные.

Я рисовал графики в Gnuplot, но вы можете заменить на что угодно.

Тут лишь часть скриптов, чтобы дать затравку - сам пока не всё изучил.

Замените 208 округ на нужный - не подумал переменную завести, т.к. пока только на своём анализом занимался

За качество скриптов не судите - ночные часы с попыткой разобраться дают о себе знать.

DT=1200 # шаг по времени

# Кандидаты
echo "SELECT * FROM transactions WHERE CAST(payload AS text) LIKE '%ballots_config%';" | psql -t -d deg | sed 's/.*"district_id":208,"question":"Вопрос 208?","options":{([^d])},"min_choices":1,"max_choices":1}./\1/' | sed 's/^"//;s/","/\n/g;s/":"/\t/g;s/"$//' > candidates.txt 

# Заявки на ДЭГ по времени
echo "SELECT SUBSTRING(CAST(payload AS text), 93, 78), EXTRACT(EPOCH FROM datetime) FROM transactions WHERE CAST(payload AS text) LIKE '%voter_id%"district_id":208%';" | psql -t -d deg | tr -d '",' > voters.txt
## Группируем данные
cat voters.txt | awk '{print $3, $1}' | sort -n | awk 'BEGIN {dt='$DT';t=0;n=0} {if(t==0){t=$1} if($1>t+dt){t=$1;print(t,n);n=0} n++} END{print(t,n)}' > voters_registration.txt
## Рисуем график
gnuplot<<END
set term png size 1536,768
set out '/tmp/voters_registration.png'
set xlabel "День и время"
set ylabel "Количество зарегистрированных за $((DT/60)) минут"
set timefmt "%s" 
set format x "%d %H:%M"
set xdata time
plot 'voters_registration.txt' using ($1+3600*3):2 w l title 'Регистрации на ДЭГ по времени'
END

# Голоса
echo "SELECT d.decrypted_choice AS choice, EXTRACT(EPOCH FROM t.datetime) FROM decrypted_ballots AS d LEFT JOIN transactions AS t ON d.store_tx_hash = t.hash WHERE CAST(t.payload AS text) LIKE '%"district_id":208,"encrypted_choice"%';" | psql -t -d deg | tr -d '{}' > vote_choices.txt 
## Группируем данные
echo -n > vote_choices_groupped.txt; for candidate in awk '{print $1}' candidates.txt; do (echo; echo; cat vote_choices.txt | awk '$1=='$candidate' { print $3, $1}' | sort -n | awk 'BEGIN {dt='$DT';t=0;n=0} {if(t==0){t=$1} if($1>t+dt){t=$1;print(t,n);n=0} n++} END{print(t,n)}') >> vote_choices_groupped.txt; done
## Рисуем график
gnuplot<<END
set term png size 1536,768
set out '/tmp/vote_choices_groupped.png'
set xlabel "День и время"
set ylabel "Количество голосов за $((DT/60)) минут"
set timefmt "%s" set format x "%d %H:%M"
set xdata time
plot $(delim=""; n=0; for candidate in awk '{print $1}' candidates.txt; do echo -n "$delim"'"vote_choices_groupped.txt" using ($1+3600*3):2 index '$n' w l title "'awk '$1=='$candidate' {print $2}' candidates.txt'"'; n=$((n+1)); delim=", "; done)
END

Пока разбирался, нарисовал схему. Самая важная таблица - это transactions и её поле payload, которое в зависимости от method_id имеет разный формат.

Теги:
Хабы:
Всего голосов 68: ↑56 и ↓12 +44
Просмотры 23K
Комментарии 144
Комментарии Комментарии 144