MINESWEEPER 系统设计
原型文档 · 非正式发布返回游戏 ↗
规则与架构设计 v0.8.1

每日挑战、四榜与公开回放架构 v0.8.1#

2026-09-13 · 配套游戏规则1.5。状态:设计与参考DDL;尚未接入服务。此次范围为服务器每日题、初中高与综合四榜、成绩预选与压缩录像、冻结历史榜;直播与PVP不在本版范围。Redis仅用于每日榜单缓存及官方录像TTL存储。个人录像仅本机,官方候选证据是独立、明确授权的上传用途。

1. 设计决定与玩家体验#

玩家离线仍可进行经典/自定义/已安装关卡,以及已下载历史每日。今天的每日挑战必须联网:服务器统一生成、验证并裁决。发布失败时提示“今日挑战暂不可用”,提供普通单人入口;客户端不能临时生成另一套每日替代。

竞榜结果分为“通关”“无伤成绩”“可能入榜,待上传”“验证中”“已入榜/未入榜”。每榜只展示已经核验且有对应完整回放的Top10(单项1段,综合3段),不能把上传授权提示写成“你已获得第10名”。玩家可关闭候选自动上传或在候选出现时选择上传;不上传保留个人成绩和成长,不取得公开名次。

已确认每日期设置初级榜、中级榜、高级榜与综合榜,每榜Top10、每账号每榜最多一个名次。单项排序按该档最佳无伤用时、服务器完成时刻、固定参赛序号;综合按三档最佳无伤用时之和、三段最晚完成时刻、参赛序号。单项无需三档齐全,综合不要求任意单项进入Top10。详见四榜规格

四榜共享同一日期generation,单项各1段、综合3段按game_id共享录像。最终每日期最多40个席位、60份不同公开录像;候选暂存/旧代元数据另计,不能把60段当所有存储上限。

2. 地图生成与发布#

后台 background_jobs(daily.generate,date,policy_revision) 去重,提前生成各档题。服务器随机源产生私有seed,使用固定generator_revision生成,再用独立validator_revision校验尺寸、雷数、初始安全开口、邻格数字一致性、可解性与无猜策略。必须从实际规定的初始局面按冻结的推理能力集验证,不能把“存在安全第一步”当作无猜通过。

沿用9×9/11、16×16/42、30×16/101雷;初级始终无猜,中高级在UTC每月8/18/28日可有猜测,其余日无猜。验证失败重新生成;尝试预算耗尽则不可用并报警,不降难度或跳过验证。预算为容量参数,实施时用生成实测分布设定,不预设无依据次数。

完整三档通过后,在同一事务写 content_revisions(公开元数据)、daily_challenges(日期映射)、daily_puzzles(私有地图/哈希/生成与验证版本/报告)及 daily_boards。发布的地图、规则映射、开始/截止时刻不可覆盖;发现错误则标记当日无效并解释,不能悄悄换图影响已开始者。

GET /daily/:date/challenge只返回日期、截止、难度、尺寸、规则与公开谜题ID;不返回当日隐藏雷阵、私有seed或可推导seed的规则。未来日期即使已预生成也不对外开放。当前日普通与正式局都由服务端处理操作,只回传已揭开投影;失败不发全雷图。历史练习接口仅在原日期已结束后释放该日地图包,因此历史离线练习与当日保密不矛盾。

/catalog、云导出、错误/性能日志、缓存、Service Worker均不得包含当日私有地图。服务器地图生成替代客户端每日生成,但不替换经典等普通随机模式的本地引擎。

3. 实时裁决与录像成本边界#

一套单实例在线调度器串行处理:鉴权→控制epoch/输入seq→计时与合法动作→状态/事件摘要/回执写入SQLite→提交→操作者自身可见投影。客户端不发送权威时间或任意终局;成绩取服务端起点至最后合法完成事件的单调时间差。断网/后台不暂停,断网动作不缓存补执行。

正式每日单账号一场活动尝试;普通每日也只能由其绑定设备操作。接管明确确认并增加control_epoch/input_epoch,旧设备只读;不重置计时。账号军衔只在开局读取,用于冻结1/2/3格生命;受伤后该段永远不具备Top10资格,仍可继续正常通关和解锁下一档。

并非整局没有上传数据:为了服务器时间与状态裁决,每次操作仍有小型实时网络消息。条件上传节省的是完整录像归档和验证开销,不是取消操作联网。

存储分三层:

  • online_seats.private_state_json:当前权威状态,支持恢复;online_commands保存去重ID、序号、请求hash、简短时钟/结果回执,不保存整段动作或可回放历史投影。
  • online_events:服务器game_seq、effective_at、event_hash、chain_hash、state_hash等最小验证锚点;不保存完整动作正文。不向其他玩家提供进行中棋局的实时投影。
  • 客户端本机 official_attempt_drafts:按ACK顺序录制规范化动作、服务端响应事件/时间和必要校验值,组成该次正式过程。只有获得候选授权才上传完整压缩文件。personal_replays仍独立,不扫描个人收藏上传。

