engineeringfairnessmultiplayer
Серверный авторитет означает, что сервер хранит единственную копию партии, которая имеет значение. Твоё устройство отправляет ход, который ты хочешь сыграть, сервер проверяет его по своим костям и своим правилам, и только после этого доска меняется. Изменённое приложение может утверждать что угодно: правда живёт там, куда оно не дотянется.
Нарды эту строгость заслуживают. Это игра с костями, лестницей и банком, а значит смошенничать можно двумя способами: подделать ходы или согнуть броски. Честный сервер обязан закрыть обе двери. Вторая дверь включает нас, и до этого мы дойдём.
Что на самом деле означает серверный авторитет?
Каждый живой матч Orion существует ровно в одном месте: на нашем сервере. Доска на твоём телефоне это окно, а не игра. Когда ты тянешь шашку, приложение её не двигает. Оно отправляет короткое сообщение: вот что я хочу сыграть. Сервер проигрывает это намерение на своей доске, своим движком правил, используя кости, которые он бросил для этого хода. Законные ходы двигают партию вперёд, и оба игрока получают одну и ту же новую позицию. Незаконных ходов просто не было.
Это один сервер для всех. Приложение для iOS написано на нативном SwiftUI, приложение для Android на нативном Jetpack Compose, и оба они окна в один и тот же бэкенд и один и тот же пул игроков. Разное стекло, одна правда.
Почему игры, доверяющие клиенту, обманывают?
Потому что устройство соперника принадлежит сопернику. Всё, что на нём работает, можно изменить. Пропатченный клиент может отправлять ходы, которые никогда не были законными. Редактор памяти может переписать число на месте, и экран честно покажет ложь. Ничего экзотического здесь нет. Инструменты бесплатны, задокументированы и старше смартфонов.
Игра, доверяющая клиенту, просит каждого игрока пообещать не заглядывать под капот. Кто-то заглянет. Поэтому мы сделали мнение клиента несущественным. В Orion у приложения ровно три задачи:
- Рисовать: доску, шашки, куб, таймер.
- Просить: попросить сервер сыграть ход, предложить удвоение, сдаться.
- Принимать: показывать ту позицию, которую сервер называет настоящей.
Бросать кости, судить о законности и двигать хоть одну фишку в этом списке нет. Ничто, решающее исход, не рождается на устройстве.
Что происходит, когда я делаю ход?
Ты играешь.. Приложение отправляет намерение: эта шашка, эти пункты. Ничто на твоём устройстве не меняет настоящую доску.
Сервер его проигрывает.. Наш движок правил прогоняет ход по серверной доске и серверным костям. Если он законен, партия движется дальше. Если нет, он отклоняется у источника, каким бы приложением он ни был отправлен.
Обе стороны получают одну правду.. Новая позиция уходит обоим игрокам. Если связь оборвалась, льготное время переподключения держит твоё место, и ты возвращаешься к доске такой, какая она есть, а не такой, какой её запомнил твой телефон.
Ставки подчиняются тому же правилу. Когда начинается матч со взносом, сервер удерживает оба взноса. Банк живёт в одном реестре, на сервере, и там же рассчитывается по окончании партии. Ни у одного клиента никогда не спрашивают, сколько он считает, что выиграл. Монеты и самоцветы виртуальны, не имеют реальной ценности и не выводятся, и мы всё равно ведём этот реестр так, будто в нём лежит нечто драгоценное, потому что так и есть: твоё доверие к счёту.
Что мешает жульничать самому серверу?
Это правильный вопрос, и большинство игр надеется, что ты его никогда не задашь. Сервер, бросающий кости втайне, мог бы бросать их благосклонно тому, кому симпатизирует, и ты бы этого не увидел. Любой бросок выглядит правдоподобно. Такова природа костей.
Поэтому мы отняли эту власть у самих себя. До начала партии сервер порождает секретное зерно и публикует обязательство SHA-256 на него. Каждый бросок затем выводится из этого зерна через HMAC-SHA256, по одному, по порядку. Когда партия заканчивается, сервер раскрывает зерно. Любой может проверить, что зерно соответствует обязательству, сделанному до первого броска, и что каждый бросок партии из него следует. В криптографическом смысле твои кости были зафиксированы до того, как игроки коснулись шашек. Мы не смогли бы согнуть двенадцатый бросок, не сломав обещание, опубликованное на нулевом.
Верить нам на слово ни в чём из этого не нужно. Верификатор на orion.arthea.ai/verify пересчитывает всю цепочку в твоём браузере, через Web Crypto, на твоей машине, из публичной записи партии. Без аккаунта, без установки. Дверь на orion.arthea.ai/go несёт ссылки на App Store и Google Play и всегда показывает то, что доступно прямо сейчас.