Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: P2P в играх
Из криптографии я собираюсь использовать хеширование и идею цифровой подписи. (Собственно, подписывается именно хэш от сообщения, потому что он фиксированной небольшой длины, а коллизию найти практически нереально).
Предположим, что игра обрабатывается дискретными "тиками". Необходимо, чтобы клиент мог по запросу передать наружу состояние мира, которое было n тиков назад. (Думаю, в пределах секунды или около того).
Каждый клиент генерит пару закрытый-открытый ключ, открытый сообщается остальным.
Клиент к каждому исходящему сообщению добавляет хэш состояния мира, а потом подписывает своим закрытым ключом. Зачем? Чтобы сторона, получившая сообщение, могла впоследствии предъявить его "судье" - подпись гарантирует, что сообщение отправил именно первый клиент, и что оно не было изменено.
Кроме того, клиенты берут хэши входящих сообщений от других игроков, подписывают их своим ключом и рассылают друг другу.
Таким образом, гарантируется, что клиент разослал одинаковое сообщение всем, и все его получили.
В случае возникновения разногласий между парой клиентов, каждого из них просят предъявить состояние мира в каком-то тике (для этого нужна возможность запросить состояние мира n тиков назад). Как писалось выше, состояние каждого клиента подписывается им же самим каждый тик, и подписанный хэш есть у остальных игроков. Таким образом, клиент будет вынужден дать именно то состояние, которое подписал.
Например, есть цепочка состояний A->B->C, причём разногласия в состоянии B, а в А - нет.
Клиент подписал все исходящие сообщения, а так же подписал сообщение о том, что он получил данные от других игроков.
Тогда "судья" просто может взять состояние А, взять входящие на тот момент сообщения, вычислить состояние B и сравнить его с состоянием у игрока.
Если состояние игрового мира большое (по количеству информации), можно разбить его на независимые кусочки (или частично независисые) и передавать хэш каждого кусочка - тогда для проверки не надо будет загружать всё состояние целиком.
Да, игроки разные игроки будут вычислять одно и то же по нескольку раз. Да, это можно применить и в ММО, где игрок бегает один по локации.
Например, неважные действия типа пробежек по пустой локации будут время от времени проверяться другими игроками - вряд ли игрок применит чит только один раз, а потом не будет.
Важные действия типа генерации выпадающего шмота или денежных операций, где единичный чит уже может дать большое преимущество, будут перепроверяться бОльшим количеством игроков пропорционально их важности или вообще рассчитываться на сервере.
Кто кого проверяет, определяется рандомом (или сервером). Кроме того, можно добавить возможность игроку целенаправленно проверять кого-нибудь (Например, чтобы удостовериться, что противник не читер).
Главный сервер всё ещё нужен, но нагрузка на него будет на порядки меньше.
P.S. Написанное выше - только моя идея с целью показать возможность существования p2p игры, защищенной от нечестных действий игрока (но не от ботов). Возможно, я допустил какие-то ошибки или переусложнил некоторые моменты.
P.P.S. "Любой человек может придумать такую умную систему безопасности, что он не может представить себе способ взломать эту систему."
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|