engineeringfairnessmultiplayer
Autoritate la server înseamnă că serverul păstrează singura copie a partidei care contează. Dispozitivul tău trimite mutarea pe care vrei să o joci, serverul o verifică față de propriile zaruri și propriile reguli, și abia atunci tabla se schimbă. O aplicație modificată poate pretinde orice: adevărul locuiește undeva unde ea nu poate ajunge.
Tablele merită această rigoare. E un joc de zaruri cu o scară și un pot, ceea ce înseamnă că sunt două feluri de a trișa: să falsifici mutările sau să îndoi aruncările. Un server corect trebuie să închidă ambele uși. A doua ușă ne include și pe noi, și vom ajunge și acolo.
Ce înseamnă de fapt autoritate la server?
Fiecare meci Orion în desfășurare există într-un singur loc: pe serverul nostru. Tabla de pe telefonul tău e o fereastră, nu partida. Când tragi o piesă, aplicația nu o mută. Trimite un mesaj scurt care spune: iată ce vreau să joc. Serverul reia acea intenție pe propria tablă, cu propriul motor de reguli, folosind zarurile pe care le-a aruncat pentru tura aceea. Mutările legale duc partida înainte, iar ambii jucători primesc aceeași poziție nouă. Mutările ilegale nu s-au întâmplat niciodată.
Acesta e un singur server pentru toți. Aplicația iOS e SwiftUI nativ, cea de Android e Jetpack Compose nativ, iar amândouă sunt ferestre către același backend și același grup de jucători. Sticlă diferită, același adevăr.
De ce sunt înșelate jocurile care se încred în client?
Pentru că dispozitivul adversarului îi aparține adversarului. Orice rulează pe el poate fi schimbat. Un client modificat poate trimite mutări care nu au fost niciodată legale. Un editor de memorie poate rescrie un număr pe loc, iar ecranul va afișa minciuna cu toată fidelitatea. Nimic din toate acestea nu e exotic. Uneltele sunt gratuite, documentate și mai vechi decât telefoanele inteligente.
Un joc care se încrede în client cere fiecărui jucător să promită că nu se uită sub capotă. Unii se vor uita. Așa că am făcut opinia clientului irelevantă. În Orion aplicația are exact trei sarcini:
- Să deseneze: tabla, piesele, cubul, cronometrul.
- Să ceară: să ceară serverului să joace o mutare, să ofere dublarea, să abandoneze.
- Să primească: să afișeze poziția pe care serverul o declară reală.
Aruncarea zarurilor, judecarea legalității și mutarea fie și a unei singure fise nu sunt pe acea listă. Nimic din ce decide un rezultat nu se naște pe un dispozitiv.
Ce se întâmplă când joc o mutare?
Tu joci.. Aplicația ta trimite intenția: piesa asta, punctele astea. Nimic de pe dispozitivul tău nu modifică tabla adevărată.
Serverul o reia.. Motorul nostru de reguli rulează mutarea față de tabla serverului și zarurile serverului. Dacă e legală, partida avansează. Dacă nu, e refuzată la sursă, indiferent ce aplicație a trimis-o.
Ambele părți primesc același adevăr.. Poziția nouă merge la ambii jucători. Dacă îți cade conexiunea, răgazul de reconectare al cronometrului îți ține locul, iar tu revii la tabla așa cum este ea de fapt, nu așa cum și-o amintea ultima dată telefonul tău.
Mizele urmează aceeași regulă. Când începe un meci cu taxă de intrare, serverul reține ambele mize. Potul trăiește într-un singur registru, pe server, și se decontează tot acolo când partida se termină. Niciunui client nu i se cere vreodată să raporteze cât crede că a câștigat. Monedele și nestematele sunt virtuale, fără valoare în lumea reală și fără retragere, și totuși ținem registrul acela ca și cum ar păstra ceva prețios, pentru că așa e: încrederea ta în scor.
Ce împiedică serverul însuși să trișeze?
Aceasta e întrebarea potrivită, iar majoritatea jocurilor speră că nu o vei pune niciodată. Un server care aruncă zarurile pe ascuns le-ar putea arunca binevoitor pentru cel pe care îl favorizează, iar tu nu ai vedea niciodată. Fiecare aruncare pare plauzibilă. Așa sunt zarurile.
Așa că ne-am luat singuri puterea aceea. Înainte să înceapă o partidă, serverul generează o sămânță secretă și publică un angajament SHA-256 asupra ei. Fiecare aruncare e apoi derivată din acea sămânță cu HMAC-SHA256, una câte una, în ordine. Când partida se termină, serverul dezvăluie sămânța. Oricine poate verifica dacă sămânța se potrivește cu angajamentul făcut înainte de prima aruncare și dacă fiecare aruncare a partidei decurge din ea. În sens criptografic, zarurile tale erau fixate înainte ca vreunul dintre jucători să atingă o piesă. Nu am putea îndoi aruncarea a douăsprezecea fără să rupem promisiunea publicată la aruncarea zero.
Nu trebuie să ne crezi pe cuvânt în niciuna dintre aceste privințe. Verificatorul de la orion.arthea.ai/verify recalculează întregul lanț în browserul tău, cu Web Crypto, pe mașina ta, din înregistrarea publică a partidei. Fără cont, fără instalare. Ușa de la orion.arthea.ai/go poartă legăturile către App Store și Google Play și arată mereu ce este disponibil chiar acum.