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.

🔗 ADR-0007 Серверный авторитет и realtime (фаза 3) · 00 Журнал решений (ADR)