Я работал над архитектурой P2P для безопасных игр и разделил проблему на пять подзадач:
- Незаконное изменение состояния отправленной игры
- Точно сбрасывать читеров
- Согласие на игровое состояние
- Избегать читов "смотреть в будущее"
- Сокрытие конфиденциальной информации от противников
Первые четыре я почти все решил, но это последний, с которым у меня проблемы.
Прежде чем я углублюсь в детали, я просто хочу спросить, пропустил ли я что-нибудь в моем списке создания "чит-защищенной" p2p-сети. Меня не интересуют читы, такие как использование прицельных роботов, я заинтересован только в том, чтобы сделать сеть p2p такой же безопасной, как централизованный сервер.
Поэтому в моих усилиях по сокрытию секретной информации я сосредоточился на положении игроков в игре, где позиция вашего противника не всегда должна быть известна. Тогда возникает проблема, как определить, следует ли отправлять свою позицию противнику, не зная позиции своего противника.
Я исключил такие методы, как оппонент, отправляющий несколько ложных позиций, чтобы вы тоже могли сравнить свои, поскольку ваш оппонент может легко злоупотребить такой системой, поскольку он получит вашу позицию, если одна из ложных позиций окажется «видимой» с вашей позиции.
Метод, на котором я сфокусировался, заключается в том, что вы получаете «поле зрения» от своего оппонента и можете таким образом определить, следует ли вам отправлять свою позицию или нет. Это, однако, проблема в таких играх, как League of Legends, где поле зрения вашего оппонента также содержит очень конфиденциальную информацию. Я попытался решить эту проблему путем преобразования поля зрения с помощью особой матрицы, означающей, что вы не можете перейти от преобразованной версии поля зрения к исходной версии, но, поскольку это линейное преобразование, вы все равно можете выяснить, находится ли ваша позиция внутри поле зрения или нет.
Это, однако, не работает идеально, точное поле зрения не может быть восстановлено после преобразования, но информация о «уклонах» в поле зрения (поле зрения состоит из нескольких линий, и можно определить наклон каждой линии) восстановлен, и это может быть использовано для сравнительно недорогой реконструкции исходного поля зрения.
По сути, мне нужна функция, которая может определить, является ли позиция «видимой» или нет, и реконструкция этой функции / поля зрения должна быть настолько вычислительно сложной, что после того, как вы закончите реконструкцию поля зрения, она больше не актуальна для игра в действии. Есть ли какой-нибудь супер умный человек, который знает о таком методе?
редактировать Люди, кажется, запутались во всем «поле зрения», поэтому я собираюсь дать более подробное объяснение здесь. Поле зрения состоит из групп из набора линий, вы можете легко проверить, находится ли позиция внутри одной из этих групп, просто проверив, с какой стороны линии находится ваша позиция, если она находится на одной стороне для всех линий в этой группе, которую вы знаете это внутри этой группы и, следовательно, внутри поля зрения.
Однако отправляемая информация - это не эта строка, а преобразование линии и преобразование (2 на 2 в единственной матрице), вы все равно можете проверить, на какой стороне линии находится ваша позиция, сначала преобразовав ее, используя полученное преобразование. и сравнивая это значение с преобразованной линией. Ключевым моментом здесь является то, что преобразование является единичным, то есть невозможно найти обратное, чтобы вернуться к исходной строке. Однако можно определить наклон линии, которая делает реконструкцию линии, просто проверив, на какой стороне преобразованной линии лежит много точек, пока вы не определили начало линии значительно вычислительно дешевле, чем если бы вы не знали наклон линии.
То, что я ищу, - это метод определения, находится ли точка внутри области, где восстановление области по методу либо невозможно (что, я сомневаюсь, существует, так как вы всегда можете использовать ее методом грубой силы), либо очень сложное в вычислительном отношении.