Ho lavorato su un'architettura P2P per giochi sicuri e ho suddiviso il problema in cinque sotto-problemi:
- Modifica illegale dello stato del gioco inviato
- Fai cadere con precisione gli imbroglioni
- Accordarsi su uno stato di gioco
- Evitare i cheat "guardare avanti"
- Nascondere informazioni sensibili dagli avversari
I primi quattro li ho praticamente tutti risolti, ma è l'ultimo con cui ho problemi.
Prima di entrare nei dettagli, voglio solo chiedere se c'è qualcosa che mi è sfuggito nel mio elenco di creare una rete p2p "a prova di imbroglione". Non mi interessano i cheat come usare i aimbot, mi interessa solo rendere la rete p2p sicura come un server centralizzato.
Quindi, nel mio sforzo finora di nascondere informazioni sensibili, mi sono concentrato sulla posizione dei giocatori in una partita in cui la posizione del tuo avversario non dovrebbe essere sempre conosciuta. Il problema diventa quindi come determinare se è necessario inviare la posizione all'avversario senza conoscere la posizione dell'avversario.
Ho escluso metodi come l'avversario che invia più false posizioni per farti confrontare anche le tue poiché il tuo avversario può facilmente abusare di un tale sistema poiché otterrà la tua posizione se una delle false posizioni fosse "visibile" dalla tua posizione.
Il metodo su cui mi sono concentrato su quello in cui ricevi un "campo visivo" dal tuo avversario e posso quindi determinare se devi inviare la tua posizione o meno. Questo è tuttavia un problema in giochi come League of Legends in cui il campo visivo del tuo avversario è anche un'informazione altamente sensibile. Ho cercato di risolverlo trasformando il campo visivo usando una matrice singolare, il che significa che non puoi passare dalla versione trasformata del campo visivo alla versione originale, ma poiché si tratta di una trasformazione lineare puoi ancora capire se la tua posizione è all'interno il campo visivo o no.
Tuttavia, ciò non funziona perfettamente, il campo visivo esatto non può essere ripristinato dopo la trasformazione, ma le informazioni sulle "pendenze" nel campo visivo (il campo visivo è costruito da più linee e può essere determinata la pendenza di ciascuna linea) possono essere ripristinato e può essere utilizzato per ricostruire in modo relativamente economico il campo visivo originale.
In sostanza, ciò di cui ho bisogno è una funzione che può determinare se una posizione è "visibile" o meno, e la ricostruzione di questa funzione / campo visivo deve essere così impegnativa dal punto di vista computazionale che una volta terminata la ricostruzione del campo visivo non è più rilevante per il gioco in azione. C'è qualche persona super intelligente là fuori che capita di conoscere un tale metodo?
Modifica Le persone sembrano un po 'confuse sull'intero "campo visivo", quindi ho l'obiettivo di dare una spiegazione più dettagliata qui. Il campo visivo è costituito da gruppi di una serie di linee, puoi facilmente verificare se una posizione si trova all'interno di uno di questi gruppi semplicemente controllando quale lato della linea è la tua posizione, se è sullo stesso lato per tutte le linee in quel gruppo che conosci è all'interno di quel gruppo e quindi all'interno del campo visivo.
Le informazioni inviate comunque non sono questa linea, ma una trasformazione della linea e della trasformazione (2 per 2 singolarmente una matrice), puoi comunque controllare su quale lato della linea si trova la tua posizione trasformandola prima usando la trasformazione che hai ricevuto e confrontando quel valore con la linea trasformata. La chiave qui è che la trasformazione è singolare, il che significa che è impossibile trovare un inverso per tornare alla linea originale. Tuttavia è possibile determinare la pendenza della linea che rende la ricostruzione della linea semplicemente controllando su quale lato della linea trasformata si trovano molti punti finché non si è individuata l'origine della linea molto più computazionalmente meno che se non si fosse a conoscenza la pendenza della linea.
Quello che sto cercando è un metodo per determinare se un punto si trova all'interno di un'area, dove ricostruire l'area dal metodo è impossibile (che dubito esiste dal momento che si può sempre forzare la forza bruta) o molto computazionalmente pesante.