Мини-приложения
    22 июля 202610 мин чтения

    Как проверить раунд Provably Fair

    Платные игры Gift Club используют HMAC-SHA256 commit-reveal. Пересчитайте любой раунд во встроенной проверке или в своей консоли — и узнайте, какую часть приложения схема не покрывает.

    Provably fair — это возможность проверить результат постфактум, а не верить на слово. Платные мини-игры Gift Club построены на стандартной схеме commit-reveal с HMAC-SHA256, и все данные, нужные для самостоятельного пересчёта раунда, доступны прямо в приложении. Ниже — как это сделать, и, что не менее важно, какая часть Gift Club этой схемой не покрывается.

    1. Что на самом деле гарантирует provably fair

    Гарантия ровно одна, узкая и ценная: оператор зафиксировал результат до вашей игры и не мог изменить его задним числом.

    Механизм — это обязательство. Перед ставкой сервер генерирует секретный серверный сид и публикует его SHA-256-хеш. Хеш ничего не говорит о самом сиде, но фиксирует его: после публикации подменить сид уже нельзя — хеш не сойдётся. Когда сид позже раскрывается, вы хешируете его сами и убеждаетесь, что это тот же сид, который был зафиксирован ещё до вашей ставки.

    Чего схема не гарантирует: что игра щедрая, что шансы хорошие или что вам заплатят. Игра может быть идеально проверяемой и при этом возвращать 40%. Проверяемость и RTP — это разные вопросы, и задавать нужно оба.

    2. Три входных значения

    Любой результат в платной игре Gift Club — чистая функция от трёх значений. Никакого скрытого четвёртого входа, серверных часов или случайности, добавленной после фиксации.

    ЗначениеКто управляетПодробности
    Серверный сидМы32 случайных байта от криптографического генератора. Его SHA-256-хеш показывается вам до игры; сам сид раскрывается при ротации.
    Клиентский сидВы1–64 символа: буквы, цифры и дефисы. Задайте любой. Именно он мешает нам подобрать удобный серверный сид — для этого пришлось бы заранее знать ваш.
    NonceАвтоматическиНачинается с 0 и растёт на единицу с каждой ставкой, так что два раунда на одной паре сидов не дадут одинаковых байт. Сбрасывается при ротации любого из сидов.

    Эти три значения идут в HMAC-SHA256 с ключом на серверном сиде и сообщением clientSeed:nonce:round. Счётчик round начинается с 0 и увеличивается на каждые нужные 32 байта — так игра, которой нужно больше (например, раскладка поля из 25 клеток), продолжает черпать из того же обязательства.

    Байты превращаются в числа по четыре, как дробь по основанию 256:

    float = b[0]/256 + b[1]/256² + b[2]/256³ + b[3]/256⁴

    Это та же конструкция, которую задокументировал Stake и которую используют большинство проверенных реализаций. Свою схему мы намеренно не изобретали: оригинальную вам было бы не с чем сверить.

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

    Сделать это можно двумя способами. Быстрый — прямо в приложении; консольный сниппет ниже для тех, кто не хочет верить на слово даже нашей собственной проверке.

    В приложении

    Откройте любую платную игру, нажмите щит рядом с названием и разверните «Проверить раунд». Раскрытый сид, ваш клиентский сид и nonce подставятся сами, но все поля остаются редактируемыми — можно проверить любой раунд, а не только тот, что на экране.

    Проверка выполняется в вашем браузере. SHA-256 и HMAC-SHA256 считаются локально через Web Crypto API — нам ничего не отправляется, поэтому результат не зависит от нашей честности в момент нажатия кнопки. Если обязательство не сошлось, розыгрыш не показывается вовсе: сид, который не совпал с опубликованным хешем, не описывает никакого раунда.

    В консоли

    Сначала выполните ротацию сидов — она раскроет серверный сид, который действовал для уже сыгранных раундов. Затем возьмите раскрытый серверный сид, свой клиентский сид и nonce нужного раунда и выполните это в любой JavaScript-консоли:

    const crypto = require("crypto");
    
    // Из приложения: Профиль → Provably Fair → История сидов
    const serverSeed = "<раскрытый серверный сид, hex>";
    const clientSeed = "<ваш клиентский сид>";
    const nonce      = 0;      // проверяемый раунд
    
    // 1. Убедитесь, что сид совпадает с хешем, показанным ДО игры.
    const commitment = crypto
      .createHash("sha256")
      .update(Buffer.from(serverSeed, "hex"))
      .digest("hex");
    console.log("commitment:", commitment);   // должен совпасть с опубликованным хешем
    
    // 2. Пересоберите байты раунда.
    const hmac = crypto
      .createHmac("sha256", Buffer.from(serverSeed, "hex"))
      .update(`${clientSeed}:${nonce}:0`)
      .digest();
    
    // 3. Превратите первые четыре байта в число в диапазоне [0, 1).
    const float =
      hmac[0] / 256 +
      hmac[1] / 65536 +
      hmac[2] / 16777216 +
      hmac[3] / 4294967296;
    console.log("first float:", float);

    Ключевой — первый шаг. Если вычисленный commitment не совпадает с хешем, который приложение показало до раунда, значит сид подменили, и остальное на этой странице читать незачем. Если совпадает — байты из шага 2 единственные, которые этот раунд мог использовать.

    Полная история сидов — каждый выведенный из обращения серверный сид, его хеш и диапазон nonce — доступна по адресу GET /api/games/{gameType}/seed-history и в приложении в разделе Provably Fair.

    4. Ротация сидов

    Ротация делает две вещи сразу: раскрывает серверный сид, против которого вы играли, и фиксирует новый. Nonce сбрасывается в 0.

    • Меняйте клиентский сид когда угодно. Новый клиентский сид меняет все последующие результаты, а поскольку хеш серверного сида опубликован заранее, подстроиться под ваш выбор мы не можем.
    • Сначала ротация, потом проверка. Активный серверный сид никогда не раскрывается — иначе любой смог бы вычислить будущие результаты, а именно это схема и обязана предотвращать.
    • Ротация не меняет шансы. Она меняет, какие результаты вы получите, а не насколько они хороши. Совет «крутить сид, пока не выпадет» — это ошибка игрока, а не стратегия.

    5. Чего схема не покрывает

    Именно этот раздел большинство операторов опускает, поэтому скажем прямо.

    Открытие подарочных боксов не является provably fair. Когда вы открываете бокс, попадание в призовую корзину определяет другой движок — с динамическими индивидуальными весами, теми самыми модификаторами XP и удачи, о которых мы пишем в разборе механик подарочных игр. Эти веса не входят в обязательство, и восстановить результат бокса из своих сидов нельзя.

    В мини-играх сиды определяют раскладку, а не удачу. Сид задаёт, где стоят мины, куда отскочит шарик в Plinko, как остановится колесо — геометрию раунда. В Minefield это буквально и есть вся игра: раскладка клеток и есть результат. В играх, где призовой уровень выбирает отдельный розыгрыш, гарантия уже.

    Поэтому точная формулировка такая: раунды платных мини-игр Gift Club проверяемы, открытия боксов — нет. Если конкурент заявляет «provably fair» про всё гача-приложение без такой оговорки, это заявление либо значит меньше, чем звучит, либо неправда.

    Ещё два ограничения, общие для любой provably fair системы, не только нашей:

    • Она не делает игру прибыльной. Проверенный раунд всё равно может быть проигрышным, а преимущество заведения применяется к каждой ставке.
    • Она не гарантирует выплату. Проверка доказывает, что результат не подделали. О том, исполнит ли оператор вывод, она не говорит ничего — это отдельный вопрос и оценивать его нужно отдельно.

    6. Частые вопросы

    Может ли Gift Club увидеть мой клиентский сид до выбора серверного?

    Нет, и именно порядок действий это обеспечивает. Серверный сид генерируется, а его хеш публикуется до раунда; ваш клиентский сид подмешивается позже. Смена клиентского сида в любой момент обесценивает любые предварительные расчёты.

    Почему серверный сид скрыт, пока я играю?

    Потому что зная его и ваш клиентский сид, любой вычислит все будущие результаты. Раскрытие при ротации — стандартное решение: доказательство вы получаете, но только для уже завершённых раундов.

    Какие игры покрыты?

    Каждая платная мини-игра из каталога игр: если игра принимает ставку в Stars, её раунд можно проверить. В играх только на XP проверять нечего — ставки нет.

    Что делать, если проверка не сходится?

    Пришлите нам серверный сид, клиентский сид и nonce. Расхождение — это либо баг с нашей стороны, либо ошибка во входных данных: чаще всего это nonce (он считается с нуля) или серверный сид, захешированный как текст, а не как hex-байты.

    Provably fair — это то же самое, что лицензия или аудит ГСЧ?

    Нет. Provably fair — самостоятельная проверка отдельных раундов. Сертификация ГСЧ в лаборатории вроде iTech Labs или BMM Testlabs — независимая проверка всей системы, а лицензия — разрешение регулятора. Это ответы на разные вопросы, и одно не заменяет другое.

    Пополни на 100 ★ → карта +50%

    Проверьте раунд сами

    Задайте свой клиентский сид, сыграйте, сделайте ротацию и пересчитайте. Всё нужное есть в приложении.

    Открыть Gift Club

    Читать дальше

    Источники

    Пополни на 100 ★ → карта +50%

    Готов начать?

    Открой Gift Club в Telegram и примени всё на практике.

    Играть в Gift Club

    Keep reading