承诺了什么,何时承诺
一局 Mines 由一笔链上交易(mines_start)开启,这笔交易在你翻开任何格子之前同时做了三件事:
- 承诺运营方所贡献的部分。 后端生成一个随机的 32 字节
server_seed,交易中存储它的 SHA-256 哈希 —— 即承诺。种子本身在本局结束前一直保持隐藏。 - 捕获链上熵。 程序从 Solana 的
SlotHashessysvar 中读取最近的槽位哈希并存入本局。 - 冻结各项条件。 庄家优势、赔付上限与退款超时都会被快照进你这一局 —— 任何变更都无法对你正在进行的棋盘重新定价。
Mines 的棋盘是如何推导出来的?
25 个格子按 5×5 方格逐行编号为 0 到 24(index = row × 5 + column)。棋盘是一个 25 位的掩码:第 t 位为 1 表示第 t 格藏有地雷。
- 哈希输入顺序严格为:种子、槽位哈希、用户账户地址、nonce(8 字节小端)、ASCII 标签
"mines",然后是区块计数器(8 字节小端,从 0 开始)。 - 每 4 字节的分块按大端读取。一个区块最多产出 8 次抽取;随机流会按需以下一个计数值补充。
- 拒绝采样的循环使每一次抽取都严格均匀 —— 洗牌不存在可供争论的偏差。
程序强制执行的赔付公式是什么?
每翻开一个安全格子,你可兑现的倍数就会乘以存活概率的精确倒数,并只计入一次庄家优势:
无论地雷数与翻开格数如何组合,期望回报都是
1 − 庄家优势。当前取值列于费用与限制。
程序在结算时强制执行什么
结算交易(mines_settle)会揭示 server_seed 并声明一个结果 —— 或是带着一组已翻开格子的兑现,或是在某个特定格子上踩雷。随后程序会在链上核验一切:
sha256(server_seed)必须等于开局时存储的承诺 —— 换一个种子无法结算本局。- 棋盘会用上面的公式从头重新推导。任何实际是地雷的「已翻开」格会被拒绝;被声称踩雷但实际不是地雷的格子会被拒绝;既被声称踩雷又被声称已翻开的格子也会被拒绝。
- 倍数在链上依据快照下来的优势与你实际翻开的格数计算 —— 赔付无法被谎报。
- 结算事件会永久公布种子、槽位哈希、完整地雷掩码、你翻开的格子与最终结果。
什么被保证了,什么没有
由程序强制执行:- 棋盘在你第一次点击之前,就由承诺加上所存槽位哈希固定下来。地雷无法在局中移动。
- 结算时,运营方无法就棋盘撒谎:错误的种子、把地雷说成安全格、伪造踩雷,都会让交易失败。
- 你开局时所适用的条件(优势、赔付上限、超时)一直适用到本局结束。
- 你的本金绝不会被锁死:如果运营方始终不结算,超时之后任何人都可以调用取消,退还你的本金。正常运行下你根本不会走到这一步 —— 被放弃的棋盘会在超时前按当前倍数替你兑现(见 Mines),因此你保住的是收益而不仅仅是本金。无需许可的取消,是运营方彻底消失时兜底的那层保障。
- 游戏过程中运营方知道棋盘。 这是结构性的,而非此设计特有的缺陷:翻格由链下即时提供,而提供这一服务的一方必然知道地雷在哪。没有任何随机数方案能消除这一点 —— 即便棋盘由 VRF 生成,运营方在响应你第一次翻格时同样会知道它。承诺机制所保证的是:这份认知既不能用来_改变_棋盘,也不能用来_谎报_结果。
- 开局时机。 棋盘取决于你开局时捕获的槽位哈希,而开局交易由后端提交 —— 与其他游戏是同一类时机考量。提前知道一个棋盘,只有在你的点击可被预测时才有用;变换你点击的位置就能挫败基于时机的棋盘挑选。
- 作废。 运营方可以取消一局进行中的游戏 —— 原则上也包括你正在赢的那一局。取消会全额退还本金(不存在没收路径),并且总会发出公开事件,因此作废频率任何人都可以在链上审计。
- 每一局都必须使用全新的种子 —— 已揭示的种子是公开的,重复使用会让下一个棋盘可被公开推导。程序会在链上拒绝连续重用,后端则强制保证全局唯一性。
如何验证一局 Mines?
你这局最终交易中的结算事件(MinesGameSettled)携带 server_seed、slothash、user、nonce、mines_count、mines_mask、revealed_mask、bust_tile、multiplier_bps 与 is_win。验证方法:
- 核对承诺:
sha256(server_seed)必须等于你开局交易(MinesGameStarted事件)中公布的commit_hash—— 这证明棋盘在你第一次点击之前就已锁定。 - 用上面的公式重新推导地雷掩码,并与事件中的
mines_mask对照。 - 依据掩码核对结果:
revealed_mask的每一位都必须是安全格,而踩雷的那一格必须是地雷。 - 用赔付公式核对倍数。