ADR-0008 · Честность кубиков — server CSPRNG + commit-reveal
Статус: реализовано · решение 2026-06-26 · в проде с play-api
v0.4.0(2026-06-30)
Реализовано (as-built)
Провабли-фейр кости в проде: части 1 (
#56, раскрытие serverSeed) + 2 (#57, клиентская энтропия + гейт первого броска) →v0.4.0; клиентdicechess-play(#30) иreference-bot(#13) шлют свои сиды. Полное as-built описание, точный алгоритм и процедура верификации — 06 Честность кубиков — провабли-фейр и верификация.
Контекст. В HvH кости нельзя доверять клиенту (патченый клиент подкрутит бросок). Вопрос Жегорса: генерировать на сервере (тревога — нагрузка) или на клиентах (тревога — читерство, мысль про блокчейн). Структурный факт Dice Chess: сначала бросок, потом игрок реагирует — кости это вход, не скрытый исход ставки. Ставки сейчас = виртуальные очки, но возможна коммерциализация (реальные деньги) позже.
Решение. Кости генерирует сервер, CSPRNG, в той же авторитетной петле, что валидирует ходы, обёрнутые в per-game commit-reveal (provably-fair): сервер коммитит H=SHA256(server_seed) до сбора клиентских seed-ов, бросок = HMAC-SHA256(server_seed, be32(|W|)‖W‖be32(|B|)‖B‖ply) (length-prefixed — разбиение сидов однозначно) → 3 кости [1,6] rejection-sampling, на конце партии раскрывает server_seed и оба клиентских сида (любой пере-проверяет). Бросок позиционно-независим roll(n)=f(seed,n) (нужно для зеркальных турнирных пар). Спрятано за swappable-интерфейс DiceSource — апгрейд без смены протокола/клиента. Блокчейн — нет, никогда для этой игры.
Последствия.
- Тревога про нагрузку опровергнута: бросок ~1 µs (или ~100–300 нс HMAC) — на 4–6 порядков дешевле валидации хода / WS-push / записи в БД. Решать по доверию, не по нагрузке.
- Нулевая доп. латентность во время игры (в отличие от блокчейна ~2 с/бросок + газ), но доказуемо честно постфактум — закрывает «багнутый/смещённый оператор» дёшево.
DiceSource-интерфейс + commit-reveal на критическом пути с 3a = шов под коммерциализацию: переход на VRF (реальные деньги) аддитивен, не переписывание.- Reveal-лог (seed/commit) даёт детерминированный пост-гейм реплей и разбор споров — фича для турниров (ADR-0009).
Альтернативы (отклонены). Голый server-CSPRNG без commit-reveal — не детектит смещение оператора (commit-reveal даёт это почти даром). Клиентские кости — небезопасно в HvH. VRF/threshold — избыточно для бесплатной игры (в лестнице апгрейдов при реальных деньгах). Блокчейн (RANDAO/Chainlink VRF) — решает децентрализ. доверие, которого нет (оператор = ты); +латентность блока + газ + чужой стек; over-engineering для 2-игроковой централизованной игры.
Детали + лестница апгрейдов: 04 Фаза 3 §2.