News

公平的伺服器誰都不信,包括我們自己

伺服器權威的意思:棋盤由伺服器保管,每一步都在源頭驗證,而承諾揭露的骰子連莊家自己都管住。

engineeringfairnessmultiplayer

伺服器權威的意思是,唯一算數的那份棋局副本由伺服器保管。你的裝置送出你想走的那一步,伺服器拿它去對自己的骰子和自己的規則檢驗,然後棋盤才會改變。被改過的應用程式可以宣稱任何事:真相住在它搆不到的地方。

雙陸棋值得這樣的嚴格。它是一款有天梯、有彩池的骰子遊戲,也就是說作弊有兩條路:偽造走法,或扭曲點數。公平的伺服器必須把兩扇門都關上。第二扇門包含我們自己,這一點稍後就講。

伺服器權威到底是什麼意思?

每一盤進行中的 Orion 棋局只存在於一個地方:我們的伺服器上。你手機上的棋盤是一扇窗,不是棋局。你拖動一顆棋子時,應用程式並沒有移動它。它送出一則簡短的訊息說:這是我想走的。伺服器在自己的棋盤上、用自己的規則引擎、用它為那一輪擲出的骰子,重演這個意圖。合法的走法把棋局往前推,兩位玩家拿到同一個新局面。不合法的走法從來沒有發生過。

這是一台伺服器服務所有人。iOS 版是原生 SwiftUI,Android 版是原生 Jetpack Compose,兩者都是同一個後端、同一群玩家的窗。玻璃不同,真相相同。

為什麼信任用戶端的遊戲會被作弊?

因為你對手的裝置屬於你的對手。裝置上跑的一切都能被改。打過補丁的用戶端可以送出從來不合法的走法。記憶體編輯器可以就地改寫一個數字,而螢幕會忠實地把那個謊顯示出來。這些一點都不稀奇。工具是免費的、有文件的,而且比智慧型手機還老。

信任用戶端的遊戲,等於要求每位玩家保證不掀開引擎蓋。有些人會掀。所以我們讓用戶端的意見變得無關緊要。在 Orion,應用程式只有三件工作:

  • 畫:棋盤、棋子、加倍方塊、計時器。
  • 求:請伺服器走一步、提出加倍、認輸。
  • 收:顯示伺服器認定為真的那個局面。

擲骰、判定合法性、以及移動哪怕一枚金幣,都不在那張清單上。任何會決定結果的事,都不會誕生在裝置上。

我走一步的時候發生了什麼?

你走。. 你的應用程式送出意圖:這顆棋子,這些點位。你裝置上的任何東西都不會改變真正的棋盤。

伺服器重演。. 我們的規則引擎拿這一步去跑伺服器的棋盤與伺服器的骰子。合法就往前走。不合法就在源頭被拒絕,不管它是哪一個應用程式送來的。

雙方拿到同一份真相。. 新局面同時送給兩位玩家。如果你斷線,回合計時器的重連寬限期會替你保住位子,而你回來時看到的棋盤是它真正的樣子,不是你手機最後記得的樣子。

賭注也照同一條規則。有入場費的棋局開始時,伺服器把雙方的入場費都託管起來。彩池活在一本帳裡,在伺服器上,棋局結束時也在那裡結清。從來沒有任何用戶端被問過它認為自己贏了多少。金幣和寶石是虛擬的,在現實世界沒有價值也不能兌現,但我們照樣把那本帳當成裡面裝著貴重物品來管,因為它確實裝著:你對局面的信任。

那又是什麼在阻止伺服器自己作弊?

這才是該問的問題,而多數遊戲希望你永遠不要問。一台祕密擲骰的伺服器,可以替它偏袒的那一方擲得溫柔一點,而你永遠看不出來。每一擲看起來都合情合理。骰子就是這樣。

所以我們把那份權力從自己手上拿走。一盤棋開始之前,伺服器產生一個祕密種子,並公布它的 SHA-256 承諾。接著每一擲都用 HMAC-SHA256 從那個種子推導出來,一次一擲,依序進行。棋局結束時,伺服器揭露種子。任何人都能查證:種子和第一擲之前給出的承諾相符,而且棋局中的每一擲都由它推導而來。就密碼學的意義而言,你的骰子在兩位玩家誰都還沒碰到棋子之前就已定死。我們不可能在不打破第零擲時公布的那個承諾的情況下,去扭曲第十二擲。

以上這些你都不必聽我們一面之詞。orion.arthea.ai/verify 的驗證會用 Web Crypto,在你的瀏覽器裡、在你的機器上,依據棋局的公開紀錄重算整條鏈。不必註冊,不必安裝。orion.arthea.ai/go 的門口帶著 App Store 與 Google Play 的連結,並且永遠顯示此刻實際能取得什麼。