News

En rettferdig server stoler ikke på noen, heller ikke på oss

Hva serverautoritet betyr: serveren holder brettet, validerer hvert trekk ved kilden, og commit-reveal-terninger holder selv huset ærlig.

engineeringfairnessmultiplayer

Serverautoritet betyr at serveren holder den eneste kopien av partiet som teller. Enheten din sender trekket du vil spille, serveren prøver det mot sine egne terninger og sine egne regler, og først da endrer brettet seg. En modifisert app kan påstå hva som helst: sannheten bor et sted den ikke når.

Backgammon fortjener den strengheten. Det er et terningspill med en stige og en pott, og det betyr at det finnes to måter å jukse på: å forfalske trekkene eller å bøye kastene. En rettferdig server må lukke begge dørene. Den andre døren omfatter oss, og dit kommer vi.

Hva betyr serverautoritet egentlig?

Hvert pågående Orion-parti finnes ett sted: på serveren vår. Brettet på telefonen din er et vindu, ikke partiet. Når du drar en brikke, flytter ikke appen den. Den sender en kort melding som sier: dette vil jeg spille. Serveren spiller av den hensikten på sitt eget brett, med sin egen regelmotor, med terningene den slo for den turen. Lovlige trekk fører partiet videre, og begge spillere får den samme nye stillingen. Ulovlige trekk skjedde aldri.

Det er én server for alle. iOS-appen er native SwiftUI, Android-appen er native Jetpack Compose, og begge er vinduer mot den samme backenden og den samme spillerskaren. Annet glass, samme sannhet.

Hvorfor blir spill som stoler på klienten, jukset på?

Fordi motstanderens enhet tilhører motstanderen. Alt som kjører på den, kan endres. En lappet klient kan sende trekk som aldri var lovlige. En minneeditor kan skrive om et tall på stedet, og skjermen viser løgnen trofast. Ingenting av dette er eksotisk. Verktøyene er gratis, dokumenterte og eldre enn smarttelefoner.

Et spill som stoler på klienten, ber hver spiller om å love å ikke se under panseret. Noen ser. Så vi gjorde klientens mening likegyldig. I Orion har appen nøyaktig tre oppgaver:

  • Tegne: brettet, brikkene, kuben, klokken.
  • Be: be serveren om å spille et trekk, tilby dobling, gi opp.
  • Motta: vise stillingen serveren kaller virkelig.

Å kaste terninger, å bedømme lovlighet og å flytte så mye som én mynt står ikke på den listen. Ingenting som avgjør et utfall, oppstår på en enhet.

Hva skjer når jeg spiller et trekk?

Du spiller.. Appen din sender hensikten: denne brikken, disse punktene. Ingenting på enheten din endrer det virkelige brettet.

Serveren spiller det av.. Regelmotoren vår kjører trekket mot serverens brett og serverens terninger. Er det lovlig, går partiet videre. Er det ikke det, avvises det ved kilden, uansett hvilken app som sendte det.

Begge sider får den samme sannheten.. Den nye stillingen går ut til begge spillere. Faller forbindelsen din, holder turklokkens gjenoppkoblingsfrist plassen din, og du kommer tilbake til brettet slik det faktisk er, ikke slik telefonen din sist husket det.

Innsatser følger samme regel. Når et parti med innskudd begynner, holder serveren begge innskuddene i depot. Potten lever i én hovedbok, på serveren, og gjøres opp der når partiet er slutt. Ingen klient blir noen gang spurt om hvor mye den tror den har vunnet. Mynter og edelstener er virtuelle, uten verdi i den virkelige verden og uten utbetaling, og likevel fører vi den hovedboken som om den rommet noe kostbart, for det gjør den: din tillit til stillingen.

Hva hindrer serveren selv i å jukse?

Det er det riktige spørsmålet, og de fleste spill håper du aldri stiller det. En server som kaster terninger i hemmelighet, kunne kaste snilt for den den favoriserer, og du ville aldri se det. Hvert kast ser plausibelt ut. Slik er terninger.

Så vi tok den makten fra oss selv. Før et parti begynner, lager serveren et hemmelig frø og publiserer en SHA-256-forpliktelse på det. Hvert kast utledes deretter av det frøet med HMAC-SHA256, ett om gangen, i rekkefølge. Når partiet er slutt, avslører serveren frøet. Hvem som helst kan sjekke at frøet stemmer med forpliktelsen som ble gitt før første kast, og at hvert kast i partiet følger av det. I kryptografisk forstand lå terningene dine fast før noen av spillerne rørte en brikke. Vi kunne ikke bøye kast tolv uten å bryte løftet vi publiserte ved kast null.

Du trenger ikke ta vårt ord for noe av dette. Verifiseringen på orion.arthea.ai/verify regner om hele kjeden i nettleseren din, med Web Crypto, på din maskin, ut fra partiets offentlige protokoll. Ingen konto, ingen installasjon. Døren på orion.arthea.ai/go bærer lenkene til App Store og Google Play og viser alltid hva som er tilgjengelig akkurat nå.