Главная · Как работает RNG

Как работает RNG и Provably Fair

В основе Lucky Jet лежит криптографический генератор случайных чисел. Результат каждого раунда фиксируется ещё до его начала — и любой игрок может это проверить математически, без доверия к казино. Разберём, как именно это работает, с конкретным примером кода для проверки.

Что такое RNG и почему вокруг него столько разговоров

RNG (Random Number Generator, генератор случайных чисел) — это алгоритм, который выдаёт непредсказуемые числа. В контексте Lucky Jet и других crash-игр именно RNG определяет, в какой момент пилот «крашится» и каким будет финальный множитель раунда.

Чисто технически в компьютерах нет «настоящей» случайности — все алгоритмы детерминированы. То, что мы называем «случайным», на самом деле — псевдослучайные числа, выводимые из некоторого сида (seed). Если знать сид и алгоритм, результат становится предсказуемым. Поэтому ключевой вопрос для онлайн-казино: кто и как генерирует сид, и можно ли это контролировать или проверить.

Именно вокруг этого исторически крутится недоверие к онлайн-казино. Если казино контролирует сид целиком и единолично — теоретически оно может подбирать сиды, которые невыгодны для игроков. Долгое время доказать или опровергнуть это публично было невозможно. Provably Fair был придуман как ответ именно на эту проблему.

Старая модель: «доверяй казино и его аудитору»

Классические онлайн-казино работают по такой схеме:

  1. Казино получает лицензию у регулятора (Curaçao, Malta Gaming Authority, UK Gambling Commission и т. п.).
  2. Регулятор обязывает казино использовать сертифицированный РНГ.
  3. Сертификацию проводят независимые лаборатории: eCOGRA, GLI, iTech Labs, BMM Testlabs.
  4. Лаборатория получает большую выборку результатов и проверяет их статистически — на равномерность распределения, отсутствие закономерностей, соответствие заявленному RTP.
  5. Если всё в порядке — выдаётся сертификат, который казино показывает игрокам.

Это работает в среднем, но у этой модели есть фундаментальная проблема: игрок не может проверить конкретный раунд. Только лабораторию, только статистически, только постфактум. Если в одном конкретном раунде вы потеряли крупную ставку и подозреваете, что что-то не так — единственный путь это «оспорить» проходит через службу поддержки самого казино, его регулятора и, потенциально, суд. На практике — мало кто этим занимается.

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

Provably Fair: три ингредиента

Подход Provably Fair появился около 2014 года в крипто-казино (SatoshiDice, Bustabit и подобные), а позже стандартизировался в индустрии. В нём используется три ключевых компонента — все они видны игроку в специальном разделе настроек игры.

Компонент Кто генерирует Когда виден игроку Зачем нужен
server_seed Сервер казино SHA-256-хеш до раунда; сам сид — после Основа случайности. Доказывает, что казино не подменило результат
client_seed Игрок (или авто) В любой момент в настройках Гарантирует, что казино не выбрало серверный сид специально под клиента
nonce Сервер автоматически Открыто, увеличивается на 1 каждый раунд Делает каждый раунд серии уникальным, при том же server_seed

Идея проста. Перед началом серии раундов сервер генерирует server_seed (длинная случайная строка), считает с неё SHA-256-хеш и публикует только хеш. Сам сид остаётся в секрете до конца серии. Поскольку SHA-256 необратима, по хешу узнать сид невозможно — но он зафиксирован.

Игрок может задать любой client_seed (своё значение). После окончания серии раундов сервер раскрывает server_seed. Игрок может тут же:

  1. Посчитать SHA-256 раскрытого server_seed и сравнить с заранее опубликованным хешем — это доказывает, что сид не меняли в процессе.
  2. Самостоятельно пересчитать множитель каждого раунда из server_seed, client_seed и nonce, и сравнить с реально показанным.

Если оба проверки сходятся — раунд честен.

Как из хеша получается множитель

Это техническая часть. Если вы хотите просто понять, что «казино не обманывает» — можно пропустить и перейти к следующему разделу. Если интересно, как именно работает математика — продолжаем.

Конкретная формула преобразования хеша в множитель краша различается между играми и операторами. Но общий шаблон почти у всех crash-игр одинаковый:

  1. Берётся HMAC-SHA256(server_seed, client_seed:nonce) — это даёт 64-символьную hex-строку.
  2. От первой её части (обычно 8 или 13 hex-символов) берётся целое число.
  3. Это число делится на максимальное возможное значение — получается дробь от 0 до 1.
  4. Дробь преобразуется в множитель краша по формуле вида (1 / (1 − x)) × (1 − house_edge), что даёт распределение Парето: большинство раундов получают низкие множители, редкие — очень высокие.
  5. Если результат меньше 1.00 — раунд считается «мгновенный краш» (множитель 1.00×). Доля таких раундов соответствует домовому преимуществу казино (около 3 %).
Главное про формулу

