Как проверить раунд 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 — независимая проверка всей системы, а лицензия — разрешение регулятора. Это ответы на разные вопросы, и одно не заменяет другое.
Проверьте раунд сами
Задайте свой клиентский сид, сыграйте, сделайте ротацию и пересчитайте. Всё нужное есть в приложении.
Открыть Gift ClubЧитать дальше
- «Игры в Telegram с RTP 95% и без KYC» — вторая половина вопроса: проверяемая не значит щедрая.
- «Индекс RTP: все 14 игр» — опубликованная отдача по каждой игре.
- Minefield — игра, где раскладка по сиду напрямую и есть результат.
- Gift Club в Telegram — панель Provably Fair находится в профиле.
Источники
Готов начать?
Открой Gift Club в Telegram и примени всё на практике.
Играть в Gift Club
