В игре, написанной на стороне клиента (js), но в которой есть многопользовательские элементы, такие как таблица лидеров. Как лучше всего записывать действия пользователей в журнал транзакций с отметками времени для проверки целостности отправленных данных и как вы проверяете действия в этом журнале?
Нужно ли вообще это делать, или будет достаточно написать хеш-функцию, которая отправляет оценки на сервер и обфускации кода, когда дело доходит до такого рода предотвращения читерства?
edit - описание игры:
В этой игре вы ходите по карте длиной 50 плиток. На каждой плитке вы можете встретить врагов / города / события (найти монету и т. д.). Каждый раз, когда вы достигаете конца карты, загружается новая карта с немного более высокой сложностью. Эта сложность сохраняется (с использованием PHP на базе данных MYSQL) вместе с игроком и его предметами, которые покупаются в городах. У предметов есть сила int в зависимости от их характеристик (урон / здоровье / защита и т. д.). Сила предметов суммируется и также сохраняется.
Мощность, уровень (сложность) и имя пользователя - это то, что отображается в таблице лидеров для 10 лучших игроков, отсортированных по наивысшей мощности.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В общем, не существует эффективного способа предотвратить читерство на стороне клиента. Что касается списков лидеров и пользователей, публикующих свои оценки, единственный способ предотвратить мошенничество - это обработать данные на сервере или, по крайней мере, попытаться проверить их там.
Хеширование данных перед отправкой на сервер не поможет, потому что кто-то может легко изменить данные непосредственно перед хешированием.
Журнал транзакций не поможет, потому что кто-то может легко изменить данные непосредственно перед их отправкой в журнал транзакций или даже отключить ведение журнала.
Обфускация - это в основном безопасность через безвестность, что затруднит взлом вашего кода, но определенно не сделает его безопасным для читерства.
И снова, вы никогда не можете доверять никаким данным, которые поступают от клиента, поэтому вам понадобится серверная часть, чтобы либо контролировать весь игровой процесс, либо проверять данные.
Этот ответ применим к любой многопользовательской игре, но некоторые подробности о вашей игре, вероятно, помогут улучшить этот ответ.
Отредактирую исходный вопрос с описанием игры.
@Levi согласно вашему обновлению, похоже, что вы почти все делаете на бэкэнде. Почему бы вам не внедрить табло и в бэкэнд? У вас есть все необходимые данные в вашей базе данных.
Вся бизнес-логика происходит на стороне клиента, функциональность, о которой я говорю в редактировании, в основном просто отправляет объект игрока в базу данных в виде json.stringified, который содержит все необходимое для результатов в таблице лидеров, возможно, я не достаточно ясно понимал это. Это определенно не в основном серверная часть, строка отправляется обратно клиенту. Затем клиент преобразует строковый объект в новый объект игрока с этими значениями в качестве способа загрузки персонажа.
Не могли бы вы дать немного больше контекста, возможно, фрагмент кода того, чего вы пытаетесь достичь, потому что это немного расплывчато ... Какие действия вы пытаетесь проверить? Движение, счет, в чем смысл вашей игры?