Перевірка результату Crash-гри: алгоритм, безпека

1) Мета перевірки: що саме ви підтверджуєте

Непідмінюваність: оператор не міг змінити результат після вашої ставки (за рахунок коміту хешу серверного сиду).
Відтворюваність: маючи вхідні дані, ви отримуєте той же множник, що показала гра.
Цілісність процедури: формат повідомлення, інкремент'nonce', правило округлення і «house edge» застосовані строго за специфікацією.

2) Дані, без яких перевірка неможлива

1. Server Seed Hash (коміт) - публікується до використання відповідного'Server Seed'.
2. Server Seed (розкривається пізніше/після закінчення періоду).
3. Client Seed (ваш сід; ви задаєте його самі або платформа генерує).
4. Nonce (лічильник ваших ставок в рамках поточного'Server Seed').
5. Алгоритм хешування (зазвичай «HMAC-SHA256» або «SHA-256»).
6. Формат повідомлення (приклад: `":"'), точні роздільники/регістр/кодування.
7. Формула маппінгу хеша → множник (і правило округлення/мінімуму).

💡Вся специфікація повинна бути в розділі Fairness/Provably Fair у оператора. Якщо чогось немає - це червоний прапор (див. § 10).

3) Алгоритм перевірки (7 кроків)

1. Звірте коміт: порахуйте'SHA-256 (ServerSeed)'і порівняйте з опублікованим'ServerSeedHash'.
2. Зберіть повідомлення: строго в форматі платформи (наприклад,'msg = ClientSeed + ":" + Nonce`).
3. Порахуйте раундовий хеш:
  • при'HMAC-SHA256': `RoundHash = HMAC_SHA256(key=ServerSeed, msg=message)`;
при'SHA-256': 'RoundHash = SHA256 (ServerSeedmessage)'або як зазначено в специфікації.
4. Витягніть випадковість: візьміть перші'k'біт (часто 52) → ціле'r', потім'u = r/2 ^ k'.
5. Застосуйте формулу маппінгу: перетворіть'u'в множник (house edge/особливі кейси враховуються по документації гри).
6. Округліть за правилами гри (наприклад, до 2 знаків, мінімум 1. 00 × тощо).
7. Порівняйте з підсумком раунду в історії. Збіг = коректна чесність.

4) Псевдокод (можна адаптувати під Python/JS)

```python
Вставте сюди точну формулу маппінгу від вашої платформи замість stub_mapping ()

import hmac, hashlib, math

def round_hash(server_seed: bytes, client_seed: str, nonce: int) -> bytes:
  • message = f"{client_seed}:{nonce}" .encode ("utf-8") формат дивіться в специфікації
  • return hmac. new(server_seed, message, hashlib. sha256). digest () або hashlib. sha256(...)

def take_u_from_hash(h: bytes, k_bits=52) -> float:
  • Беремо k старших біт як ціле r
  • r = int. from_bytes(h, "big") >> (256 - k_bits)
  • return r / (1 << k_bits) u в [0, 1)

def stub_mapping(u: float) -> float:
  • ЗАГЛУШКА! Замініть на формулу з документації вашої гри
  • Наприклад, іноді використовують перетворення вигляду: crash = floor( (const / (r+1)) 100 ) / 100
  • і/або «house edge» як рідкісне примусове 1. 00×. Не використовуйте цей стуб в реальній перевірці.
  • return max(1. 00, round(1. 0 / max(1e-12, 1. 0 - u), 2))

def verify(server_seed_hex, server_seed_hash_hex, client_seed, nonce, shown_multiplier):
  • server_seed = bytes. fromhex(server_seed_hex)
  • 1) Коміт
  • assert hashlib. sha256(server_seed). hexdigest() == server_seed_hash_hex. lower()
  • 2-3) Хеш раунду
  • h = round_hash(server_seed, client_seed, nonce)
  • 4) u
  • u = take_u_from_hash(h)
  • 5-6) маппінг + округлення
  • calc_mult = stub_mapping(u)
  • 7) порівняння
  • return abs(calc_mult - shown_multiplier) < 1e-9
  • ```

Важливо: замість'stub _ mapping'застосуйте точну формулу з розділу Fairness вашої платформи; інакше перевірка буде некоректною.

5) Приватні випадки і підводні камені

