Как проверить, что розыгрыш честный

Организатор не может подкрутить результат задним числом — и это можно доказать арифметикой, а не обещаниями.

Проверка результата

Возьмите данные из отчёта, который выдаёт колесо (кнопка «Скопировать отчёт»), и вставьте сюда.

Список на момент кручения
Seed
Обязательство (commit), необязательно
Номер кручения (nonce)

Заполните форму — результат появится здесь.

Почему обычному колесу нельзя верить

Большинство подобных сервисов берут случайность из Math.random(). Это быстрый генератор псевдослучайных чисел, не предназначенный для розыгрышей: его состояние восстанавливается по нескольким результатам, а значит, следующее значение предсказуемо. Для вопроса «что поесть» это неважно. Для розыгрыша телефона среди подписчиков — важно.

Здесь случайность берётся из crypto.getRandomValues() — криптографического источника браузера. Кроме того, выбор сектора с учётом весов сделан методом отбраковки, без модульного смещения: вероятность каждого варианта строго пропорциональна его весу, а не «почти пропорциональна».

Схема commit–reveal

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

  • До кручения генерируется секретное число seed (32 случайных байта) и считаются два хеша: listHash = sha256(список) и обязательство commit = sha256(seed + "|" + listHash). Обязательство и хеш списка публикуются — например, отдельным сообщением в канале.
  • Кручение не бросает кубик заново: победитель выводится из уже зафиксированных данных. Считается h = sha256(seed + ":" + listHash + ":" + nonce), первые 13 hex-символов берутся как число по модулю суммы весов, и полученное значение отсчитывается по списку сверху вниз.
  • После кручения раскрывается seed. Любой участник вставляет его в форму выше вместе со списком — и получает того же победителя.

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

Как оформить розыгрыш

  1. Соберите список участников и включите переключатель «Проверяемая честность».
  2. Скопируйте из панели listHash и commit и опубликуйте их до розыгрыша — постом, сторис или комментарием с датой.
  3. Крутите колесо. Кнопка «Картинка» сохранит итог с победителем и всеми хешами — готовый скриншот для отчётности.
  4. Опубликуйте раскрытый seed и ссылку на эту страницу. Кнопка «Скопировать отчёт» соберёт всё в один текст.

Проверка полностью локальная: страница ничего никуда не отправляет, все вычисления идут в вашем браузере. Это можно увидеть в исходном коде — assets/js/rng.js и assets/js/verify.js.

Все колёса