Voting deployment — Инициализация голосования
Decentralized key generation — Децентрализованная генерация ключа
Encryption — Шифрование 

На этом этапе нужно создать бюллетень, ввести варианты ответов и определить критерии доступа к голосованию. Самое важное на этом этапе – выбрать так называемых доверенных представителей. Это кандидаты на выборах (точнее, их представители) или независимые наблюдатели. Каковы их функции с точки зрения алгоритма? Их роль заключается в следующем:

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

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

Начало голосования и формирование блоков

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

Шифрование блокчейна 

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

  1. это лишает смысла создание распределенной системы;
  2. владелец ключа потенциально уязвим: единый ключ можно украсть, что позволит получить преждевременный доступ к результатам голосования, или его можно потерять, а с ним и результаты;
  3. владелец ключа может получить доступ к промежуточным результатам.

В схемах разделения секрета эти недостатки отсутствуют. Вот важные для нас характеристики таких схем:

  1. У каждого доверенного представителя хранится только часть ключа, поэтому никто не может дешифровать данные единолично.
  2. Для дешифровки данных не нужны все части ключа, а только их подмножество – для защиты на случай исчезновения одного из представителей. Мы используем пороговое шифрование с параметрами (n,k), где n>k>1, и для дешифровки данных нужно k частей ключа. Параметры n и k определяются в процессе настройки системы.

Мы выбрали схему разделения секрета Шамира. 

Схема основана на следующем принципе:

Для интерполяции многочлена степени k−1 нужно k точек. К примеру, для задания прямойтребуется две точки, для задания параболы – три точки и так далее. Невозможно интерполировать многочлен по меньшему количеству точек.

Если нам нужно разделить секрет между n людьми таким образом, чтобы секрет могли восстановить только k человек (k ≤ n), мы «прячем» секрет в формуле многочлена степени k−1. То есть мы генерируем случайный многочлен степени k−1, причем наш секрет является его свободным членом. Значения многочлена в точках с номерами от 1 до n отправляются всем доверенным представителям, при этом каждое значение отправляется одному представителю. Эти значения используются, чтобы проверить, правильно ли создан секрет. Многочлен и исходный секрет можно восстановить с помощью не менее чем k точек. Количество различных точек многочлена не ограничено.

Пошаговое описание:

На этапе инициализации пороговой схемы каждый доверенный представитель Pi генерирует свой секретный ключ si. Обозначим общий ключ системы как

Доверенный представитель Pi генерирует случайный многочлен степени k-1,

после чего доверенный представитель Pi отправляет каждому доверенному представителю Pj (включая себя) значение многочлена

Кроме того, публикуются следующие значения:

где fij являются константами многочлена Pi, и выполняется следующая проверка:

чтобы убедиться, что Pi действительно рассчитал sij с помощью многочлена fi(z). Кроме того, выполняется проверка рассчитанного секретного ключа на соответствие опубликованным частям ключа, то есть должно выполняться равенство:

Также проводится проверка на соответствие этих частей рассчитанному открытому ключу:

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

Did this answer your question?