News

En fair server stoler ikke på nogen, heller ikke på os

Hvad serverautoritet betyder: serveren holder brættet, validerer hvert træk ved kilden, og commit-reveal-terninger holder selv huset ærligt.

engineeringfairnessmultiplayer

Serverautoritet betyder, at serveren holder den eneste kopi af partiet, der tæller. Din enhed sender det træk, du vil spille, serveren prøver det mod sine egne terninger og sine egne regler, og først derefter ændrer brættet sig. En modificeret app kan påstå hvad som helst: sandheden bor et sted, den ikke når.

Backgammon fortjener den stramhed. Det er et terningspil med en stige og en pulje, hvilket betyder, at der er to måder at snyde på: at forfalske trækkene eller at bøje kastene. En fair server skal lukke begge døre. Den anden dør omfatter os, og dertil kommer vi.

Hvad betyder serverautoritet egentlig?

Hvert igangværende Orion-parti findes ét sted: på vores server. Brættet på din telefon er et vindue, ikke partiet. Når du trækker en brik, flytter appen den ikke. Den sender en kort besked, der siger: det her vil jeg spille. Serveren afspiller den hensigt på sit eget bræt, med sin egen regelmotor, med de terninger den slog for den tur. Lovlige træk fører partiet videre, og begge spillere får den samme nye stilling. Ulovlige træk skete aldrig.

Det er én server for alle. iOS-appen er native SwiftUI, Android-appen er native Jetpack Compose, og begge er vinduer til den samme backend og den samme spillerskare. Andet glas, samme sandhed.

Hvorfor bliver spil, der stoler på klienten, snydt?

Fordi din modstanders enhed tilhører din modstander. Alt, hvad der kører på den, kan ændres. En patchet klient kan sende træk, der aldrig var lovlige. En hukommelseseditor kan omskrive et tal på stedet, og skærmen viser løgnen trofast. Intet af det er eksotisk. Værktøjerne er gratis, dokumenterede og ældre end smartphones.

Et spil, der stoler på klienten, beder hver spiller om at love ikke at kigge under motorhjelmen. Nogle kigger. Så vi gjorde klientens mening ligegyldig. I Orion har appen præcis tre opgaver:

  • Tegne: brættet, brikkerne, kuben, uret.
  • Bede: bede serveren om at spille et træk, tilbyde dobling, opgive.
  • Modtage: vise den stilling, serveren kalder virkelig.

At kaste terninger, at bedømme lovlighed og at flytte så meget som én mønt står ikke på den liste. Intet, der afgør et udfald, opstår på en enhed.

Hvad sker der, når jeg spiller et træk?

Du spiller.. Din app sender hensigten: denne brik, disse punkter. Intet på din enhed ændrer det rigtige bræt.

Serveren afspiller det.. Vores regelmotor kører trækket mod serverens bræt og serverens terninger. Er det lovligt, går partiet videre. Er det ikke, afvises det ved kilden, uanset hvilken app der sendte det.

Begge sider får den samme sandhed.. Den nye stilling går ud til begge spillere. Falder din forbindelse, holder turtimerens genforbindelsesfrist din plads, og du vender tilbage til brættet, som det faktisk er, ikke som din telefon sidst huskede det.

Indsatser følger samme regel. Når et parti med indskud begynder, holder serveren begge indskud i depot. Puljen lever i én hovedbog, på serveren, og gøres op der, når partiet slutter. Ingen klient bliver nogensinde spurgt, hvor meget den tror, den har vundet. Mønter og ædelsten er virtuelle, uden værdi i den virkelige verden og uden udbetaling, og alligevel fører vi den hovedbog, som om den rummede noget kostbart, for det gør den: din tillid til stillingen.

Hvad forhindrer serveren selv i at snyde?

Det er det rigtige spørgsmål, og de fleste spil håber, du aldrig stiller det. En server, der kaster terninger i hemmelighed, kunne kaste venligt for den, den favoriserer, og du ville aldrig se det. Hvert kast ser plausibelt ud. Sådan er terninger.

Så vi tog den magt fra os selv. Før et parti begynder, genererer serveren et hemmeligt frø og offentliggør et SHA-256-tilsagn på det. Hvert kast udledes derefter af det frø med HMAC-SHA256, ét ad gangen, i rækkefølge. Når partiet slutter, afslører serveren frøet. Enhver kan tjekke, at frøet stemmer med tilsagnet afgivet før første kast, og at hvert kast i partiet følger af det. I kryptografisk forstand lå dine terninger fast, før nogen af spillerne rørte en brik. Vi kunne ikke bøje kast tolv uden at bryde det løfte, vi offentliggjorde ved kast nul.

Du behøver ikke tage vores ord for noget af dette. Verifikationen på orion.arthea.ai/verify genberegner hele kæden i din browser, med Web Crypto, på din maskine, ud fra partiets offentlige protokol. Ingen konto, ingen installation. Døren på orion.arthea.ai/go bærer links til App Store og Google Play og viser altid, hvad der er tilgængeligt lige nu.