Перевірка результату 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. Формула маппінгу хеша → множник (і правило округлення/мінімуму).
3) Алгоритм перевірки (7 кроків)
1. Звірте коміт: порахуйте'SHA-256 (ServerSeed)'і порівняйте з опублікованим'ServerSeedHash'.
2. Зберіть повідомлення: строго в форматі платформи (наприклад,'msg = ClientSeed + ":" + Nonce`).
3. Порахуйте раундовий хеш:
4) Псевдокод (можна адаптувати під Python/JS)
```python
Вставте сюди точну формулу маппінгу від вашої платформи замість stub_mapping ()
import hmac, hashlib, math
def round_hash(server_seed: bytes, client_seed: str, nonce: int) -> bytes:
def take_u_from_hash(h: bytes, k_bits=52) -> float:
def stub_mapping(u: float) -> float:
def verify(server_seed_hex, server_seed_hash_hex, client_seed, nonce, shown_multiplier):
Важливо: замість'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-гри - це чітка процедура:
Тримайте власний скрипт, логуйте вхідні дані та періодично перевіряйте випадкові раунди. Так ви підтверджуєте чесність не на словах, а математично.
Непідмінюваність: оператор не міг змінити результат після вашої ставки (за рахунок коміту хешу серверного сиду).
Відтворюваність: маючи вхідні дані, ви отримуєте той же множник, що показала гра.
Цілісність процедури: формат повідомлення, інкремент'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'і алгоритму,
- застосування опублікованої формули маппінгу і правил округлення,
- ідентичний множник у вашій перевірці і в історії гри.
Тримайте власний скрипт, логуйте вхідні дані та періодично перевіряйте випадкові раунди. Так ви підтверджуєте чесність не на словах, а математично.