Распределение множителей — не равномерное, а сильно скошенное вправо (распределение Парето). Это значит: большинство раундов краша происходит до 2.00×, а множители 100×+ случаются в тысячных долях процента раундов. Это не «несправедливо» — это математическое следствие формулы, которое и обеспечивает RTP 97 %.

Как самостоятельно проверить раунд

Допустим, вы сыграли серию раундов. После окончания серии (или после смены клиентского сида — что обычно автоматически закрывает серию) казино раскрывает server_seed. У вас на руках:

  • published_hash — SHA-256-хеш, который вы видели ДО серии
  • server_seed — раскрытый сервером после серии
  • client_seed — ваш клиентский сид
  • nonce — номер конкретного раунда в серии
  • actual_multiplier — фактический множитель этого раунда (видно в истории)

Вот минимальный Python-скрипт, который проверяет оба условия. Сохраните в файл verify.py, заполните значения и запустите python3 verify.py:

# verify.py — проверка одного раунда Provably Fair
import hashlib, hmac, math

# 1. То, что мы получили от казино:
published_hash    = "a3f5...e91d"   # SHA-256 от server_seed, опубликован до серии
server_seed       = "7b2c...43a8"   # раскрыт казино после серии
client_seed       = "my_random_seed"
nonce             = 42             # номер раунда в серии
actual_multiplier = 2.47           # из истории раундов

# 2. Проверка №1: казино не подменило server_seed
recalculated = hashlib.sha256(server_seed.encode()).hexdigest()
assert recalculated == published_hash, "❌ Хеш не сходится — казино меняло сид!"
print("✓ Хеш совпадает: server_seed не подменяли")

# 3. Проверка №2: пересчитываем множитель
message = f"{client_seed}:{nonce}".encode()
key     = server_seed.encode()
h       = hmac.new(key, message, hashlib.sha256).hexdigest()

# Берём первые 13 hex-символов (52 бита), переводим в число
x = int(h[:13], 16)
e = 2**52

# Формула множителя (типичная для crash-игр)
if x == 0:
    multiplier = 1.00
else:
    multiplier = math.floor((100 * e - x) / (e - x)) / 100

print(f"Пересчитанный множитель: {multiplier}×")
print(f"Фактический множитель:    {actual_multiplier}×")

Если оба assert проходят, и пересчитанный множитель совпадает с фактическим — раунд честный. Если что-то расходится — это серьёзное основание не играть в этом казино и опубликовать факт расхождения.

Важная оговорка про формулу: точный алгоритм преобразования хеша в множитель различается между играми. Lucky Jet от Gaming Corps не публикует свою формулу публично — её можно восстановить по реверс-инжинирингу клиентского кода или по документации операторов. Большинство crash-игр следуют шаблону, показанному выше, но конкретные константы (длина среза hex, формула преобразования, house edge) могут отличаться.

Чего Provably Fair не гарантирует

Provably Fair — мощная защита от одного конкретного типа мошенничества: подкрутки результата раунда постфактум. Но это не панацея. Вот чего эта система не делает.

Не уменьшает домовое преимущество

RTP остаётся 97 %, в среднем игрок теряет 3 % от каждой ставки. Provably Fair гарантирует честность процесса, а не выгодность результата. Если вы сыграете тысячу честно сгенерированных раундов с отрицательным математическим ожиданием — вы потеряете деньги. Так же как в честной лотерее с RTP 50 %.

Не защищает от выбора «плохого» серверного сида

Технически казино перед серией может сгенерировать тысячу кандидатов в server_seed, посмотреть, какие распределения множителей они дают, и выбрать наименее выгодный для игрока. Хеш будет от выбранного сида — формально всё «честно», но в реальности казино использовало предзнание. Это атака называется selection attack.

Защита от этого — задавать собственный client_seed вручную. Если клиентский сид задан игроком (а не сервером), казино заранее не знает, какой получится итоговый множитель, и не может его «подобрать».

Не отменяет лицензию регулятора

Provably Fair решает только одну задачу — математическую проверку раунда. Все остальные аспекты онлайн-казино (выплаты, защита данных, борьба с зависимостью, KYC, AML) лежат в плоскости регуляторов и лицензий. Можно иметь Provably Fair и при этом отказывать в выплате выигрыша по надуманным причинам — это разные вещи.

Не делает игру «умнее»

То, что вы можете проверить результат раунда после его окончания, никак не помогает предсказать следующий раунд. Чтобы предсказать — нужен server_seed, а он раскрывается только после серии. Любые «сигналы», «прогнозы» и «алгоритмы», которые претендуют на предсказание Provably Fair-раундов — это обман. Подробнее об этом — в материале «Правда о сигналах».

Частые вопросы про Provably Fair

Лицензия регулятора (например, Curaçao или MGA) подтверждает, что казино прошло формальные требования: финансовая прозрачность, защита данных, наличие договоров с провайдерами игр. Но регулятор проверяет соответствие правилам, а не математику каждого раунда. Provably Fair — это техническое дополнение, которое позволяет любому игроку математически проверить конкретный результат, без доверия к казино или к регулятору. Это особенно ценно в crypto-индустрии, где исторически доверие к операторам было низким.