Перевірка результату 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 (ServerSeed || message)'або як зазначено в специфікації.
  • 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'і алгоритму,
  • застосування опублікованої формули маппінгу і правил округлення,
  • ідентичний множник у вашій перевірці і в історії гри.

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

Caswino Promo