News

Чи можуть онлайн-нарди бути підлаштовані?

Можуть. Закритий сервер здатен підкрутити кубики, а самі лише результати цього не доведуть. Як виглядає підтасовка і чому commit-reveal її виявляє.

fairnessprovably fairdice

Можуть. Онлайн-кубики кидають на сервері, якого ти не бачиш, і ніщо фізично не заважає оператору змінити число, перш ніж воно дійде до твоєї дошки. Самі лише результати ніколи нічого не доведуть у жодному напрямку, тож чесне питання не в тому, чи можлива підтасовка. Воно в тому, чи здатна гра довести, що її не було.

Ми робимо гру в нарди, тож тут ми не безсторонні. Саме тому хочемо відповісти як слід, разом із незручними частинами.

Чому на кожному сайті кубики здаються підкрученими?

Бо дисперсія в нардах безжальна, а людська пам'ять упереджена. Два кубики падають тридцятьма шістьма способами; серії не є збоєм, вони є гарантією, і сьогодні ввечері десь чесний сервер викине чотири дублі поспіль проти того, хто зіграв кожну шашку правильно. Ти пам'ятаєш 5-5, що збило твою відкриту шашку. Ти не пам'ятаєш дивовижного кидка, який урятував тебе минулого вівторка. Поразки лишаються, порятунки випаровуються, і після трьох поганих партій поспіль кубики стають особистими. Вони стають особистими і за справжньою дошкою в справжній кав'ярні. Спитай будь-кого, хто сорок років пересуває дерев'яні шашки.

І ось пастка. Підлаштована гра відчувалася б точнісінько так само. Серії не доводять нічого в жоден бік, тож якщо твій доказ це відчуття від кубиків, ти не відрізниш чесний сервер від нечесного. Ми теж не відрізнимо. Це не захист онлайн-кубиків. Це і є їхня проблема.

Чи справді сайт міг би підкрутити свої кубики?

Технічно так, і це навіть не було б важко. Сервер бачить усю дошку перед кидком. Оператор, який захотів би шахраювати, міг би:

  • Підправити кілька кидків зі ста в найважливіші моменти: кидок, що влучає, невдалий вхід із бару, дубль, що перевертає програну партію.
  • Штучно тримати матчі близькими, щоб сесії тривали довше, а поразки виглядали як майже перемоги.
  • Тихо підігрувати тій стороні, у якій оператор має інтерес.
  • Робити це достатньо рідко, щоб кубики й далі проходили будь-який статистичний тест, який здатен провести гравець.

Ми не стверджуємо, що якийсь конкретний сайт так робить. Ми кажемо, що архітектура це дозволяє. Закритий сервер це замкнена кімната: оператор кидає наодинці, повідомляє число і просить повірити. Ззовні дверей чесні й нечесні оператори виглядають однаково.

Хіба сертифікований генератор не доводить чесність кубиків?

Прочитай, що саме покриває той сертифікат. Лабораторія тестує генератор: алгоритм на стенді, що видає мільйони чисел, які проходять статистичні перевірки. Це сертифікує компонент. Це нічого не каже про доставку, тобто чи прийшло на твою дошку число саме від того генератора, саме тієї миті й незміненим дорогою. Повірені ваги в підсобці не доводять, що твій хліб зважили на них.

Сертифікація до того ж є миттєвим знімком. Робочі сервери постійно перерозгортають, і шлях коду між генератором і твоєю партією далі змінюється ще довго після того, як лабораторія пішла додому. Тож сертифікований генератор відповідає на питання, якого ніхто по-справжньому не ставив. Важить не те, чи є десь у будівлі добрі кубики. Важить, чи дісталися вони твоїй партії, при кожному кидку, сьогодні ввечері.

Що насправді змінює commit-reveal?

Він переносить чесність з обіцянки в доказ. Перед початком партії сервер бере таємне зерно й публікує його відбиток, хеш SHA-256, що зветься зобов'язанням. Кожен кидок у партії потім виводиться з того зерна, по одному обчисленню HMAC-SHA256 на кидок, по черзі. Коли партія завершується, сервер розкриває зерно.

Тепер будь-хто може перевірити дві речі. Захешуй розкрите зерно: результат мусить збігтися із зобов'язанням, опублікованим до першого ходу. Перерахуй кидки: вони мусять збігтися з кожним числом, що з'явилося на дошці. Якби сервер змінив хоч один кубик після того, як побачив твою позицію, математика не зійшлася б. Підтасовка перестає бути підозрою, яку не перевіриш, і стає брехнею, яку можна впіймати.

Кубики, замкнені до партії, не можуть на неї реагувати.

У цьому вся суть. Корисна підтасовка є реактивною: побачити відкриту шашку й викинути влучання. Commit-reveal забирає в сервера очі, бо вся послідовність зафіксована до першого ходу, а будь-яке втручання після зобов'язання виявляється математично. Чого він не робить, так це не робить кубики добрими. Послідовність була чесною, а не милосердною. Ти й далі сидітимеш на барі в найгірший момент, і тепер зможеш довести, що це було чесно.

Як перевірити партію на практиці?

Ось як ми це збудували в Orion. Кожна партія на наших серверах несе зобов'язання, зроблене до першого кидка, сервер перевіряє кожен живий хід у джерелі, а перевірка завершеної партії триває близько хвилини:

Відкрий верифікатор. Зайди на orion.arthea.ai/verify у будь-якому браузері. Нічого встановлювати не треба, обліковий запис створювати не треба.

Введи ідентифікатор партії. Кожна серверна партія в Orion його має. Встав його.

Хай браузер порахує сам. Сторінка перераховує зобов'язання й кожен кидок через Web Crypto, локально, у твоєму браузері. Наше слово в перевірці не бере участі. Якби хоч одне число змінили, перерахунок це показав би.

Верифікатор працює вже сьогодні. Сама гра готова, а двері на orion.arthea.ai/go несуть посилання на App Store і Google Play та завжди показують те, що доступне просто зараз. Хай там як, чесна відповідь лишається. Так, онлайн-нарди можуть бути підлаштовані. Ліки не в гарнішій обіцянці. Ліки в кубиках, які показують свою роботу.