Дві ставки в одному раунді: у багатьох платформ «nonce» збільшується на кожну вашу ставку, навіть якщо вони зроблені в один і той же раунд (приклад: ставка A →'nonce = 42', ставка B →'nonce = 43'). Перевіряйте з історії.
Зміна'Client Seed': при зміні сида'nonce'зазвичай скидається (або починається новий потік). Звірте правила саме вашої платформи.
Батчі'Server Seed': один «Server Seed» діє на серію раундів, потім публікується новий коміт; не плутайте насіння різних періодів.
Округлення/мінімум: невідповідність по другому знаку - в 90% випадків помилка в правилах округлення/мінімуму (наприклад, фіксований 1. 00 × за спец-умови).
Кодування/пробіли: зайвий пробіл/переклад рядка, невірний регістр, не-UTF-8 ламають перевірку.

6) Чек-лист швидкої перевірки раунду

1. Чи збігається'SHA-256 (ServerSeed)'з опублікованим'ServerSeedHash'?
2. Чи вірно сформований'message'і формат'nonce'?
3. Алгоритм ('HMAC-SHA256 '/' SHA-256') і ключ/порядок полів застосовані строго за специфікацією?
4. Маппінг і округлення ідентичні документації?
5. Чи враховуються особливі випадки (рідкісний «моментальний краш», мінімум 1. 00 ×, капи)?
6. Результат збігається з історією гри до копійки?

7) Автоматизація контролю (практика)

Логи: зберігайте у себе'client _ seed', послідовність'nonce', мітку часу, підсумковий множник.
Семплінг: після «ревіла»'Server Seed'проганяйте скриптом випадкові 20-50 раундів; фіксуйте відсоток збігів (повинен бути 100%).
Регресія: при зміні версії гри/провайдера проженіть той же набір.
Експорт: зберігайте CSV/JSON з вихідними - це ваш «аудит-трек».

8) Безпека: як не помилитися і не дати себе обдурити

Перевіряйте локально/офлайн: не покладайтеся тільки на веб-валідатор оператора; тримайте власний скрипт.
Не довіряйте раундам без повного пакету даних: немає формули/формату - немає верифікації.
Сильний'Client Seed': задавайте випадковий, змінюйте періодично (це не підвищує RTP, але виключає питання до відтворюваності).
TLS/сесії: вхід тільки по HTTPS, 2FA, відстеження входів і вивантажень історії.
Нікому не передавайте'Server Seed': він публікується оператором після періоду; ваше завдання - звірити, не «добути» його заздалегідь.

9) Типові «помилки новачків»

Переплутаний порядок полів ('Nonce:ClientSeed'замість'ClientSeed:Nonce`).
Рахунок'nonce'з нуля замість одиниці (або навпаки).
Використаний хеш всього раунду платформи (global nonce), а потрібен ваш персональний'nonce'.
Ігнор округлення за правилами (banker's rounding vs floor/ceil).
Звірка з активним, а не з уже розкритим'Server Seed'.

10) «Червоні прапори» у оператора

Немає публічного Server Seed Hash до старту періоду.
Не можна задати свій Client Seed або подивитися nonce.
Відсутня публічна формула маппінгу хеша в множник.
Історія раундів не дає мінімум даних для звірки.
Формат і алгоритм змінювалися без повідомлення/архіву специфікацій.

11) Австралійський контекст (AU)

Валюта: ведіть облік виграшів/ставок в AUD, зберігайте вивантаження історій (підтримка, спірні питання).
Відповідальна гра (RG): ліміти депозиту/часу, паузи та самовиключення - доступні у сумлінних додатках; використовуйте їх.
Платформні практики: у сумлінних операторів блок «Fairness/Provably Fair» містить повний опис і приклади верифікації; відсутність подробиць - привід вибирати інший сервіс.

12) Підсумок

Перевірка результату Crash-гри - це чітка процедура:
  • звірка коміту'Server Seed Hash',
  • відновлення'RoundHash'по'Server Seed','Client Seed','nonce'і алгоритму,
  • застосування опублікованої формули маппінгу і правил округлення,
  • ідентичний множник у вашій перевірці і в історії гри.

Тримайте власний скрипт, логуйте вхідні дані та періодично перевіряйте випадкові раунди. Так ви підтверджуєте чесність не на словах, а математично.