🛡 Provably Fair — как работает честность TCS Dice
TCS Dice использует криптографический алгоритм provably fair — любой пользователь может математически проверить что результат каждой ставки не подделан казино. Объясняем как это работает.
📌 Короткий ответ
Перед каждой серией ставок сервер генерирует случайный server seed и показывает вам только его SHA-256 хеш (commitment). Вы добавляете свой client seed. Для каждого броска nonce увеличивается на 1. roll = HMAC-SHA256(server_seed, client_seed:nonce) mod 1 000 000. После смены server seed старый раскрывается — вы можете проверить что хеш совпадает и пересчитать каждый roll сами. Сервер не может подделать результат, потому что commitment был зафиксирован ДО ставки.
⚙ Алгоритм пошагово
1. Commit (фиксация)
При создании аккаунта или сбросе сервер генерирует криптографически случайный 32-байтовый server_seed и показывает только его SHA-256 хеш:
server_seed = random_bytes(32) → "a1b2c3...e8f9" // секрет server_seed_hash = SHA256(server_seed) → "9f8e7d...1234" // показывается вам
Вы видите хеш ДО ставки. Изменить server_seed после фиксации невозможно — это математически проверяемо.
2. Client seed (ваш вклад)
Вы можете задать свой client_seed любой текст. По умолчанию генерируется случайный. Это гарантирует, что сервер не может предсказать ваш будущий вклад.
client_seed = "my_lucky_seed_42" // ваше
3. Nonce (счётчик)
Для каждого броска nonce увеличивается на 1, начиная с 0. Так что первая ставка использует nonce=0, вторая — nonce=1, и так далее. При смене client_seed nonce сбрасывается в 0.
4. Расчёт roll
data = client_seed + ":" + nonce // "my_lucky_seed_42:0" hmac = HMAC-SHA256(key=server_seed, data) // 64 hex символа // Берём блоки по 5 hex char (макс 0xFFFFF = 1048575) // Если value < 1000000 → это наш roll. Иначе следующий блок. roll = first_valid_block(hmac, 5_chars) // 0-999999
Используется rejection sampling для исключения modulo bias.
5. Reveal (раскрытие)
Когда вы запускаете "Rotate Server Seed", старый server_seed раскрывается, и вы можете проверить:
SHA256(revealed_server_seed) === committed_hash✓HMAC-SHA256(revealed_server_seed, client_seed:nonce)даёт тот же roll ✓- Если оба ✓ — все ваши ставки были честными
🧮 Расчёт выигрыша
multiplier = (100 - house_edge) / chance
= (100 - 1.0) / chance
= 99 / chance%
# Примеры:
# chance = 50% → multiplier = 99 / 50 = 1.98×
# chance = 10% → multiplier = 99 / 10 = 9.90×
# chance = 1% → multiplier = 99 / 1 = 99×
# chance = 0.01% → multiplier = 99 / 0.01 = 9 900×
# chance = 98% → multiplier = 99 / 98 ≈ 1.01×
# Победа:
# - Roll Under: roll < (chance × 10000)
# - Roll Over: roll > (999999 - chance × 10000)
profit_on_win = bet_amount × (multiplier - 1)
loss = -bet_amount
House edge 1.0% означает что в долгосрочной перспективе казино удерживает 1% от каждой ставки. Это значительно ниже типичных 2-5% в традиционных online-казино, и сравнимо с 999dice (0.1%) и Stake.com (1%).
🔍 Как проверить свою ставку самостоятельно
После rotate server seed используйте скрипт ниже (Node.js или Python) с данными из вашей истории ставок:
// Node.js — verify.js
const crypto = require('crypto');
const serverSeed = 'a1b2c3d4...'; // revealed после rotate
const clientSeed = 'my_lucky_seed_42';
const nonce = 0;
// 1. Проверяем commitment
const hash = crypto.createHash('sha256').update(serverSeed).digest('hex');
console.log('Hash:', hash);
console.log('Should match committed hash from your bet history');
// 2. Пересчитываем roll
const data = clientSeed + ':' + nonce;
const hmac = crypto.createHmac('sha256', serverSeed).update(data).digest('hex');
let roll;
for (let i = 0; i + 5 <= 64; i += 5) {
const v = parseInt(hmac.substring(i, i + 5), 16);
if (v < 1000000) { roll = v; break; }
}
console.log('Roll:', roll);
console.log('Should match the roll in your bet history');
# Python — verify.py
import hashlib, hmac
server_seed = bytes.fromhex('a1b2c3d4...')
client_seed = 'my_lucky_seed_42'
nonce = 0
# 1. Проверяем хеш
h = hashlib.sha256(server_seed).hexdigest()
print('Hash:', h)
# 2. Пересчитываем roll
data = f'{client_seed}:{nonce}'.encode()
hm = hmac.new(server_seed, data, hashlib.sha256).hexdigest()
for i in range(0, 64-5+1, 5):
v = int(hm[i:i+5], 16)
if v < 1000000:
print('Roll:', v); break
❓ FAQ
Может ли сервер сжульничать?
Нет. Server seed зафиксирован через SHA-256 commitment ДО вашей ставки. Если сервер попытается изменить server_seed после ставки, его хеш не совпадёт с тем, что был показан вам — обман будет обнаружен математически.
Что если я не доверяю своему client seed?
Вы можете задать собственный client_seed в любое время через "Сменить client seed". Сервер не может предсказать ваш будущий client_seed, потому что он не знает его до запроса.
Зачем нужен nonce?
Без nonce все ставки с одним (server_seed, client_seed) давали бы один и тот же roll. Nonce делает каждый бросок уникальным, при этом оставаясь предсказуемым для верификации.
Почему house edge 1%, а у 999dice — 0.1%?
999dice — старая платформа на реальной крипте с миллиардными оборотами, что позволяет им работать с минимальной маржой. Мы — игровой механизм на in-game токене $TCS без денежного эквивалента, и 1% house edge — это разумный баланс между развлекательностью и устойчивостью системы.
$TCS — это реальные деньги?
Нет. $TCS — это игровой токен внутри TonCoinShop, не подлежащий обмену на реальные деньги или криптовалюту. Игра построена как развлекательный механизм без денежного эквивалента, что освобождает её от лицензирования азартных игр.
Это provably fair хуже чем blockchain RNG?
Provably fair и on-chain RNG решают разные задачи. Provably fair даёт пользователю математическую гарантию по каждой ставке (что важнее) при низкой стоимости. On-chain RNG даёт публичный реестр, но дорого в gas. Для dice-механики provably fair — индустриальный стандарт.