Rust 网站上的可证明公平是如何运作的,以及如何核对你的开奖
用大白话讲服务器种子哈希、客户端种子、nonce 和 HMAC-SHA256,附一个可以复现的算例,以及在 Rust 皮肤网站上核对任何一次开奖的分步流程。
我们排名里的十家网站,都标明自家游戏可证明公平。这个说法有精确的含义,背后的核对你自己就能用一个免费的哈希工具或几行代码来跑。很少有玩家真的去跑过。这篇指南讲这套系统证明了什么、没有涉及什么,以及如何从头到尾验证一次开奖。
简短的版本是:下注之前,网站先锁定一个秘密值,并给你看它的指纹。你再加入一个自己的输入。下注结束后,网站公布那个秘密,你可以确认指纹是否匹配,以及每个结果是否都由这些输入推出。如果数字对得上,就说明网站在看到你的注之后,没有办法改变任何一个结果。
可证明公平要解决的问题
在皮肤网站上,每个结果都由服务器决定。你开箱、抛硬币或等待 Crash 倍数的时候,看到的是一个在你无法检查的机器上产生的数字的动画。没有某种形式的证明,你就只能相信,在你下大注的时候,运营方没有悄悄把开奖往不利于你的方向推。
持牌的在线赌场通常用监管机构和对随机数生成器的第三方审计来回答这个问题。大多数皮肤网站则依靠一种密码学方法。它对玩家有个很大的好处:你不需要信任审计员,因为你可以在自己的电脑上重复计算。
这个思路叫承诺方案。想象网站把秘密写在一张卡片上,把卡片封进信封,在游戏开始前把信封交给你。它之后无法在你不察觉的情况下换掉卡片,而你也不能提前读到卡片。
三个输入:服务器种子、客户端种子和 nonce
Rust 网站上几乎所有的可证明公平系统,用的都是同样的成分。各网站的叫法略有不同,但各自的角色不变。
服务器种子
由网站生成的一长串随机字符串。你玩的时候它保持秘密,因为任何知道它的人都能预测每一个结果。你看到的是它的哈希,通常用 SHA-256 生成。哈希是单向的指纹。同样的输入总是给出同样的 64 个字符的输出,输入哪怕改动一个字符,输出就完全不同,而且没有可行的办法从哈希倒推出种子。
客户端种子
来自你这一侧的字符串。网站会替你生成一个默认的,大多数也允许你在公平性或设置面板里编辑。它的作用是防止网站专门挑一个对你不利的服务器种子。网站在知道你会输入什么之前,就已经承诺了它的种子,所以它没办法让一个去迁就另一个。
Nonce
一个计数器,从 0 或 1 开始,你在同一对种子上每下一注就加一。它让你可以对几百注沿用同一个服务器种子和同一个客户端种子,每次依然得到全新的结果。
当你想核对结果时,你让网站轮换种子。它会以明文公布旧的服务器种子,给你看新种子的哈希,并重置 nonce。你在旧种子上玩过的一切,现在都可以验证了。
输入是如何变成结果的
最常见的做法是 HMAC-SHA256。HMAC 是把一个秘密密钥和一条消息组合起来产生哈希的标准方法。在大多数 Rust 网站上,服务器种子是密钥,消息是把客户端种子和 nonce 拼在一起,往往用冒号连接,就像 clientseed:nonce。有些网站会加上回合编号或游戏 ID,所以请务必阅读网站自己公平性页面上的确切公式。
输出是一个 64 个字符的十六进制字符串。网站再把这个字符串的一部分变成 0 到 1 之间的一个数。典型的做法是取前八个十六进制字符(32 位),转换成一个整数,再除以 4,294,967,296,也就是 2 的 32 次方。这个小数再映射到游戏上:
- 骰子和升级器:乘以 100,得到 0.00 到 99.99 的点数,再与目标比较。
- 轮盘:乘以转盘上的格数,向下取整,选出一格。
- 箱子:乘以箱子里的总票数,所以占 1% 票数的皮肤,会在 1% 的开奖中中出。
- Crash:把这个数代入一个公式,转换成倍数,庄家优势内置其中。我们的 Crash 策略指南讲了这个公式,以及它对兑现目标意味着什么。
一个可以复现的算例
下面的种子是为这个例子编的,所以你可以用任何 HMAC-SHA256 计算器核对我们的算术。
- 服务器种子:example-server-seed-01。它的 SHA-256 哈希以 a5275da7ccca3f73 开头。这个哈希就是网站在你玩之前会给你看的东西。
- 客户端种子:my-own-client-seed。Nonce:1。因此消息是 my-own-client-seed:1。
- 用服务器种子作为密钥、这条消息作为输入做 HMAC-SHA256,得到的结果以 4cdcf221 开头。
- 十六进制的 4cdcf221 换成十进制是 1,289,548,321。除以 4,294,967,296,约为 0.30025。
- 在 0 到 100 的骰子尺度上,就是 30.02 点。在 15 格的轮盘上,0.30025 乘以 15 约为 4.5,向下取整是第 4 格(把第一格算作 0)。
用同样的种子、nonce 为 2 再算一次,你会得到一个完全不同的哈希,以 6486ccbd 开头,换算出来约为 0.3927。第一次开奖的任何信息,都说明不了第二次。这种独立性就是关键所在:下注历史里没有规律可读,因为每个结果都是一个全新的哈希。
如何自己验证一次开奖,一步一步来
第一次完整的核对要花一些时间。之后就是几分钟的复制粘贴。先在小额余额上做,这样等到某个结果真正对你重要的时候,你已经熟悉了流程。
- 下注之前打开公平性面板。它通常从游戏界面、页脚或你的个人资料设置里链接过去。把经过哈希的服务器种子保存在网站之外的地方,比如手机备忘录或截图。
- 设置你自己的客户端种子。把默认的换成你自己输入的东西。随便敲键盘就行,不需要好记。
- 开始玩,并记下你在意的那些注。记下每一注显示的 nonce,或者之后在你的下注历史里找到它。
- 轮换种子。网站会公布旧的服务器种子。复制它。
- 核对承诺。把公布的服务器种子放进任何 SHA-256 工具里跑一遍。输出必须与你在第 1 步保存的哈希逐个字符一致。
- 重新计算开奖。用公布的服务器种子、你的客户端种子和 nonce 做 HMAC-SHA256,然后套用网站公布的转换方法。在 PHP 里,这只需调用一次 hash_hmac,Python 的 hmac 模块用几行代码也能做到。
- 对比。你算出来的数字,必须得出你历史记录里所记的结果。
大多数网站也提供内置的验证器,你把种子粘贴进去就行。它很方便,但跑的是运营方自己的代码。想要完全不依赖网站的核对,至少用一个独立工具或你自己的脚本做一次。
多人共享的游戏稍有不同
骰子、升级器和单人开箱这类单人玩法,可以使用你个人的那对种子。许多玩家共用一个结果的游戏,比如 Jackpot、Coinflip、开箱对战、轮盘回合和 Crash,不能让某一位玩家的客户端种子来决定所有人的结果。网站有几种常见的处理办法。
- 哈希链。在 Crash 里很常见。网站提前生成一条很长的哈希链,每个回合的哈希是下一回合哈希的 SHA-256。它在第一个回合开始之前,公布链的最后一个哈希,你可以核对每个公布的回合是否都能哈希回前一个。链中的每个结果,都在任何人下注之前就已经确定了。
- 来自网站之外的公开种子。网站先承诺它的服务器种子,再混入一个没有人能提前知道的值,比如公共区块链上一个未来区块的哈希。因为网站承诺的时候那个区块还不存在,所以它没法针对它去调整自己的种子。
- 每回合的承诺。在 Jackpot 和 Coinflip 里,回合的哈希种子在回合开启时出现,明文种子和中奖的票则在回合结束时展示。
每种情况下的验证思路都一样。找到回合之前就已公开的承诺,确认公布的值与它匹配,然后重新计算结果。关于共享奖池里中奖的票如何变成赢家,见我们的指南 Coinflip 与 Jackpot 的赔率。开箱对战混合了两种做法,我们在开箱对战详解里讲过。
可证明公平没有证明什么
一次验证通过的开奖只证明了一件很窄的事:结果来自网站在你下注之前就已承诺的输入。这很有用,但玩家常常从这个徽章里读出远多于它所能支撑的内容。
- 它对庄家优势只字不提。庄家优势很大的 Crash 游戏,也可以是完全可证明公平的。优势藏在那个把随机数转换成倍数或中奖概率的公开公式里。公平指的是网站遵守了它自己的规则,而那些规则依然让网站在长期占便宜。
- 它不检查价格。如果一个箱子把某件皮肤标的价值,远高于它在 Steam 社区市场的成交价,开奖可以是公平的,而箱子依然不划算。我们的升级器指南展示了物品定价如何悄悄改变真实的赔率。
- 它不涉及提现。网站可以种子运行得毫无瑕疵,却依然拖延提现、冻结账号或改写条款。这就是为什么公平性只是我们给网站打分的其中一项输入,与提现速度和信任度并列。
- 只有当有人去核对时它才有用。没人去比对的承诺,只是页面上的一串字符。
公平性页面上的警示信号
验证种子是我们测试网站时的例行步骤。下面这些是让我们起疑的东西,大致从轻到重。
| 你看到的情况 | 意味着什么 | 该怎么做 |
|---|---|---|
| 无法更改客户端种子 | 网站控制着你个人开奖的每一个输入 | 对单人玩法多加小心 |
| 有验证器按钮,但没有公布公式 | 你只能用网站自己的代码核对结果 | 在充值较多之前,向客服要确切的公式 |
| 服务器种子哈希在你下注之后才出现 | 没有真正的承诺 | 不要把这个游戏当作可证明公平 |
| 旧的服务器种子永远无法公布 | 什么都无法验证 | 同上 |
| 公布的种子哈希后与保存的承诺不符 | 种子被改过,或者页面出了故障 | 停止游玩,给所有东西截图,联系客服 |
如果你碰上了最后一行,请保留证据:保存的哈希、公布的种子、下注 ID,以及每一注的时间。一次不匹配可能只是显示上的漏洞,但这正是会让我们复查一家网站的那种可信的玩家反馈。
给普通玩家的合理流程
你不需要验证每一注。一套轻量的流程,就能抓住大多数问题,又不会把一次游玩变成作业。
- 在新网站上开始游玩时,设置一个新的客户端种子。
- 游玩之前,给经过哈希的服务器种子截图。
- 游玩结束后轮换种子,并核对承诺,这只是一次 SHA-256 计算。
- 重新计算一两个最要紧的结果,比如一次大额的升级器亏损,或者你确信自己该赢的一场对战。
- 每隔一段时间,用独立工具而不是网站的验证器,重做一次完整的核对。
一次干净的验证意味着,你承受的亏损就是公布的数学所预测的,不多也不少。每一次开奖上,优势依然存在。实际的下一步,是事先决定,你愿意为这份娱乐付出多少预期的亏损;我们的理性赌博页面讲了简单的限额,以及帮你坚持的工具。
常见问题
可证明公平的网站还能作弊吗?
它无法在哈希核对不失败的前提下改变已承诺的结果。但它依然可以设很高的庄家优势、把箱子里的物品标价过高,或者拖延提现,因为可证明公平只涵盖开奖是如何产生的。
我一定要更改客户端种子吗?
不是必须,但你应该改。你在服务器种子哈希显示之后才选的客户端种子,意味着网站不可能在挑选自己的种子时,把你的输入考虑进去。
为什么网站不在我玩之前直接显示服务器种子?
任何同时知道服务器种子和客户端种子的人,都能算出接下来的每一个结果。哈希让网站可以承诺自己的种子,却不泄露未来的开奖。
我可以用什么工具来验证开奖?
任何 SHA-256 和 HMAC-SHA256 计算器都行,包括免费的在线工具,以及 PHP、Python 或 JavaScript 的内置函数。图方便就用网站的验证器,真正算数的核对则用独立工具。
SHA-256 对此足够安全吗?
足够。它是广泛使用的标准,比特币挖矿也在用,目前没有已知的可行办法能把它反推,或者找到第二个产生同样哈希的种子。
继续阅读
相关指南
Rust 赌博奖金、免费箱子和优惠码:它们到底值多少钱
一个免费箱子值的是它的平均掉落,而不是最好的那件物品,一份免费余额值的是熬过流水后剩下的部分。在你输入优惠码之前,如何给每一种常见的 Rust 网站奖金估值。