记录规范:H0=SHA256(规范化header)Hi=SHA256(Hi-1 || canonical(event_i))。header绑定format、attempt、user、date、tier、map_hash、rules_revision、初始局面hash与health。event绑定seq、command_id、action、server_elapsed_ms、结果码、state_hash;server_elapsed不得由客户端自填作为权威。服务器在ACK前持久化每事件摘要及终局root;客户端追加同一canonical记录。持久回执只含seq、服务器用时、结果码、状态hash及链hash;action来自客户端自己保留的原请求。可见棋盘delta单独作为实时输出,不嵌入持久回执。客户端缺少动作原文时无法仅靠摘要恢复录像。恶意重算文件hash无法匹配服务器已确认root。

原始事件只保存在客户端时,缺ACK、存储已满、录制中断、换设备没有完整原草稿,都可能无法生成完整录像。照常保留已确认通关/经验,但提示“录像不完整,无法提交本次竞榜”,下次重新尝试;不能偷偷从云端恢复一份并不存在的个人录像。恢复接口只给当前投影和必要回执,不伪造缺失历史;若客户端已持有完整前缀和可重取的ACK,则可补齐。

官方候选草稿仅本机,用户提前删除会失去该段提交能力。单项完成即可申请该榜候选并上传1段;综合缺失段可由同账号各来源设备分别上传,不要求提交设备持有三段。已核验段由服务器复用;原设备离线且缺段时保持等待,不能先入榜。四榜并不能保证所有跨端场景录像齐全,未默认采用上一轮可选的服务器全程临时存证;边界见跨设备规则

4. 成绩先行、录像后传#

sequenceDiagram
  participant C as 玩家设备
  participant S as 服务端/SQLite
  participant V as 验证工作线程
  C->>S: POST 指定榜scores,1或3段attempt与清单
  S->>S: 查本人服务器成绩,计算所选榜排序键,比较该榜Top10
  alt 不能进入Top10
    S-->>C: not_candidate,无上传授权
  else 可能进入Top10
    S-->>C: submission_id + 缺失段upload_id + 截止
    C->>S: PUT uploads,gzip游戏事件数据
    C->>S: POST complete
    S->>V: 有界解压/重演/核对服务器锚点
    V-->>S: 可信验证报告
    S->>S: 复核各受影响榜;原子发布四榜完整新generation
    S-->>C: published或outpaced/rejected/expired
  end
查看流程图源文
sequenceDiagram
  participant C as 玩家设备
  participant S as 服务端/SQLite
  participant V as 验证工作线程
  C->>S: POST 指定榜scores,1或3段attempt与清单
  S->>S: 查本人服务器成绩,计算所选榜排序键,比较该榜Top10
  alt 不能进入Top10
    S-->>C: not_candidate,无上传授权
  else 可能进入Top10
    S-->>C: submission_id + 缺失段upload_id + 截止
    C->>S: PUT uploads,gzip游戏事件数据
    C->>S: POST complete
    S->>V: 有界解压/重演/核对服务器锚点
    V-->>S: 可信验证报告
    S->>S: 复核各受影响榜;原子发布四榜完整新generation
    S-->>C: published或outpaced/rejected/expired
  end

预选事务:请求明确board_kind。单项只允许对应一段,overall必须同账号同日期三档齐全;每段为正式无伤完成,服务器重算排序键。统一检查日期、身份、观看锁/暴露屏障/退榜/处罚。只与所选榜已验证Top10比较,不拿未验证0秒抬门槛。初级候选不因中高级尚未完成而拒绝,综合候选也不因单项排名不佳而拒绝。

上传清单绑定每段压缩/展开hash、字节数、格式和attempt。每账号/日期/榜最多一个pending提交,总计最多4个;所有榜仍共用账号流量额度。授权截止不晚于ends_at,来源设备先登记官方段压缩清单(record-manifest,非正文),其他设备可引用已登记清单申请组合;清单缺失先返回SOURCE_MANIFEST_REQUIRED,不签发未绑定hash的授权。任何本人登录设备可上传它持有的缺失段;不能跨账号。已有核验段按game_id复用,单项与综合同段只存一份。多个pending引用同段时上传结束后再次检查唯一键,不重复归档。

一次成绩改善可分别形成该单项和综合候选。单项证据齐全可先发布;综合缺其他段则等待,不拖延单项。当前策略仍先成绩后上传,服务器临时全程存证没有默认启用。缺失原设备无法恢复时不给综合占位,已有有效单项名次和私人XP保留。

