传统电子游戏依赖黑盒随机数生成器(RNG),玩家无法得知后台是否根据注码大小动态干预胜率。Stake Originals全系游戏采用可验证公平(Provably Fair)加密承诺机制,通过 HMAC-SHA256 算法将平台预设种子与玩家自定义参数绑定,使每一局掉球路径、雷区分布与骰子点数均可通过开源数学公式100%逆向复盘。
在可验证公平体系中,没有任何一方能够单独决定开奖结果。系统将随机性拆分为四个相互制约的数学输入变量,分别由平台服务器与玩家客户端掌握控制权。
由平台服务器生成的64位十六进制高熵随机字符串。在种子处于活跃状态时,玩家只能看到它经过 SHA-256 加密后的哈希值(Server Seed Hash)。
完全由玩家端决定的任意字符串(支持字母、数字及符号)。由于服务器在生成初始Server Seed时无法预知玩家将输入什么Client Seed,因此无法预先筛选有利平台的结果序列。
代表在当前这组“服务器种子 + 客户端种子”配对下进行的第几局游戏。从 0(或1)开始,每完成一次有效投注,Nonce严格自动加1。
单次HMAC-SHA256仅生成32字节(最多转化8个浮点数)。当单局游戏需要超过8个随机判定时,系统自动递增Cursor(0, 1, 2...)拼接更多哈希块。
0。
| 参数名称 | 生成与控制方 | 游戏进行中(活跃期) | 更换种子后(核验期) | 数学验证方法 |
|---|---|---|---|---|
| Server Seed (明文) | 平台加密随机数发生器 | 严格隐藏 (Hidden) | 公开64位十六进制明文 | 对其执行 SHA256() 比对初始哈希 |
| Server Seed (Hash) | 由明文通过SHA-256派生 | 公开展示可复制 | 保留在历史投注记录中备查 | 等于 SHA256(Unhashed_Seed) |
| Client Seed | 玩家浏览器生成 / 手动输入 | 完全公开且支持预设下一局 | 完整记录于每笔注单详情 | 直接作为 HMAC Message 前缀 |
| Nonce (局数编号) | 系统按投注顺序自增 | 实时显示当前累计局数 | 每笔注单绑定唯一固定Nonce | 检查历史序列是否连续无跳号 |
许多刚接触Stake原创游戏的玩家会疑惑:为什么点击某局刚结束的注单,系统提示“需要更换种子才能验证”?这是因为只要当前服务器种子仍在服役,公开其明文就会导致后续所有未发生的赌局结果被提前推算。
完整的公平验证并非只看点数是否对得上,而是包含两个缺一不可的密码学校验环节:
将揭晓的 Server Seed (Unhashed) 放入任意SHA-256工具计算,所得结果必须与下注前展示的 Server Seed (Hashed) 逐字吻合。
使用该明文种子、Client Seed与对应局数的Nonce运行HMAC-SHA256,还原出的游戏点数/雷区必须与实际开奖界面一致。
点击游戏界面右下角的“公平性(Fairness)”按钮,切换到“种子(Seeds)”标签页。复制并保存“活跃服务器种子(哈希)”框中的64位字符串,系统同时还提前展示了“下一个服务器种子(哈希)”供后续轮换使用。
在“新的客户端种子(New Client Seed)”输入框中填写您自己设定的随机字符(如 StakeCN_Audit_889),点击绿色的“更改(Change)”按钮。注意:如果当前有正在进行中的Mines扫雷或Hilo牌局,必须先结算才能更换种子。
打开“我的投注(My Bets)”,点击您刚才想要核查的那一局游戏记录。此时原本显示“需要更换种子以揭晓”的栏位,已经变为可复制的64位明文服务器种子(未哈希),同时列出了当时的Client Seed和准确的Nonce序号。
点击注单底部的“验证(Verify)”按钮,或将这三项参数复制到下方的独立验证模拟器中。首先确认明文的SHA-256哈希值与第01步保存的Hash一致,随后查看字节转换出的最终开奖数字。
拿到HMAC-SHA256输出的64位十六进制字符串后,系统并非直接取末尾数字,而是遵循严格的4字节分组加权除法(Byte-to-Float Conversion),将其映射为 [0, 1) 区间内的高精度均匀分布浮点数。
计算 HMAC_SHA256(ServerSeed, "ClientSeed:Nonce:0"),输出32个字节(64个Hex字符)。
每2个十六进制字符构成1个字节(Byte),将其分别转换为0~255之间的十进制整数:
将4个字节分别除以 256^1, 256^2, 256^3, 256^4 后相加,得到基础浮点数 Float:
根据不同游戏的规则公式,将该浮点数乘以事件总数并向下取整(Floor):
实时演示 Server Seed + Client Seed + Nonce → 4字节拆解 → 游戏开奖结果
说明:每一行消耗1组浮点数,若 Math.floor(Float × 2) === 1 则小球向右(R)弹跳,最终向右的总次数即为底部第几个赔率格(从左0至右16编号)。
系统初始化包含0~24号格子的数组,每一步用 Math.floor(Float × 剩余格子数) 抽取地雷坐标并移出候选池,确保地雷绝不重叠。
所有Stake原创游戏共用同一套底层字节生成器(Byte Generator),但在最后一步将 [0, 1) 浮点数转化为游戏画面时,各自采用专属的数学映射模型。
Plinko的钉子金字塔共有8至16行可选。小球每下落一层遇到钉子,只存在向左(0)或向右(1)两种等概率分支(各50%)。
因为单次哈希(Cursor=0)产生的32字节只能提供前8层钉子的方向;第9层至第16层钉子的方向必须由 ClientSeed:Nonce:1 生成的第2组32字节提供。
5×5网格共有25个位置(编号0至24,左上角为0,右下角为24)。为了防止两个浮点数算到同一个格子上,系统采用经典的Fisher-Yates不放回抽样算法。
无论您在游戏过程中点击哪个格子,25个格子的排序在点击“开始游戏”那一刻已由当期Nonce唯一锁定。不存在“点哪格哪格变雷”的后台动态追踪。
Dice和Limbo每局只需1个随机结果,因此仅截取 Cursor = 0 哈希流的前8个十六进制字符即可完成验证,核验速度最快。
在Limbo公式中,原始反比例乘数直接乘以了 0.99(即扣除1%庄家优势);而在Dice中,50%胜率对应的赔率为 99 / 50 = 1.98x。
const crypto = require('crypto');
function verifyDiceAndBytes(serverSeed, clientSeed, nonce, cursor = 0) {
// 1. 验证下注前的 SHA-256 承诺哈希是否吻合
const commitmentHash = crypto.createHash('sha256').update(serverSeed).digest('hex');
// 2. 生成 HMAC-SHA256 32字节输出流
const message = `${clientSeed}:${nonce}:${cursor}`;
const hmac = crypto.createHmac('sha256', serverSeed).update(message).digest();
// 3. 取前4个字节转换为 [0, 1) 区间高精度浮点数
let floatVal = 0;
for (let i = 0; i < 4; i++) {
floatVal += hmac[i] / Math.pow(256, i + 1);
}
// 4. 映射为 Dice 0.00 ~ 100.00 开奖结果
const diceRoll = Math.floor(floatVal * 10001) / 100;
return { commitmentHash, message, floatVal, diceRoll };
}
console.log(verifyDiceAndBytes(
'a8f5f167f44f4964e6c998dee827110c9082b47c341d91a032b8d12a7e6c4501',
'StakeCN_Audit_2025',
1042
));
针对玩家在实际核验种子、使用自动投注脚本及评估连黑波动时最常遇到的密码学与概率疑问,提供客观的技术解答。
可验证公平(Provably Fair)保证了每一局开奖结果不受人为操控,但并不能消除高波动策略下的自然方差(Variance)。请将公平验证与科学的止损倍投策略结合使用。