News

Uczciwy serwer nie ufa nikomu, nam też nie

Co znaczy autorytet po stronie serwera: serwer trzyma planszę, weryfikuje każdy ruch u źródła, a kości commit-reveal trzymają w ryzach nawet dom.

engineeringfairnessmultiplayer

Autorytet po stronie serwera znaczy, że serwer trzyma jedyną kopię partii, która się liczy. Twoje urządzenie wysyła ruch, który chcesz zagrać, serwer sprawdza go wobec własnych kości i własnych zasad, i dopiero wtedy plansza się zmienia. Zmodyfikowana aplikacja może twierdzić, co chce: prawda mieszka tam, gdzie nie sięgnie.

Tryktrak zasługuje na tę dyscyplinę. To gra w kości z drabinką i pulą, co znaczy, że oszukiwać można na dwa sposoby: fałszować ruchy albo naginać rzuty. Uczciwy serwer musi zamknąć obie furtki. Druga obejmuje nas, i do tego dojdziemy.

Co właściwie znaczy autorytet po stronie serwera?

Każdy trwający mecz Oriona istnieje w dokładnie jednym miejscu: na naszym serwerze. Plansza w twoim telefonie to okno, nie partia. Gdy przeciągasz pionek, aplikacja go nie przesuwa. Wysyła krótką wiadomość: oto co chcę zagrać. Serwer odtwarza ten zamiar na własnej planszy, własnym silnikiem zasad, używając kości, które sam rzucił na tę turę. Legalne ruchy posuwają partię, a obaj gracze dostają tę samą nową pozycję. Nielegalne ruchy nigdy się nie wydarzyły.

To jeden serwer dla wszystkich. Aplikacja na iOS to natywne SwiftUI, na Androida natywne Jetpack Compose, a obie są oknami na to samo zaplecze i tę samą pulę graczy. Inne szkło, ta sama prawda.

Dlaczego gry ufające klientowi bywają oszukiwane?

Bo urządzenie twojego przeciwnika należy do twojego przeciwnika. Wszystko, co na nim działa, da się zmienić. Załatany klient może wysyłać ruchy, które nigdy nie były legalne. Edytor pamięci może przepisać liczbę na miejscu, a ekran wiernie wyświetli kłamstwo. Nic z tego nie jest egzotyczne. Narzędzia są darmowe, udokumentowane i starsze od smartfonów.

Gra ufająca klientowi prosi każdego gracza o obietnicę, że nie zajrzy pod maskę. Ktoś zajrzy. Uczyniliśmy więc opinię klienta nieistotną. W Orionie aplikacja ma dokładnie trzy zadania:

  • Rysować: planszę, pionki, kostkę, zegar.
  • Prosić: poprosić serwer o zagranie ruchu, zaproponować podwojenie, poddać się.
  • Odbierać: wyświetlić tę pozycję, którą serwer nazywa prawdziwą.

Rzucania kośćmi, oceniania legalności i przesuwania choćby jednej monety nie ma na tej liście. Nic, co rozstrzyga wynik, nie rodzi się na urządzeniu.

Co się dzieje, gdy zagram ruch?

Ty grasz.. Twoja aplikacja wysyła zamiar: ten pionek, te punkty. Nic na twoim urządzeniu nie zmienia prawdziwej planszy.

Serwer go odtwarza.. Nasz silnik zasad przepuszcza ruch przez planszę serwera i kości serwera. Jeśli jest legalny, partia idzie dalej. Jeśli nie, zostaje odrzucony u źródła, niezależnie od tego, która aplikacja go wysłała.

Obie strony dostają tę samą prawdę.. Nowa pozycja idzie do obu graczy. Jeśli połączenie padnie, karencja ponownego połączenia w zegarze trzyma twoje miejsce, a ty wracasz do planszy takiej, jaka naprawdę jest, a nie takiej, jaką ostatnio zapamiętał twój telefon.

Stawki podlegają tej samej zasadzie. Gdy zaczyna się mecz z wpisowym, serwer zatrzymuje obie stawki. Pula żyje w jednej księdze, na serwerze, i tam się rozlicza, gdy partia się kończy. Żadnego klienta nigdy nie pyta się, ile jego zdaniem wygrał. Monety i klejnoty są wirtualne, bez wartości w świecie rzeczywistym i bez wypłaty, a mimo to prowadzimy tę księgę tak, jakby trzymała coś cennego, bo trzyma: twoje zaufanie do wyniku.

Co powstrzymuje sam serwer przed oszukiwaniem?

To właściwe pytanie, a większość gier ma nadzieję, że nigdy go nie zadasz. Serwer rzucający kośćmi po cichu mógłby rzucać łaskawie dla tego, kogo faworyzuje, a ty nigdy byś tego nie zobaczył. Każdy rzut wygląda wiarygodnie. Takie są kości.

Odebraliśmy więc tę władzę sami sobie. Zanim partia się zacznie, serwer generuje tajne ziarno i publikuje na nie zobowiązanie SHA-256. Każdy rzut jest potem wyprowadzany z tego ziarna przez HMAC-SHA256, po kolei, jeden po drugim. Gdy partia się kończy, serwer ujawnia ziarno. Każdy może sprawdzić, że ziarno zgadza się ze zobowiązaniem złożonym przed pierwszym rzutem i że każdy rzut partii z niego wynika. W sensie kryptograficznym twoje kości były ustalone, zanim któryś z graczy dotknął pionka. Nie moglibyśmy nagiąć rzutu dwunastego, nie łamiąc obietnicy opublikowanej przy rzucie zerowym.

Nie musisz wierzyć nam na słowo w żadnej z tych rzeczy. Weryfikator pod orion.arthea.ai/verify przelicza cały łańcuch w twojej przeglądarce, przy użyciu Web Crypto, na twojej maszynie, z publicznego zapisu partii. Bez konta, bez instalacji. Drzwi pod orion.arthea.ai/go niosą odnośniki do App Store i Google Play i zawsze pokazują, co jest dostępne w tej chwili.