核验:鉴权/有效授权→流式限制压缩输入→限制展开字节/事件数/CPU→规范解码→hash与header→服务器原图从初始局面重演→操作合法性/顺序/计时/零伤/完成状态→服务器锚点root与终局一致。使用gzip封装的应用层二进制,不自动把整个HTTP请求当Content-Encoding解码;防代理与应用重复解压。坐标/时间采用差分和varint(时间差非负、越界拒绝),压缩对象是游戏事件,不是MP4屏幕视频。解析和解压失败时不发布半份录像。

发布事务:核验在工作线程完成;先将已验证Redis正文的TTL提升到原日public_until并确认持久化,再在SQLite短事务复核日期/资格/规则/当前阈值。录像写Redis、排名和元数据写DB,不存在跨库原子事务;预检后Redis故障可能导致已发布名次暂缺回放,必须如实显示。榜单DB提交后才写Redis缓存,缓存失败读DB回源,详见Redis方案。按已验证最佳重算受影响单项和综合榜,复制其他榜行,写新generation完整四榜再原子切日期指针;每榜最多10行,总最多40行。读者固定同一generation,不能出现单项新成绩和旧综合总分混合;某榜缺完整证据就保留它的旧合法结果。比赛事实/录像引用/sum/max由业务事务一致检查。

只有已核验段才进入公开best;未验证的更快段只用于潜在候选,验证失败不能替换旧纪录。每榜已核验候补可在日内递补;综合候补不依赖单项Top10,三段全部有证据即可。任何曾准备公开的正文按固定public_until保留,掉榜不主动缩短TTL;未公开候补到日切自动过期。这样不需要日切筛选清理job,但可能保留曾入榜而非最终Top10的记录,不能把最终60段当Redis全部存储上限。

上传期间可能被超越;返回outpaced而非保证名次。相同段只核验/归档一次,但在各榜分别判断资格。截止前没齐或没验完则过期;网络重试幂等,不产生第二份同game录像或重复排名。

5. 截止与历史冻结#

采用UTC日界线;D日有效区间 [D 00:00, D+1 00:00),北京时间每天08:00换日。当前日看榜时显示服务器剩余时间与“上传和验证也需在截止前完成”。不设置旧版5分钟整理期。

入榜必须在截止前完成:正式通关、证据完整上传、重演核验、排名发布事务。 截止前仅收到成绩/仅开始上传/验证排队都不够。后台不得在第二天用“昨晚已经开始”为由补发榜单;跨日局只继续普通进度。靠近截止无法按时完成的申请可返回 INSUFFICIENT_TIME,这个提前保护窗按实际验证队列与延迟预算设定 [待测试],不承诺最后一毫秒提交一定受理。

每次提交与发布都在同一写调度器校验服务器当前时间;SQL触发器额外检查数据库时钟,不能只依赖定时任务把status改成frozen。到期生成日期级冻结标志,同时锁住四榜最后一个已发布generation(全空为0);冻结任务延迟时读API仍按 now>=ends_at 返回frozen并只读现存指针。故障恢复先处理截止,拒绝旧候选再启动队列。冻结不是再重排一次。

严格边界按服务端序列化发布裁决点定义;发布事务不得跨日排队后回填旧时间。截止前预留事务/磁盘延迟预算,发现提交前已越界则回滚。磁盘故障造成未确认事务,不允许日后重新执行为新排名。UTC墙钟与单调时钟异常漂移时暂停新竞榜写入并标记平台事故,不能靠回拨服务器钟重开已冻结榜。

日期结束后:不接收新排名/新证据,不刷新best或重排、不递补。历史四榜仍分别显示原名次/原成绩。若复核作弊或玩家撤公开授权,只追加“取消资格/已撤回”注记、匿名化身份或移除播放文件,保留原位置的不可用占位,不让第11名升为第10名。这里冻结的是竞赛事实,不能用冻结要求强迫永久公开录像或个人信息。

历史录像在保留期内取消通关要求;默认允许游客浏览观看 [建议],保留短期观看会话与流量保护。历史练习不上传排名,观看历史日期不触发当日观看锁。公开视频保留原日结束后30天 [待确认][待测试];到期显示“录像已过期”,不删除名次或伪装成加载失败。

6. 当天观看权限与公开内容边界#

保留当日规则:注册账号在该UTC日内经服务器确认完成三档(可受伤通关)才可观看当天Top10录像。列表只显示元数据,不发棋盘缩略图/坐标。首次观看当天他人棋盘前提示“观看后今天不能继续刷新竞榜成绩”;已有四榜已发布成绩保留,观看锁作用于整日四榜。单项能早入榜不代表可提前观看其他档答案。未上传、未发布的候选在锁定后不再新发布;观看前完成的普通XP照常入账。

