Skip to main content
Mines 的棋盘在你翻开第一个方块之前就已固定。开局交易会承诺一个随机服务器种子的 SHA-256 哈希,并捕获一个 Solana slot hash,而棋盘正是这两者的纯函数。结算时,程序会在链上重新推导整个棋盘,并拒绝任何与之不符的结算。 本页给出每一个 Mines 棋盘背后的确切机制:承诺了什么、何时承诺、棋盘的精确推导、程序在结算时会重新核验哪些内容,以及这套机制诚实的边界。背景知识见公平可验证总览。

承诺了什么,何时承诺

一局 Mines 由一笔链上交易(mines_start)开启,这笔交易在你翻开任何格子之前同时做了三件事:
  1. 承诺运营方所贡献的部分。 后端生成一个随机的 32 字节 server_seed,交易中存储它的 SHA-256 哈希 —— 即承诺。种子本身在本局结束前一直保持隐藏。
  2. 捕获链上熵。 程序从 Solana 的 SlotHashes sysvar 中读取最近的槽位哈希并存入本局。
  3. 冻结各项条件。 庄家优势、赔付上限与退款超时都会被快照进你这一局 —— 任何变更都无法对你正在进行的棋盘重新定价。
棋盘是所承诺种子、所存槽位哈希、你的账户与你的游戏计数器的纯函数。从这一刻起棋盘即已固定:地雷不会随着你的点击而移动。游戏过程中,翻格由链下提供(这正是它即时的原因);结束时,结算交易会揭示种子,程序则在链上从头重新推导整个棋盘,并拒绝任何与之不符的结算。

Mines 的棋盘是如何推导出来的?

25 个格子按 5×5 方格逐行编号为 0 到 24(index = row × 5 + column)。棋盘是一个 25 位的掩码:第 t 位为 1 表示第 t 格藏有地雷。
重新计算时需要留意的细节:
  • 哈希输入顺序严格为:种子、槽位哈希、用户账户地址、nonce(8 字节小端)、ASCII 标签 "mines",然后是区块计数器(8 字节小端,从 0 开始)。
  • 每 4 字节的分块按大端读取。一个区块最多产出 8 次抽取;随机流会按需以下一个计数值补充。
  • 拒绝采样的循环使每一次抽取都严格均匀 —— 洗牌不存在可供争论的偏差。

程序强制执行的赔付公式是什么?

每翻开一个安全格子,你可兑现的倍数就会乘以存活概率的精确倒数,并只计入一次庄家优势:
程序以精确整数运算完成计算,最后只做一次向下取整除法(取整最多带来一个基点的、有利于庄家的偏差)。在当前 1.5% 的优势下: 无论地雷数与翻开格数如何组合,期望回报都是 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。验证方法:
  1. 核对承诺:sha256(server_seed) 必须等于你开局交易(MinesGameStarted 事件)中公布的 commit_hash —— 这证明棋盘在你第一次点击之前就已锁定。
  2. 用上面的公式重新推导地雷掩码,并与事件中的 mines_mask 对照。
  3. 依据掩码核对结果:revealed_mask 的每一位都必须是安全格,而踩雷的那一格必须是地雷。
  4. 用赔付公式核对倍数。
关于如何从区块浏览器读取事件数据的通用技巧,见验证一局游戏。 关于这款游戏本身怎么玩,见 Mines 游戏指南。