Dice 为什么没有承诺步骤?
Crash 需要一个已承诺的秘密值,因为它的结果必须在本局进行期间_已确定但仍隐藏_。掷骰没有这样的阶段:结果在抽取它的同一条指令中就被消费掉了。因此这里不是去承诺某个秘密值,而是推导过程完全不使用任何运营方输入 —— 没有什么需要承诺,没有什么需要揭示,也不存在运营方可以择优挑选的种子。 熵来自 Solana 网络本身,并与标识你这笔下注的若干数值混合:slothash—— 你的下注交易执行那一刻,SolanaSlotHashessysvar 中最新的条目。这是由网络产生的熵,在构造交易时并不可知(发送方无法确知一笔交易会落在哪个槽位)。user—— 你链上用户账户(程序由你的钱包推导出的账户)的 32 字节地址。它使不同玩家之间的点数相互独立:落在同一槽位的两笔下注会得到不同的点数。nonce—— 你个人的下注计数器,存储在链上,每玩一次递增。它使你自己连续的下注即便落在同一槽位也彼此独立,同时兼作重复提交的防护。
Dice 点数的精确公式是什么?
- 哈希输入是按以下确切顺序拼接的:ASCII 标签
"dice"、槽位哈希、用户账户地址,然后是编码为 8 字节小端的 nonce。 - 采样取 SHA-256 输出的前 16 字节,按大端读作无符号 128 位整数,再对 10,000 取模。
- 把 128 位样本对 10,000 取模,其理论偏差低于 2⁻¹¹⁴ —— 比庄家优势小了几十个数量级,因此我们选择把它记录下来而非去修正它。
获胜条件与赔付
edge_bps = 150):
每个目标值的期望回报都相同:
胜率 × 倍数 ≈ 本金的 98.5%(向下取整最多带来一个基点的、有利于庄家的偏差)。当前的优势与限制列于费用与限制。
什么被保证了,什么没有
由程序强制执行:- 点数的推导与结算都在一条链上指令内完成,所用输入由程序自己读取。后端并不提供点数,也无法谎报它。
- 运营方对推导不贡献任何输入 —— 不存在可供反复试算以求有利结果的服务器种子。
- 你的 nonce 必须被原样回传,因此同一笔下注不会被意外(或恶意)玩两次。
- 每次游戏都会公布全部推导输入与结果,因此历史上每一次掷骰任何人都可以重新计算。
N−1 槽的哈希会在第 N 槽开始时变为公开,所以一个延迟极低的运营方可以估算出:_如果_这笔下注落在当前槽位会得到什么点数,并通过延迟提交来重新抽取。这套机制选择承认这一点,而不是假装它不存在(要消除它就需要引入 VRF 预言机,而其每笔成本会超过庄家在小额下注上的期望值)。约束它的因素是:
- 打包并非完全可控 —— 决定交易确切落在哪个槽位的是网络,而不是发送方。
- 每一项输入都会公布,因此提交延迟的规律,以及整体胜率与所报概率之间的任何偏离,任何人都能用公开数据度量出来。系统性的滥用无法隐藏。
如何验证一次掷骰?
每次游戏都会在该笔下注自身的交易中发出DiceBetSettled 事件,携带你所需的一切:slothash、user、nonce、target_bps、direction、win_chance_bps、roll、multiplier_bps 与 is_win,以及完整的结算明细。验证方法:
- 在 Solana 区块浏览器上打开该笔下注的交易并读取事件字段(应用中的 Dice 界面会显示本次会话的公平性输入,你的下注记录中也有指向交易的链接)。
- 重新计算
sha256("dice" ‖ slothash ‖ user ‖ nonce),取前 16 字节按大端对 10,000 取模,再与事件中的roll对照。 - 依据上面的公式核对胜负判定(押下方为
roll < target,押上方为roll > target)与倍数。