Что такое доказуемая честность

Доказуемая честность - это система генерации случайных чисел, основанная на принципе доказуемости случайного выбора. Это позволяет 100% гарантировать, что выбор победителя в конкурсе был абсолютно случаен.

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

Как работает Доказуемая честность

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

Для этого используется следующие входные данные:

  • Server seed - это случайная строка небольшой длины, которая генерируется сервером и не известна до окончания розыгрыша; чтобы убедиться в том, что выбранный Server seed не менялся в процессе розыгрыша, мы публикуем его хэш;
  • Client seed - это строка, которая образуется от действий участников розыгрышей; в 99% это ID участников, соединенные символом ":"
  • Неподвластный внешний фактор - это такие данные, которые публичны, не требуют доказательств, обладают непредсказуемостью в будущем и не изменяются во времени, например, курс доллара ЦБ на конкретный деньМы используем хэш последнего найденного блока в сети Bitcoin на момент проведения розыгрыша. 

Посредством криптографической функции HMAC_SHA512 получается хэш, где ключом выступает Server seed, а сообщением -  Client seed и Неподвластный внешний фактор соединенные между собой символом двоеточия (:)
Первые пять символов от полученного хэша переводятся из шестнадцатеричной системы счисления в десятичную.  Полученный результат делится по модулю на количество купленных билетов. Итоговое число - это и есть порядковый номер победителя.

Почему эта система гарантирует 100% честность?

Ключевой особенностью является использование публичных данных, которые могут быть проверены третьими лицами, где часть данных - не зависит от самого проекта, что гарантирует абсолютную случайность результата, и как следствие 100% честность розыгрыша!

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

Используемый алгоритм получения случайного числа – детермированный (то есть, результат будет всегда одним и тем же, на одних и тех же входных данных), что позволяет провести проверку розыгрыша самостоятельно, после того как мы публикуем Server seed (а убедиться в том, что он не менялся - позволяет его хэш, который мы публикуем сразу же).

Доказуемая честность - это гарантия того, что розыгрыш был абсолютно честным!

Как самостоятельно проверить результат розыгрыша?

Проверить результат розыгрыша совсем не сложно!

Нам потребуется:

  • Изначальный Server seed - становится публичных по окончанию розыгрыша
  • Client seed - доступен в любое время
  • Неподвластный внешний фактор (НВФ) - доступен в любом обозреватели блоков Bitcoin. Мы его публикуем, вам достаточно убедиться, что на момент розыгрыша это был именно последний блок (дата найденного следующего блока старше времени розыгрыша). Вы также можете найти его самостоятельно, например, по этой ссылке, пролистав список блоков на нужную дату (дату проведения розыгрыша).

Соединяем Client seed и НФВ символом двоеточия, подписываем полученную строку Server seed'ом, посредством криптографической функции HMAC_SHA512, берем первые 5 символов, и переводим в десятичную систему. Делим полученное число по модулю на кол-во участников, получаем порядковый номер победителя.

Давайте попробуем это сделать на примере. Предположим что у нас есть розыгрыш, где имеется всего пять участников, с ID 1, 2, 3, 4 и 5. При этом все участники, кроме участника с ID 1, имеют по два "билета" (это могут быть и не билеты, а например, машины в гараже, для простоты говорим "билеты").

  • Server seed: mems slatimea offire froat bruchas sympul upotemost toryth
  • Client seed: 1:2:2:3:3:4:4:5:5
    Повторяющиеся ID означают что участник имеет несколько билетов в розыгрыше.
  • НВФ: 0000000000000000001018a206100a0c81fd7b358373720a3f294ed7710c7cf9

Для начала формируем сообщение, которое будем подписывать:

1:2:2:3:3:4:4:5:5:0000000000000000001018a206100a0c81fd7b358373720a3f294ed7710c7cf9

Далее нам надо его подписать HMAC_SHA512, это можно сделать, например, тут (по этой ссылки данные уже предзаданы, но вы можете их вписать сами по-новой, для чистоты эксперимента).

Получаем хэш: 

6b6819f9cf7b5d5c3a22bf005a8fd142fff363498c2d36348bfb6170feed2c1a0dc73e6c4879fcc5e4a4a25169715441a1ca552d3142bac0720031846083b2a1

Берем первые пять символов: 6b681

Переводим их в десятичную систему, сделать это можно по этой ссылке.

Получаем число: 439937

Делим по модулю на кол-во участников (у нас пять участников, но девять билетов):

439937 % 9 = 8 (деление по модулю можно сделать здесь)

Победителем является участник под порядковым номером 9 (т.к. счисление начинается не с единицы, а с нуля - 0 - 1 - 2 и т.д.).

1:2:2:3:3:4:4:5:5

В нашем случае, это участник с ID 5.


Время на сервере: 05:19