Проверяемая генерация случайных чисел

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

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

Как это работает

1. Условия фиксируются и публикуются

В момент запуска сайт записывает условия генерации — диапазон, количество чисел, запрет повторов — и номер будущего раунда бикона. Страница протокола открывается сразу, еще без чисел: их в этот момент не существует, и ссылку на нее уже можно раздать участникам.

2. Сайт ждет раунд

Раунд берется на 6–9 секунд вперед, и до публикации его значение не известно никому — ни участникам, ни нам, ни самой сети. Это ожидание и есть суть режима: условия записаны раньше, чем появилось значение, из которого получены числа.

3. Числа вычисляются из значения раунда

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

Что такое drand

drand — публичный источник случайности: каждые 3 секунды сеть публикует новое случайное число, «раунд». Все раунды пронумерованы и остаются доступны навсегда, поэтому номер задает и момент публикации, и значение — его можно вычислить, не спрашивая никого.

Значение вырабатывает не один сервер, а группа независимых организаций из разных стран — League of Entropy. Среди участников Cloudflare, Protocol Labs, EPFL, Kudelski Security, Университет Чили и другие; Cloudflare, например, берет свою долю случайности со стены лава-ламп в офисе. Каждая вносит свою долю, и число появляется только при согласии достаточного их количества: ни один участник в одиночку не может ни узнать значение заранее, ни подменить его.

Каждый раунд подписан общим ключом группы, поэтому подлинность значения проверяется математически. Подробнее — на сайте проекта drand.love.

Как проверить результат

На странице протокола есть кнопка «Проверить самостоятельно». Проверка идет прямо в браузере: раунд запрашивается напрямую у релеев drand, минуя наш сервер, значение сверяется с подписью, и числа пересчитываются заново. В окне проверки показан каждый шаг — с входными данными, промежуточными значениями и результатом.

Верить на слово этой проверке тоже не обязательно: там же лежат готовые программы на Python, JavaScript и Go, повторяющие вычисление вообще без нашего кода, и команда для терминала, считающая семя одной строкой. Результат должен совпасть до последнего числа.

Кому это нужно

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

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

Как включить

На странице генератора включите переключатель «Проверка подлинности» и запустите генерацию — числа появятся через несколько секунд, когда выйдет раунд. На сайте режим бесплатный и не требует учетной записи.

В публичном API за него отвечает параметр source=beacon: ответ приходит с кодом 202 и без чисел, забрать их нужно отдельным запросом после публикации раунда. В API этот режим доступен по тарифу — см. документацию.

Сгенерировать число с проверкой

Вопросы и ответы

Чем проверяемая генерация отличается от обычной?
В обычном режиме числа выдает криптографический генератор сервера: результат честный, но подтвердить это снаружи нельзя — остается верить сервису на слово. В проверяемом режиме числа вычисляются из значения будущего раунда публичного бикона drand: на момент запуска этого значения не существует, а после публикации любой может взять его у сети и пересчитать числа сам.
Можно ли подобрать результат, зная алгоритм?
Нет, и открытость алгоритма здесь как раз обязательна. Он детерминированный: по значению раунда и условиям генерации всегда получается один и тот же результат. Подобрать его удалось бы, лишь зная значение раунда заранее, но раунд выбирается до того, как сеть его выработала, а изменить условия задним числом нельзя — они опубликованы раньше значения.
Что будет, если сеть drand окажется недоступна?
Генерация не состоится, и сайт сообщит об ошибке. Подменять недоступный бикон обычным генератором нельзя: тогда любой неудобный результат можно было бы объяснить сбоем сети, а именно эту свободу режим и убирает. Числа появятся, когда раунд будет получен.
Нужен ли платный тариф?
На сайте проверяемая генерация бесплатна и доступна без учетной записи. В публичном API она включается параметром source=beacon и входит в тарифы, где этот режим предусмотрен.