Provably fair: что это и как проверить раунд самому
Как устроен алгоритм provably fair: сид сервера, его хеш, клиентский сид и nonce. Пример проверки раунда с SHA-256 и что эта технология не гарантирует.
Provably fair («доказуемо честно») — способ получать результат раунда так, чтобы игрок потом мог сам проверить: исход не подменили после того, как была сделана ставка. Казино заранее публикует хеш своего секретного числа (сида), игрок добавляет свой сид, а результат вычисляется из обоих. Это защищает от подмены конкретного раунда, но не отменяет преимущество казино: математика выплат остаётся той же, что и у обычных игр.
Что такое provably fair простыми словами
Представьте, что вы играете в кости по телефону. Вы не видите, как соперник бросает кубик, и не можете проверить, что он не врёт. Решение придумали давно: соперник заранее записывает число, запечатывает его в конверт и отдаёт вам. Вы называете своё число, конверт вскрывают, итог зависит от обоих чисел. Подменить записанное число соперник уже не может, а вы не знали его, когда делали выбор.
В криптографии такой «конверт» называется схемой обязательства (commitment scheme). У неё две фазы: сначала значение выбирают и фиксируют, потом раскрывают, и вторая сторона проверяет, что оно то же самое. Нужны два свойства: по «конверту» нельзя узнать значение (сокрытие) и нельзя потом раскрыть другое значение (связывание). В provably fair роль конверта играет криптографический хеш.
Термин чаще всего встречается в crash-играх, Dice, Mines, Plinko и похожих мини-играх. Например, разработчик Spribe, по его собственному описанию, построил на этой технологии Aviator и линейку быстрых игр. Как устроен сам Aviator и почему ни одна его «стратегия» не меняет ожидание, — в статье о стратегиях Aviator.
Алгоритм provably fair: из чего он состоит
Детали у разных разработчиков отличаются, но составные части почти всегда одни и те же.
| Элемент | Кто создаёт | Зачем нужен |
|---|---|---|
| Server seed (сид сервера) | Казино или провайдер игры | Секретная случайная строка. До раунда игрок видит только её хеш |
| Хеш server seed | Вычисляется из server seed | «Запечатанный конверт»: фиксирует сид, но не раскрывает его |
| Client seed (сид игрока) | Игрок или его браузер | Вклад игрока в результат. Казино не знает его заранее |
| Nonce | Счётчик ставок | Номер ставки при одной паре сидов, чтобы каждый раунд давал новый результат |
| Формула результата | Разработчик игры | Правило, как превратить итоговый хеш в число, карту или множитель |
Хеш-функция — это алгоритм, который из любых данных делает короткий «отпечаток» фиксированной длины. В стандарте NIST FIPS 180-4 их назначение описано так: отпечатки (digest) нужны, чтобы обнаружить, изменилось ли сообщение после того, как отпечаток был получен. Именно это и требуется: по опубликованному хешу видно, тот ли сид казино раскрыло после игры.
Чаще всего используют SHA-256 или SHA-512 из семейства SHA-2. SHA-256 даёт отпечаток длиной 256 бит, то есть 64 шестнадцатеричных символа. Известные атаки на SHA-2 работают только против урезанных версий алгоритма (например, против 52 из 64 раундов SHA-256), а полная функция ими не взламывается. Иногда вместо простого хеша берут HMAC — конструкцию, которая хеширует сообщение вместе с секретным ключом. В роли ключа удобно использовать server seed.
Как это описывает разработчик игр
Для примера — схема Spribe в пересказе с её официальной страницы. Оператор генерирует server seed из 16 случайных символов, и его хеш доступен до начала раунда. Client seed создаётся на стороне каждого игрока. Когда раунд начинается, server seed объединяют с client seeds игроков и считают хеш SHA-512, а уже из него получают результат раунда, причём формула у каждой игры своя. Хеш server seed следующего раунда можно посмотреть в настройках (там он подписан как SHA-256), там же меняется свой client seed. После раунда в истории игры по значку provably fair открываются server seed, сиды игроков, общий хеш и результат.
Как проверить раунд самому: пример с цифрами
Разберём учебную игру «кубик» с результатом от 0,00 до 99,99. Схема у неё упрощённая, но устроена так же, как настоящие. Все значения ниже посчитаны скриптом на PHP стандартными функциями hash и hash_hmac, их можно воспроизвести на любом языке.
- До игры казино генерирует server seed — 64 шестнадцатеричных символа: 3f9a1c7e5b2d8046a1e9c3b7f0d25e8a6c4b19d7e2f08a5c3b6d1e9f4a7c2b05. Игроку показывают только его SHA-256: 9b3d24aa60ac674410bd2f25c39bf2aabe56e6a737256264a6e8b9107b8cf9cd.
- Игрок задаёт свой client seed, например moy-sid-2026, и делает первую ставку (nonce = 1).
- Результат считается как HMAC-SHA256 с server seed в роли ключа и строкой «client seed:nonce» в роли сообщения, то есть от «moy-sid-2026:1». Получается b523ccfdaf51dbd92fac3d8acee90443f126bbd5d0fae0d5ef66321efc5c7d03.
- Перевод в число. Берём первые 8 символов хеша, b523ccfd, это 3 039 022 333 в десятичной записи. Делим на 2³² = 4 294 967 296 и получаем 0,70758… Умножаем на 100 и отбрасываем всё после второго знака: выпало 70,75.
- После игры казино раскрывает server seed. Игрок сам считает его SHA-256, сравнивает с хешем, который видел до ставки, и пересчитывает результат по шагам 3–4.
Со вторым и третьим nonce при тех же сидах выходят 17,92 и 83,19. Ни один результат не угадать по предыдущим: каждый следующий хеш никак не связан с прошлым на вид.
Теперь допустим, что казино после ставки решило подменить сид и поменяло в нём последний символ: 5 на 6. Результат первой ставки стал бы 77,99, но SHA-256 нового сида — bc43d1b7b330424fcd77873eb7494569493d8ef8b565b61b766599ac4fe5530b, совсем не тот хеш, что был опубликован. Изменение одного символа меняет весь отпечаток, поэтому подмену видно сразу.
Чем проверять
Лучше считать хеши независимым инструментом: любым языком программирования или офлайн-утилитой, где можно выбрать SHA-256, SHA-512 и HMAC. Кнопка «проверить» на сайте самого казино удобна, но это код того же казино. Проверка, которую делает сторона, которую вы проверяете, ничего не доказывает. Формулу перевода хеша в результат нужно брать из описания конкретной игры: без неё хеш ничего не скажет.
Почему по хешу нельзя предсказать следующий раунд
В рекламе «предикторов» и «сигналов» для crash-игр часто обещают, что программа «расшифрует» хеш и заранее покажет множитель. Это невозможно, и причина в самой схеме. Хеш — функция в одну сторону: из сида его посчитать легко, а из хеша сид восстановить можно только перебором.
Если сид — 256 случайных бит, как в нашем примере, вариантов 2²⁵⁶ ≈ 1,16·10⁷⁷. Даже при фантастической скорости 10¹⁸ хешей в секунду на перебор ушло бы порядка 3,7·10⁵¹ лет. А server seed раскрывают сразу после раунда, так что знать его заранее может только тот, у кого он хранится. Если «предиктор» действительно угадывает, значит, данные утекают от оператора, и тогда provably fair как раз не работает. Поэтому обещание «расшифровать» хеш и узнать множитель заранее — верный признак обмана.
Что provably fair не гарантирует
Spribe пишет, что технология «гарантирует 100% честность результата». На деле гарантия уже. Схема доказывает одно: результат раунда получен из сидов, зафиксированных до ставки, по заявленной формуле. Всё остальное остаётся за её пределами.
- Преимущество казино никуда не девается. Оно заложено в таблицу выплат, а не в генерацию числа. Если в нашем «кубике» ставка «больше 50,50» платит ×1,98, выигрышных значений 4 949 из 10 000, и вероятность выигрыша — 49,49%. Ожидаемый результат на каждые 100 ₽ ставки: 0,4949 × 198 − 100 ≈ −2,01 ₽. Честная выплата без преимущества казино была бы около ×2,02. Мы прогнали 200 000 раундов через настоящие HMAC из примера: игрок выиграл в 49,56% случаев и в сумме потерял около 1,9% оборота. Это совпадает с расчётом с точностью до случайного разброса. Доказуемо честная игра честно забирает свои 2%.
- RTP не проверяется. Проверка раунда ничего не говорит о том, какой процент ставок игра возвращает на дистанции. Его задаёт формула результата и таблица выплат, подробнее — в статье что такое RTP.
- Выплата не гарантирована. Хеш доказывает, что вы выиграли, но не заставит площадку зачислить выигрыш или выпустить деньги на вывод. Это вопрос надёжности оператора, а не криптографии.
- Сид игрока должен быть действительно вашим. Если client seed по умолчанию задаёт сам сайт и сервер знает его до того, как выбрал свой сид, теоретически он может подобрать server seed под выгодный для себя исход. Поэтому имеет смысл менять client seed самому после того, как увидели хеш server seed.
- Проверить можно только то, что раскрыли. Если площадка не показывает server seed прошлых раундов или не публикует формулу, слово provably fair в описании остаётся просто надписью.
Частые заблуждения
«Provably fair — значит, можно выиграть». Нет. Технология проверяет честность розыгрыша, а не выгодность игры. На длинной дистанции игрок в минусе ровно на заложенное преимущество казино, сколько раундов ни проверяй.
«Раз результат зависит от моего сида, я могу подобрать удачный». Сид игрока смешивается с неизвестным ему server seed через хеш. Любой client seed даёт непредсказуемый для игрока результат, «удачных» строк не бывает.
«После серии низких множителей должен выпасть высокий». Каждый раунд считается из новой комбинации сидов и nonce, прошлые результаты на него не влияют. Серия проигрышей — не повод «отыграться», и если такие мысли появляются регулярно, загляните на страницу об ответственной игре.
Что важно запомнить
- Provably fair — схема «запечатанного конверта»: казино фиксирует сид хешем до ставки, игрок добавляет свой сид, результат считается из обоих.
- Проверить раунд — значит посчитать хеш раскрытого server seed, сравнить с опубликованным заранее и пересчитать результат по формуле игры. Лучше делать это своим инструментом.
- Предсказать следующий раунд по хешу нельзя. Программы, которые это обещают, не работают.
- Технология не убирает преимущество казино и ничего не говорит об RTP и о выплатах. Она отвечает только на вопрос «подменили ли этот раунд».
Источники
Азартные игры связаны с риском потери денег и могут вызывать зависимость. Играйте только на ту сумму, которую готовы потерять. Помощь при игровой зависимости