Честность костей в нардах: как на самом деле работает серверный RNG
Каждый, кто играл в нарды онлайн, хоть раз набирал в поиске один и тот же вопрос: кости подкручены? Он заслуживает настоящего ответа, а не маркетингового пожатия плечами. Это техническая версия: откуда берутся цифровые кости, что в них действительно может пойти не так и как правильно построенная игра выводит выпавшее число из-под чьего бы то ни было влияния архитектурой, а не обещанием.
Где рождается цифровая кость
Настоящую кость перемешивает физика: кувырок, отскок, сукно. Цифровая кость, это число, выданное генератором случайных чисел (ГСЧ, по-английски RNG), программой (часто с подпиткой от железа), чья задача, выдавать значения, которые никто не может предсказать или повторить.
Генераторы бывают очень разные. Простой псевдослучайный генератор, из тех, что перемешивают плейлист, выдаёт последовательность, полностью определённую стартовым значением (зерном). Знаете зерно и алгоритм, знаете каждое "случайное" число, которое он когда-либо выдаст. Для плейлиста это нормально, для игры со ставкой бесполезно. Серьёзные игры берут криптографически стойкие генераторы (CSPRNG), которые непрерывно подмешивают энтропию реального мира: шум железа, дрожание таймингов, хаос системных событий. Их определяющее свойство ровно то, что нужно игре в кости: даже тот, кто видел все предыдущие выходы, не предскажет следующий.
Вопрос поважнее: где он выполняется?
Вот о чём игроки почти никогда не спрашивают. Важно не столько, какой генератор выдал ваш бросок, сколько где он выполнился. Если кости бросаются на устройстве игрока, игра сломана по своей конструкции, каким бы хорошим ни был алгоритм: изменённый клиент может перебрасывать, пока результат не понравится, править исход в памяти или подсматривать значения до того, как ход сделан. Кости на стороне клиента, это обещание, а обещания вырезаются из приложения патчем.
Правильная архитектура, серверная: бросок происходит на игровом сервере, в среде, до которой не дотягивается железо ни одного игрока. Ваше устройство получает уже существующий бросок и просто анимирует его. В нашей игре, как рассказано на странице честной игры, дело не ограничивается костями: сервер проверяет каждый ход по правилам, а оба клиента постоянно сверяют свою доску с отпечатком, который сервер рассылает с каждым обновлением. Нет ни одного момента, когда устройству игрока доверяют хоть что-то важное.
Одно это решение убирает сразу целые классы жульничества. Никто не перебросит, потому что бросок предшествует ходу. Никто не считает следующее число со своего устройства, потому что его там просто нет. И никто не подправит доску втихую, потому что доска, разошедшаяся с серверной, отбрасывается и пересобирается за один круг обмена.
Что на самом деле значит "доказуемо честно"
Годами ответом индустрии на вопрос "кости честные?" был сертификат: лаборатория один раз проверяет генератор и выдаёт печать, которой вас просят верить. Мы считаем, что вы заслуживаете большего, чем печать. Доказуемая честность означает, что верить нам не нужно вовсе, потому что каждый бросок несёт собственное доказательство. Механизм, это схема обязательств с обменом по ходу партии, и выглядит он так: стопка запечатанных бумажек у каждого игрока плюс наш запечатанный конверт.
- Замок. До первого броска сервер создаёт секретное зерно и отдаёт вам его криптографический отпечаток, хеш, пока исход ещё неизвестен. В тот же момент приложение каждого игрока запечатывает собственную пронумерованную стопку бумажек и публикует только отпечаток этой стопки. Все три отпечатка фиксируются вместе в одной записи, так что потом ни один нельзя подменить другим, и ни один не выдаёт того, что скрывает.
- Обмен. Кости не решены заранее. Они собираются по одной, по фиксированной публичной формуле, и каждой нужна бумажка из обеих стопок. Каждый ход тот, кто собирается бросать, первым публикует свою очередную бумажку, соперник раскрывает свою только после этого, и кость вычисляется последней, из обеих бумажек и запечатанного зерна. Печать каждой бумажки выведена из следующей в её стопке, поэтому задним числом бумажку не подменить. А поскольку последнее неизвестное всегда лежит по ту сторону доски, никто, включая нас, не может знать кость, пока открыто хоть одно решение, способное её изменить.
- Проверка. Когда партия закончена, сервер вскрывает конверт и показывает зерно, а вся запись публикуется. Вы хешируете зерно и убеждаетесь, что оно совпадает с отпечатком, выданным вам в начале, доказательство, что подмены не было; проверяете, что каждая бумажка принадлежит той стопке, которую её сторона зафиксировала; а затем прогоняете ту же публичную формулу и заново выводите каждый бросок сами. Если бы одну кость подтолкнули, пересчёт не сошёлся бы, и подделку было бы не спрятать.
В этом вся разница между "верьте нашему сертификату" и "проверьте сами". Вам не нужно верить, что наши кости честные, вы можете их проверить, партия за партией, математикой, доступной любому. На странице честной игры стоит инструмент, который именно это и делает: скормите ему сыгранную партию и смотрите, как каждый бросок выводится заново из опубликованной записи. Единственное, чего публичная страница не может, это подтвердить, что запись, это ваш матч, потому что копию зафиксированных до игры отпечатков сохранило только ваше устройство; эта последняя проверка живёт в приложении.
Одна честная оговорка, которую доказательство не отменяет: доказуемо честные кости всё равно не бывают гладкими, вежливыми и чередующимися. Проверяемое зерно выдаёт сгустки, серии и засухи ровно с той частотой, которую предсказывает теория вероятностей. Подозрительным был бы как раз поток без серий. Настоящая случайность комковата, и именно поэтому она так часто кажется подкрученной.
Почему честные кости кажутся подкрученными
А это уже психология, потому что ощущение подкрученных костей реально даже тогда, когда кости честны. Работу делают три хорошо изученных искажения:
Избирательная память. Вы помните тот вечер, когда вас четыре хода подряд не пускали с бара. Вы не помните сотни обычных заходов до этого. Болезненные исходы записываются прочнее: у каждого опытного игрока есть личный музей возмутительных случаев и ни одной записи об обыденном.
Закон малых чисел. Человек ждёт, что крошечная выборка будет похожа на долгосрочное среднее. За 36 бросков каждая комбинация "должна" выпасть примерно один раз, но реальные наборы из 36 бросков дико неровные: одних чисел нет вовсе, другие приходят втройне. Один вечер за доской, это крошечная выборка. В ней правит дисперсия, а дисперсия ощущается как что-то личное.
Асимметрия потерь. Выстрел 17 из 36, который в вас попал, ощущается несправедливостью; 19 из 36 промахов не ощущаются никак. А поскольку нарды непрерывно разыгрывают события с вероятностью 30 и 70 процентов, "невозможные" исходы поставляются равномерно, ровно с той частотой, с какой они и возможны.
Противоядие, знание настоящих чисел. Любое конкретное число выпадает в 11 бросках из 36. Дубль приходит раз в шесть бросков. Блот в шести пунктах от шашки соперника получает удар почти в половине случаев. Наше руководство по основам вероятности раскладывает всю таблицу, и как только эти цифры оседают в голове, большинство "подкрученных" моментов переписывается в разряд обычных вторников.
Вопрос выгоды
Ещё один честный довод: оператору нард нечего выиграть от кривых костей и есть что потерять. Соревнующиеся игроки, те, кто остаётся на годы, это ровно те люди, которые считают шансы и замечают аномалии. Рейтинговая система работает и как публичный аудиторский след: если бы кости кому-то системно подыгрывали, распределение рейтингов поехало бы измеримым образом. Честные кости не добродетель, которую мы разыгрываем; это единственная устойчивая бизнес-модель для игры, в которой решает мастерство.
Как убедиться самому
Не верьте на слово ни одному оператору, нам в том числе. Выучите базовые частоты по руководству по вероятностям, а затем смотрите свои партии с этими числами в голове: шансы входа против доски с двумя закрытыми пунктами, частота дублей на длинной сессии, доля попаданий по прямым выстрелам. Честные кости сходятся к табличным предсказаниям на удивление быстро. А если нужны детали устройства, обязательства и обмен по ходу партии, серверные броски, проверка доски на каждом ходу, подбор соперника по Glicko-2, страница честной игры, это полное описание того, как собран наш стол, вместе с инструментом проверки. И тогда партии решает та переменная, которая и должна: насколько хорошо вы играете выпавшее. Руководства по стратегии ровно для этого.