Исследование данных электронного голосования в Московскую Городскую Думу 2019 года
Логически само исследование состоит из программы для анализа исходных данных и самой статьи, описывающий как я разбирал данные. Делалось просто потому что на начальный момент времени тема казалась интересной, но в итоге оказалось, что тут минимум блокчейна и криптографии.
Для интерактивности при просмотре рекомендуется пользоваться программой VoteAnalyzer. Её можно скомпилировать из исходных кодов в VS2019 или скачать сразу релиз
Несколько слов про исходные данные. Для анализа я использовал файл ballots_decrypted_2019-09-08.csv. Для файла с зашифрованными голосами я просто сделал проверку (см класс ElGamalDecryptor)
Я не стал заострять внимание на неправильности и бессмысленности использования блокчейна в этом голосовании (я лично считаю, что в блокчейн данные писались исключительно ради хайпа)
Начал я с того, что попробовал вытащить из данных что мы имеем, нечто вроде метрик, для того чтобы по ним проанализировать как это всё работало
Первое что нам интересно - это среднее время блока (Block time), это время интересно тем, что оно для блокчейна относительно постоянное. К примеру для биткоина это где-то 10 минут. С помощью этой метрики мы сможем наглядно отследить аномалии работы блочейна
По нему видно, что до приблизительно 2045 блока время блока было 3-4 секунды. Затем произошли какие-то сбои, а возможно и остановка процесса вычисления блоков и среднее время выросло вначале до 6 (2046;2524), а потом до 22 секунд(2525;2650). Затем снова работа нормализовалась, а потом на интервале между (2817;2956) происзошла какая-то другая проблема. Еще подозрительно выглядит участок (3540;4629) со странными всплесками похожими на пульс, после которых среднее время блока начинает линейно расти и уже не возвращается к нормальным 3-4 секундам. Поскольку мы не располагаем всеми данными, то тут мы можем говорить лишь об усредненном времени. Т.е. блоки там могли вычисляться не 22 секунды, а 4 секунды, просто всё остальное время процесс вычисления мог быть остановлен. Что очень странно для блокчейна. С какой целью нужно останавливать все узлы?
Для наглядности я тут приведу вам время вычисления блока Эфира. Наглядно видна "бомба сложности" и хардфорк Byzantium после 16 октября 2017 года:
Среднее время блока показывает нам аномалии собственно самого блокчейна. Но у нас еще есть и предметная область.
Давайте посмотрим на распределение голосов по блокам
- Первое любопытное наблюдение - аномальное среднее время блока связано с "провалами" по голосам. Судя по всему там блокчейн не работал и, видимо, в те моменты люди не смогли проголосовать.
- Второе наблюдение, после трех первых "провалов" (давайте называть их "провалами") нет резкого всплеска голосов, в то время как после "пульса" есть большое число блоков с очень большим по сравнению с остальными голосов. Т.е. тут голоса людей задержались на значительное время во время записи.
- Третье наблюдение - максимальное число голосов в блоке судя по всему равно 100
- Четвертое наблюдение куда более интересно. Если посмотреть на то как записываются голоса, то видно, что до блока 3543 запись идет пачками (batch), затем случается аномалия "пульс" после которой режим записи меняется. Пачки голосов становятся где-то в 3-4 раза меньше. Т.е. тут кто-то вмешался в работающую систему и внес правку в конфигурационный файл или код.
Оценим число аномальных участков
Аномальные пустые участки (провалы)
- (2046-2524) ~ 478
- (2525-2650) ~ 125
- (2818-2955) ~ 137
Аномальные пустые участки (пульс)
- (3565-3602) ~37
- (3651-3710) ~59
- (3777-3835) ~58
- (3905-3988) ~83
- (4033-4149) ~116
- (4227-4401) ~174
- (4431-4623) ~192
- (4686-4730) ~44
Если пустые участки очено похоже что приводили к невозможности голосования, то после участков "пульса" есть аномальный всплеск, который может свидетельствовать о том, что голоса таки дошли.
Подсчитаем лучший и худший случаи
Начало в 668 блоке. Конец 7190. Общее число блоков - 6523. Если я нигде не ошибся в расчетах то:
- Верхняя оценка доступности системы для записи -
5783*100/6523=88.6%
- Нижняя оценка доступности системы для записи -
5020*100/6523=76.9%
На основании вышесказанного мы можем сформулировать претензии по работоспособности этой системы:
- Неработоспособность системы (нижняя оценка):: в течении более 10% всего времени система была неработоспособна, что для некоторых кандидатов могло оказаться решающим фактором.
- Вмешательство в работу блокчейна: судя по времени вычисления блока, процесс вычисления был по крайней мере один раз полностью остановлен на всех узлах. Это произошло после 2046 блока. Для наглядности посмотрите время вычисления блока для Биткоина за 10 лет и оцените как действительно выглядит работающая система.
- Изменение режима записи голосов в блокчейн: во время работы системы кто-то зачем-то изменил или время или размер пачки голосов после накопления которого голоса сохранялись в блокчейн. Голоса стали записываться чаще после 4730 блока.
- Общая нестабильность работы системы: среднее время блока изначально было равно 3-4 секунды, но потом после остановки и еще каких-то непонятных проблем оно начало стабильно расти.
Т.е. я могу сказать, что это тестовое и не production ready решение, которое не должно было использоваться как государственная информационная система. Я надеюсь, что два факта вмешательства (остановка и изменения режима записи) также были вызваны желанием "поднять" упавшую (скажем честно) тестовую систему чтобы "не получить по шапке" от начальства, а не желаением изменить голоса. Проверить это мы естественно не можем, потому что запись вела заинтересованная сторона, но давайте поверим в честность наших чиновников, которые никогда-никогда не обманывали свой народ. Поэтому вывод тут такой (чтоб никого не обидеть): система не была должным образом протестирована, во время работы были серьёзные проблемы и результатам я бы не особо стал доверять