engineeringfairnessmultiplayer
服务器权威的意思是,唯一算数的那份棋局副本由服务器保管。你的设备把你想走的那步棋发过去,服务器拿它对照自己的骰子和自己的规则,之后棋盘才会改变。被改过的应用可以宣称任何事:真相住在它够不着的地方。
双陆棋配得上这份严格。它是一款带阶梯和彩池的骰子游戏,这意味着作弊有两条路:伪造着法,或者掰弯点数。公平的服务器必须把两扇门都关上。第二扇门里也有我们,这一点我们马上就讲。
服务器权威究竟是什么意思
每一局进行中的 Orion 对局都只存在于一个地方:我们的服务器上。你手机上的棋盘是一扇窗,不是棋局。你拖动一枚棋子时,应用并没有移动它。它发出一条短消息,说:这就是我想走的。服务器在自己的棋盘上、用自己的规则引擎、用它为那一轮掷出的骰子,把这个意图重放一遍。合法的着法推进棋局,两位玩家收到同一个新局面。不合法的着法从未发生过。
这是一台服务器服务所有人。iOS 应用是原生 SwiftUI,安卓应用是原生 Jetpack Compose,两者都是通向同一个后端、同一个玩家池的窗口。玻璃不同,真相相同。
信任客户端的游戏为什么会被作弊
因为对手的设备属于对手。上面跑的任何东西都可以被改动。打过补丁的客户端可以发出从来不合法的着法。内存编辑器可以就地改写一个数字,而屏幕会忠实地把这个谎言显示出来。这些都不稀奇。工具是免费的、有文档的,而且比智能手机还老。
一款信任客户端的游戏,等于是在请每位玩家承诺不掀开引擎盖。总会有人掀。所以我们让客户端的意见变得无关紧要。在 Orion 里,应用只有三件事要做:
- 绘制:棋盘、棋子、加倍骰、计时器。
- 请求:请服务器走一步棋、提出加倍、认输。
- 接收:显示服务器说是真实的那个局面。
掷骰子、判定合法性、挪动哪怕一枚筹码,都不在这份清单上。任何能决定结果的东西,都不在设备上诞生。
我走一步棋时会发生什么
你走棋。. 你的应用发出意图:这枚棋子,这些点位。你设备上的任何东西都不会改动真正的棋盘。
服务器重放。. 我们的规则引擎拿这步棋去对服务器的棋盘和服务器的骰子跑一遍。合法就推进棋局。不合法就在源头被拒,不管是哪款应用发来的。
双方拿到同一个真相。. 新局面发给两位玩家。如果你掉线了,回合计时器的重连宽限会替你守住座位,你回来时看到的是棋盘真实的样子,而不是你手机最后记住的样子。
赌注遵循同一条规则。有入场费的对局开始时,服务器把双方的底注托管起来。彩池活在一本账里,在服务器上,棋局结束时也在那里结清。从来没有哪个客户端被问过它认为自己赢了多少。金币和宝石是虚拟的,没有现实价值也不能提现,我们仍然像里面装着贵重之物那样经营那本账,因为里面确实装着:你对比分的信任。
什么在阻止服务器自己作弊
这才是该问的问题,而多数游戏都盼着你永远不要问。一台在暗处掷骰的服务器,可以为它偏袒的一方掷得温柔些,而你永远看不出来。每一掷看上去都合情合理。骰子本来就是这样。
所以我们把这份权力从自己手里拿走了。棋局开始之前,服务器生成一枚秘密种子,并公布对它的 SHA-256 承诺值。此后每一掷都用 HMAC-SHA256 从那枚种子推导,一次一掷,依次进行。棋局结束时,服务器揭示种子。任何人都能核对:这枚种子与第一掷之前立下的承诺值相符,且棋局中的每一掷都由它推出。在密码学的意义上,你的骰子在双方碰到棋子之前就已固定。我们没法在不撕毁第零掷时公布的那个承诺的前提下,去掰弯第十二掷。
这里面没有一条需要你信我们的话。orion.arthea.ai/verify 上的验证页,会用 Web Crypto,在你的机器上、从这局棋的公开记录出发,把整条链重算一遍。无需账号,无需安装。orion.arthea.ai/go 这道门带着 App Store 与 Google Play 的链接,并且永远显示此刻真正可用的东西。