Любой генератор случайных чисел просит верить ему на слово: числа приходят с сервера, и убедиться снаружи, что их не выбрали заранее, невозможно.
Проверяемая генерация устроена так, что верить не нужно. Числа вычисляются из значения, которого на момент запуска не существовало ни у кого, включая нас, — а когда оно появляется, его публикует независимая от сервиса сеть, и повторить вычисление может любой.
В момент запуска сайт записывает условия генерации — диапазон, количество чисел, запрет повторов — и номер будущего раунда бикона. Страница протокола открывается сразу, еще без чисел: их в этот момент не существует, и ссылку на нее уже можно раздать участникам.
Раунд берется на 6–9 секунд вперед, и до публикации его значение не известно никому — ни участникам, ни нам, ни самой сети. Это ожидание и есть суть режима: условия записаны раньше, чем появилось значение, из которого получены числа.
Когда раунд опубликован, из его значения и записанных условий по открытому алгоритму получаются числа. Вычисление детерминированное: одни и те же входные данные всегда дают один и тот же результат, поэтому его может повторить кто угодно.
drand — публичный источник случайности: каждые 3 секунды сеть публикует новое случайное число, «раунд». Все раунды пронумерованы и остаются доступны навсегда, поэтому номер задает и момент публикации, и значение — его можно вычислить, не спрашивая никого.
Значение вырабатывает не один сервер, а группа независимых организаций из разных стран — League of Entropy. Среди участников Cloudflare, Protocol Labs, EPFL, Kudelski Security, Университет Чили и другие; Cloudflare, например, берет свою долю случайности со стены лава-ламп в офисе. Каждая вносит свою долю, и число появляется только при согласии достаточного их количества: ни один участник в одиночку не может ни узнать значение заранее, ни подменить его.
Каждый раунд подписан общим ключом группы, поэтому подлинность значения проверяется математически. Подробнее — на сайте проекта drand.love.
На странице протокола есть кнопка «Проверить самостоятельно». Проверка идет прямо в браузере: раунд запрашивается напрямую у релеев drand, минуя наш сервер, значение сверяется с подписью, и числа пересчитываются заново. В окне проверки показан каждый шаг — с входными данными, промежуточными значениями и результатом.
Верить на слово этой проверке тоже не обязательно: там же лежат готовые программы на Python, JavaScript и Go, повторяющие вычисление вообще без нашего кода, и команда для терминала, считающая семя одной строкой. Результат должен совпасть до последнего числа.
Розыгрыши призов и конкурсы, жеребьевки, распределение очередей и мест, выборки для проверок и аудита — все, где результат касается нескольких сторон и одной из них может оказаться невыгоден. Ссылку на протокол можно опубликовать заранее, до появления чисел: участники увидят, что условия записаны раньше результата.
Для лотерей и азартных игр, где по закону требуется сертифицированный генератор случайных чисел, сервис не предназначен.
На странице генератора включите переключатель «Проверка подлинности» и запустите генерацию — числа появятся через несколько секунд, когда выйдет раунд. На сайте режим бесплатный и не требует учетной записи.
В публичном API за него отвечает параметр source=beacon: ответ приходит с кодом 202 и без чисел, забрать их нужно отдельным запросом после публикации раунда. В API этот режим доступен по тарифу — см. документацию.