fairnessprovably fairdice
会。在线骰子是在你看不见的服务器上掷出的,没有任何东西能在物理上阻止运营者在数字抵达你的棋盘之前把它改掉。光看结果,无论朝哪个方向都永远证明不了什么,所以诚实的问题不是做手脚有没有可能,而是一局棋能不能证明它没有发生。
我们做的就是一款双陆棋,所以在这件事上我们并不中立。正因如此,我们想把它答透,包括那些不舒服的部分。
为什么在每个网站骰子都像被做了手脚
因为双陆棋的方差冷酷无情,而人的记忆天生偏心。两颗骰子有三十六种落法;连号不是故障,而是必然,今晚某处会有一台诚实的服务器,对着一个每一步都走对的人连掷四把对子。你记得那记打中你孤子的 5-5。你不记得上周二救了你的那记神来之笔。输棋留下,脱险蒸发,连输三局之后骰子就变成了针对你的事。在真实的棋盘上、真实的茶馆里,它同样变成针对你的事。去问一个推了四十年木质棋子的人。
陷阱就在这里。一局被做了手脚的棋,感觉会一模一样。连号朝哪个方向都证明不了什么,所以如果你的证据是骰子给你的感觉,你分不出诚实的服务器和不诚实的服务器。我们也分不出。这不是在为在线骰子辩护。这正是它的问题所在。
一个网站真的能操纵骰子吗
技术上能,而且并不难。服务器在掷骰之前就看得见整个棋盘。想作弊的运营者可以:
- 只在最关键的时刻,把每一百次里的几次掷骰稍微掰一掰:打中的那一记、进不了场的那一记、把败局翻转的那记对子。
- 人为地让对局保持胶着,好让一场对局拖得更久,让输棋看起来像惜败。
- 悄悄偏袒运营者有利益的一方。
- 做得足够稀疏,让骰子仍然能通过玩家所能进行的任何统计检验。
我们没有在指控某个具体网站这么做。我们说的是这套架构允许如此。封闭的服务器是一间上了锁的房间:运营者独自掷骰,报出一个数字,请你相信。站在门外,诚实的运营者和不诚实的运营者看起来一模一样。
有认证的随机数生成器不就证明骰子公平了吗
去读读那张证书究竟涵盖了什么。实验室检测的是一个生成器:台架上的一段算法,产出数百万个能通过统计检查的数字。那认证的是部件。它对交付只字未提,也就是说,抵达你棋盘的那个数字,是不是来自那个生成器、在那一刻、且中途未被改动。后厨里一台检定合格的秤,并不能证明你的面包是用它称的。
认证也只是一张快照。在跑的服务器不断重新部署,生成器与你这局棋之间的代码路径,在实验室回家很久之后仍在改变。所以认证过的随机数回答的是一个没人真正在问的问题。真正要紧的不是这栋楼里某处是否存在好骰子,而是今晚你这局棋,每一掷有没有拿到它们。
承诺揭示到底改变了什么
它把公平从承诺变成了证明。棋局开始之前,服务器抽取一枚秘密种子,并公布它的指纹,一段被称为承诺值的 SHA-256 哈希。此后棋局中的每一掷都由那枚种子推导而出,每掷一次 HMAC-SHA256 计算,依次进行。棋局结束时,服务器揭示种子。
现在任何人都能核对两件事。把揭示的种子做哈希:结果必须与第一步之前公布的承诺值一致。重新计算所有掷骰:必须与棋盘上出现过的每一个数字一致。如果服务器在看到你的局面之后改动过哪怕一颗骰子,算式就对不上。做手脚不再是无法检验的怀疑,而成了可以当场抓住的谎言。
在棋局之前就锁死的骰子,无法对这局棋作出反应。
这就是核心。有用的那种作弊是反应式的:看见孤子,掷出打中的点数。承诺揭示夺走了服务器的眼睛,因为整串序列在开局之前就已固定,而承诺值之后的任何改动都可以用数学检出。它没做到的是让骰子变得和善。那串序列是诚实的,不是慈悲的。你仍会在最糟糕的时刻坐在栏上,只是现在你能证明那是公平的。
实际怎么验证一局棋
我们在 Orion 里就是这么做的。在我们服务器上进行的每一局棋,都带着第一掷之前立下的承诺值,服务器在源头校验每一步棋,而核对一局已结束的棋大约要一分钟:
打开验证页. 用任何浏览器访问 orion.arthea.ai/verify。无需安装,无需注册账号。
输入对局编号. Orion 的每一局服务器对局都有一个。把它粘进去。
让浏览器自己算. 页面用 Web Crypto,在你的浏览器里、在本地重新计算承诺值和每一掷。我们的说法不参与这次核对。哪怕只有一个数字被改过,重算都会说出来。
验证页今天就已经在跑。游戏本身已经做完,orion.arthea.ai/go 这道门带着 App Store 与 Google Play 的链接,并且永远显示此刻真正可用的东西。无论如何,诚实的答案不变。是的,在线双陆棋会被做手脚。解药不是一句更漂亮的承诺,而是会亮出算式的骰子。