准备→释放→显示ACK三步:prepare只给不可解码的预备内容;release事务先建日期曝光屏障再给解码材料;正常播放器首帧绘制后ACK正式锁定。未释放就失败/取消不锁;释放后无ACK进入uncertain,阻止新成绩发布,不能靠超时/刷新自助解除。日切后该屏障不影响今天的新日期。

普通Web不能证明物理屏幕真的显示过,render_receipt只是协议证据。这是产品边界:恶意客户端拿到内容不ACK仍不能刷榜,诚实客户端释放后崩溃可能进入待确认,界面必须解释并允许确认结束竞榜后继续观看。已交付字节无法远程收回,截图/场外录屏不能杜绝。

历史路径无需日期资格、consent_to_rank_lock、exposure或rendered;仍校验原日期已结束、所请求段确为指定board_kind的冻结Top10、未移除且未到期。未来日期始终拒绝。当天每段/每块复查指定榜映射及当前generation、会话、资格、权限epoch和到期;退榜/权限撤销停止发新块。官方播放器清缓冲,但不声称能擦除恶意客户端已复制内容。

7. 本期范围#

本版没有直播、实时观战或PVP。日常离线游戏保持本地引擎;服务器在线裁决只用于当前每日普通/正式挑战。WSS用于操作者输入确认及榜单/本人候选状态通知,不提供其他玩家实时棋盘订阅。watch只接收已发布Top10录像资源,继续执行当日门槛、日期锁和历史开放规则。

8. 留存、删除、异常与验证#

数据保存原则
私人录像/录制草稿仅本机;私人同步/导出/迁移一律白名单排除
官方未提交草稿本机;不占个人云额度,不自动上传
当日操作摘要/当前状态SQLite最小锚点;无完整私人回放正文;终局后按申诉需求建议30天清理重数据
上传暂存gzip正文只在Redis,PXAT=授权截止;到期自然回收,SQLite仅状态/hash/key/尺寸;不设清理job
已核验候补未公开body的TTL到日切;曾准备公开者保留原public_until,即使后来掉榜;不安排日切扫描
官方正文/播放块Redis二进制与绝对TTL;body原日结束后30天为公榜建议,块TTL不超过body;自然过期、DB元数据和名次保留
排名快照/注记保留原排序与必要脱敏事实,不保存固定可识别昵称快照;展示昵称从用户资料投影

录像到期依赖Redis TTL,读取按元数据截止派生expired,不需job改状态。主动撤公开/账号删除先撤DB权限,再对已知Redis key发UNLINK;失败仍不可访问并待原TTL回收,其他账号/备份清理任务不受影响。以上新期限均 [待测试]。账号删除先置deleting/撤会话、结束正式局控制、撤播放、清凭据与私人数据/显示身份,再清无引用在线事实。冻结榜引用的最小不透明user/game/attempt标识可保留为脱敏引用壳,去设备、隐藏盘、动作摘要和自由文本PII;DDL禁止直接删冻结行导致名次消失。保留壳不等于保留可登录账号,实施删除migration必须显式处理外键依赖,不把普通“7天在线清理”承诺解读为连不可识别排名事实也硬删。备份恢复须重放外部删除清单,不能复活录像和身份。

SQLite设置foreign_keys/WAL/synchronous=FULL,短事务不执行解压、地图生成或网络I/O。服务忙拒绝新正式局/候选,不假ACK;已确认结果保留。服务故障无法证明持续公平的未结局标记invalid,不把停机当玩家违规。后台队列先检查截止和授权。

参见API经验与防作弊验收矩阵。SQL只验证约束,地图求解、重演、权限、deadline队列与浏览器行为需要实现后的端到端测试。

9. 版本记录#

版本日期变化
0.8.12026-09-13收紧录像大小/事件上限;双hash上传前去重;补流式拒收、配额、慢连接及验证资源保护
0.8.02026-09-13Redis限每日榜单缓存与官方录像TTL存储;录像正文移出SQLite,不设录像到期清理job;补跨库故障与持久化边界
0.7.02026-09-13移除直播入口/协议/三张专用表;观看仅限每日公榜录像,保留四榜与私人同步;整理审阅范围
0.6.02026-09-13初中高与综合四榜独立;单项1段/综合3段,录像共享、统一冻结、跨端分段提交;48项DDL检查通过
0.5.02026-09-13服务器出题;先成绩后压缩录像;严格日切冻结;历史观看开放;删除本版PVP,明确离线XP与防作弊信任边界
0.4.02026-09-13初步每日/直播/对战领域设计;本版已替代旧整理期、历史观看门槛与全量云过程归档