June 24, 2020

Идеальное голосование

предварительные соображения:

интересы организатора заключаются в том, чтобы

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

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

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

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

должен быть установлен набор формальных критериев успешности проведённого голосования. первый критерий - максимальное число допустимых ошибок. в силу того, что сбор данных производится автоматически, этот порог должен быть установлен на минимальный уровень, например, 10*log10(кол-во участников) ошибок. то есть в случае, если обнаруживается 80 человек, доказавших подлог, то голосование на 100млн участников считается недействительным. при таких ограничениях организатор будет вынужден полностью исключить любые подлоги голосов реальных участников, иначе голосование просто не будет признано состоявшимся по обязательным критериям успешности, а мы исходим из того, что организатор заинтересован в том, чтобы голосование состоялось.

требования к голосованию:

  1. участник может лично проверить, что его голос учтен правильно.
  2. при желании участник может достоверно публично подтвердить, за какой именно пункт он голосовал, например, с целью достоверно указать на подлог.
  3. любой желающий может проверить, что все голоса дают в сумме тот итог, который официально публикуется цик'ом. совпадение голосов по списку и сумм - это так же критерий успешности голосования.
  4. голосование остаётся тайным за исключением случаев добровольной публикации подтверждения участником своего голоса.
  5. любой желающий может убедиться, что общее число голосов не превосходит заявленного цик'ом на этапе подготовки к голосованию.

процедура:

  1. до начала выборов цик генерирует secret - уникальную случайную строку - ключ, которая будет использована вдальнейшем. secret держится в секрете от участников голосования до его окончания.
  2. до начала голосования цик создаёт N уникальных идентификаторов (далее uid) для каждого участника по формуле uid = hash(<secret> + <номер паспорта> + <user_code>), где user_code - это случайная строка типа A1ZQB4HV9Y, которая предоставляется участнику вместе с его uid. user_code нужен для того, чтобы после завешения голосования и открытия организатором secret'а, было невозможно для постороннего человека по чужому uid восстановить номер паспорта владельца. uid нужен для того, чтобы обезличить голоса в итоговом публикуемом реестре. после публикации secret участник сможет достоверно подтвердить, что uid действительно принадлежит именно ему.
  3. свой uid и user_code каждый участник может получить либо на сайте госуслуги, либо на почте по паспорту.
  4. до начала выборов цик публикует на сайте полный список всех uid'ов в виде простого текстового файла из N строк, один uid на отдельной строке.
  5. система не должна препятствовать повторному голосованию по одному uid'у. т.к. организатор может передать данные uid+user_code другому лицу, которое проголосует до реально владельца uid'а и тем самым лишит его возможности проголосовать (и у владельца не будет возможности достоверно доказать, что он ещё не голосовал). именно возможность повторного голосования делает такую передачу uid+user_code невыгодной для организатора, т.к. единственное что он получит от этого - дубль в реестре. продублированные uid'ы в итоговом реестре считаются ошибками и могут привести к нарушению критерия успешности голосования и к отмене голосования, поэтому организатор заинтересован в том, чтобы ни один участник не проголосовал по чужому uid'у.
  6. при голосовании участник демонстрирует оператору свой паспорт, оператор по номеру паспорта находит в базе uid и user_code участника и формирует QR-code с двумя параметрами: uid, hash(secret + uid + user_code + <уникальный идентификатор кабинки>), распечатывает его на листочке, с данным листочком участник идёт в кабину, сканирует QR-code, происходит проверка по базе корректности данного QR-code'а (с учетом идентификатора кабинки). учет идентификатора кабинки гарантирует, что участник не перешлёт QR-code другому участнику с целью получить дубль и скомпрометировать голосование. данные меры заинтересован предпринять организатор в целях исключения появления дублей в итоговом реестре. если голосование происходит на госуслугах, то все эти действия происходят автоматически в личном кабинете пользователя.
  7. участник убеждается, что на экране выведен его uid и нажимает кнопку "далее". участнику предлагается выбор вариантов. участник выбирает свой вариант, после чего на экран выводится результат голосования в виде строки vote_hash, вычисленной по формуле (1) vote_hash = hash(uid + secret + vote), где vote - вариант, выбранный участником. функция hash может быть определена исходя из соображений целесоообразности, например, sha1.
  8. участник может записать или сфотографировать свой vote_hash, если планирует им воспользоваться для дальнейшей проверки корректности учета своего голоса.
  9. после голосования на сайте цик публикуется общий список голосов простой текстовый файл в N строк, каждая строка содержит два значения: uid, vote. так же публикуется итоговая сумма всех голосов по каждому пункту.
  10. так же на сайте цик открыта страница, с помощью которой можно подтвердить корректность своего голоса, то есть корректность трёх значений: uid, vote, vote_hash. на странице предлагается заполнить три поля для ввода этих значений. введя их и нажав "проверить", получаем ответ "да", если значения соответствуют формуле (1) и "нет" в противном случае.
  11. таким образом на основе общего списка голосов
    1. участник может убедиться, что его голос записан правильно.
    2. любой желающий может проверить, что итоговые суммы посчитаны правильно.
    3. итоговый набор uid'ов соответствует изначально опубликованному (см. п.3).
  12. если участник обнаруживает, что его голос учтен неправильно, то он указывает на это публично, объявив свои uid, vote и vote_hash. любой желающий с помощью страницы проверки сможет убедиться в достоверности его заявления о подлоге в общем списке голосов.
  13. после завершения подведения итогов и утверждения результатов, цик публикует secret, чтобы все желающие смогли убедиться в корректности вычисления vote_hash на всех этапах.

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

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

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