Как проверить, что розыгрыш честный
Организатор не может подкрутить результат задним числом — и это можно доказать арифметикой, а не обещаниями.
Возьмите данные из отчёта, который выдаёт колесо (кнопка «Скопировать отчёт»), и вставьте сюда.
Заполните форму — результат появится здесь.
Почему обычному колесу нельзя верить
Большинство подобных сервисов берут случайность из 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 заранее не выйдет: чтобы узнать, кто победит, нужно посчитать хеш, но результат становится известен только вместе со списком, который публикуется одновременно.
Как оформить розыгрыш
- Соберите список участников и включите переключатель «Проверяемая честность».
- Скопируйте из панели
listHashиcommitи опубликуйте их до розыгрыша — постом, сторис или комментарием с датой. - Крутите колесо. Кнопка «Картинка» сохранит итог с победителем и всеми хешами — готовый скриншот для отчётности.
- Опубликуйте раскрытый seed и ссылку на эту страницу. Кнопка «Скопировать отчёт» соберёт всё в один текст.
Проверка полностью локальная: страница ничего никуда не отправляет, все вычисления идут в вашем браузере. Это можно увидеть в исходном коде — assets/js/rng.js и assets/js/verify.js.