Repository navigation
feat(anticheat): агрегация античит-событий по аккаунтам + автобан (итер. 40) - #44
Merged
Merged
Conversation
…ер. 40) Поверх античит-метрик итер. 25: событие теперь привязывается к аккаунту, копится в БД и при пороге ведёт к автобану (связка с модерацией итер. 39). Автобан по умолчанию ВЫКЛЮЧЕН (rewind_stale может быть высоким пингом, не читом). - game: tryFire привязывает клампнутое событие к Player.AccountID в транзиентный World.acEvents (вне Checksum/реплея, как счётчики ac; гости AccountID 0 не пишутся); комната сливает DrainAntiCheatEvents и шлёт PersistAntiCheat через тот же неблокирующий sendPersist. Провод/симуляция/Checksum не тронуты. - store: миграция 0005 anticheat_stats(account_id,kind,count); AddAntiCheat (апсерт- инкремент + возврат суммы аккаунта), AntiCheatByAccount, TopAntiCheat. - persist: recordAntiCheat копит; при cfg.AntiCheatBanThreshold>0 и превышении — autoBan (если ещё не забанен) с отзывом сессий; CreatedBy 0 (система). - api: GET /api/mod/anticheat (moderator+) — топ по флагам. - cmd/server: env ARENA_ANTICHEAT_BAN_THRESHOLD (0=выкл) / ARENA_ANTICHEAT_BAN_DURATION. - docs: README RU/EN + architecture. Аудит (по коду, паттерн ac из итер. 25 уже одобрен стражами): determinism — acEvents вне Checksum/реплея (регресс-тест TestAntiCheatEventsNotInChecksum), AccountID только для не-Checksum записи; concurrency — новых горутин/каналов нет, всё на горутине комнаты/ persister, -race зелёный; protocol — провод не тронут. security-review — findings нет (kind — фикс. enum, клиент накручивает лишь свой счётчик). Tick 0 allocs/op, без регресса. Покрытие: game (атрибуция/гость/Checksum/эмит), store, persist (накопление+автобан+порог), api (эндпоинт под ролью). make check + integration зелёные.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что
Итерация 40 — античит-бэкенд: события из итер. 25 привязываются к аккаунту, копятся
в БД и при пороге ведут к автобану (связка с модерацией итер. 39). Автобан по умолчанию
выключен.
Зачем
Метрики итер. 25 были глобальными по виду (per-room). Чтобы разбирать конкретных
игроков и реагировать (флаг/автобан), сигнал нужно копить по аккаунту.
Как
tryFireпривязывает клампнутое античит-событие кPlayer.AccountIDвтранзиентный
World.acEvents(вне Checksum/реплея, как счётчикиacитер. 25; гостиAccountID 0не пишутся; в реплее AccountID=0 → no-op). Комната сливаетDrainAntiCheatEventsи шлётPersistAntiCheatчерез тот же неблокирующийsendPersist. Провод/симуляция/Checksum НЕ тронуты.0005anticheat_stats(account_id,kind,count);AddAntiCheat(апсерт-инкремент + возврат суммы по аккаунту),
AntiCheatByAccount,TopAntiCheat.recordAntiCheatкопит; приConfig.AntiCheatBanThreshold>0ипревышении суммы —
autoBan(если ещё не забанен) с отзывом сессий;CreatedBy 0(система). Порог 0 (дефолт) — только накопление, без бана.
GET /api/mod/anticheat(moderator+) — топ по флагам.ARENA_ANTICHEAT_BAN_THRESHOLD(0=выкл) /ARENA_ANTICHEAT_BAN_DURATION.docs/architecture.md.Границы и аудит
Первое game-касание за сессию — аудит по коду (изменение маленькое, повторяет уже
одобренный стражами паттерн
acитер. 25):acEventsтранзиентно, вне Checksum (регресс-тестTestAntiCheatEventsNotInChecksum) и вне лога реплея;AccountIDчитается только дляне-Checksum записи; обхода map в Step нет; determinism-сьюта зелёная.
acEvents/drain на горутине комнаты (какac); persist через существующий неблокирующийsendPersist; persister — существующаягорутина;
-raceзелёный (вкл.TestRoomPersistsAntiCheat).internal/protocol/web/game.jsне менялись.kind— фикс. enum, не ввод; клиент накручивает лишьсвой счётчик → само-бан, чужой аккаунт подставить нельзя; автобан системный, под порогом).
Клиент не трогал — автобан всплывает через баннер бана итер. 39.
Тестирование
make check+make integration— зелёные.Tick/50ent0 allocs,Tick/200ent0 allocs,CombatTick0 allocs — без регресса.store (апсерт/сумма/топ; Postgres-сьют дополнен
anticheat_stats), persist (накопление,автобан+отзыв сессий, порог/ниже-порога), api (
/api/mod/anticheatпод ролью).BENCHMARKS.md не трогал — горячий путь без изменений (0 allocs подтверждён).