Fair Poker · 德州扑克公平性开源密码学研究
Fair Poker 是一个非营利、纯兴趣的开源学术研究项目,研究一个问题:没有发牌服务器、没有中心牌库时,线上德州扑克能不能做到可验证的公平?牌堆由玩家浏览器共同加密洗牌,中继只转发消息、不发牌、不开牌;每一手都生成可下载、可本地重放复验的签名证据。我们只做能被你亲手验证的承诺。
这不是一个游戏平台
本项目不对公众提供任何游戏服务,也不是完备的商业产品。在线演示向公众开放,用于协议自测与体验;演示内筹码为虚拟测试筹码,无任何现实价值,不可充值、提现或兑换。想研究或体验的朋友,请下载 全部开源代码,在自己的电脑上搭建运行——我们提供思路与代码,不提供服务。
运行时权力边界(可在源码里查到)
- 官方零裁判、零踢人:Cloudflare Worker 只为签名消息排序、转发,并报告谁在线——它不计算座位、回合、轮到谁、赢家或筹码(这些牌局逻辑已从中继移除,可在源码
buildRoomState里查到只剩在线状态)。没有任何协议路径把玩家踢出牌局、没收筹码或改写赢家。掉线只会触发自动重连,决定权始终在你的签名行动、共识超时或共识作废。 - 浏览器即唯一权威:每个浏览器用同一套确定性 reducer,从那条签名事件日志算出全部牌桌状态(座位 / 底池 / 轮到谁 / 赢家 / 战绩)。两个浏览器读同一份日志,算出的状态必然一致;刷新或瞬时断网回归后,浏览器从日志重新算出完全相同的状态——不会把你"瞬移"到观战席,下注也不会两边对不上。战绩本地留存,刷新不丢。
- 中继永远看不到底牌:私有发牌的逐卡解密钥用收牌方公钥端到端密封(RSA-OAEP),并绑定 sender / recipient / round / cardOffset;重发到任何其它收件人或卡位都会被拒。中继全程只看到密文。
- 解密钥只在本手牌期间暂存:每张牌的逐卡解密钥仅在你正在进行的这一手牌期间暂存于本机,断线/刷新/关闭后重连能恢复这一手;牌局一结束即删除,不长期保留。
每一局都自带证据
- 每手 4 灯公平校验:每局结束自动跑 4 项校验——牌堆完整 · 全员参与洗牌 · 记录指纹一致 · 签名齐全。通过亮"已验证"印,异常红灯并提示下载证据。
- 每手签名 hash-chain transcript:事件顺序、签名、下注、奖池、公共牌、摊牌全部进入哈希链,可下载、可本地 verifier 重放复验。
- 客户端 CID 实时校验:浏览器运行时从 ai.json 拉权威 CID,与当前页面 CID 比对,安全面板显示「已锁定 / 不符 / 未固定」。
- 每事件签名 + 默认拒收未签名:GameRoom 默认 rejectUnsignedEvents = true;签名绑定 tableId,跨桌重放被拒;每会话绑定 sessionNonce 防同会话重放/乱序。
- 验证器与现场算账逐分一致:可下载的离线验证器和现场用的是同一套规则算筹码结果——弃牌结束与摊牌(含边池/比牌赢家)两条路径都有 CI 测试逐分对齐,二者永远不会悄悄分叉。
- 桌面控制按钮越权可追责:协议层动不了你的筹码或牌(那些必须本人签名);若有人非房主擅自改设置 / 重开报名,离线验证器会在可复验记录里标注出来、追责到具体签名者。
已堵上的漏洞
- 密码永不出本机:登录改发浏览器派生的 authSecret,服务端只存其哈希,永远不接触明文密码;密钥库用密码派生密钥本地加密,密文上传,永不解密。
- 中继 token 出 URL:鉴权 token 改走 WebSocket 子协议,不再进代理、CDN 或访问日志(同时兼容 Chrome 149+ 强制 echo 握手)。
- 1024 位 SRA 加密 + 二次剩余编码:发牌加密用 1024 位 mental-poker 参数(2048 位模数),并设 2048 位上限防超大参数卡死全场;牌面编码成二次剩余,连"残差指纹"也不泄露——任何人(含运营方)零钥匙都推断不出隐藏的底牌。
- 牌堆做手脚当场作废:开牌时一旦发现同一张牌出现两次(合法 52 张牌绝不可能),即判定牌堆被篡改,自动作废该手、退还筹码——做手脚的牌堆根本无法被打出来。
- 断线规则简化到极简:可恢复掉线 → 无损自动恢复;真正离开 → 本手作废、全额退还、整桌结束建议换桌——没有罚款、没有"操作员代踢"。
- auto-reconnect + 消息重放:WS 断开 500ms→10s 指数退避自动重连,重连后按 sinceSeq 重放,状态不丢。
- 事件全部严格 schema 校验:下注 / 弃牌 / 设置 / 牌堆 / 密钥进状态机前结构校验,畸形 / 越界 / 非整数下注被拒,关闭异常输入造成的状态污染和拒绝服务面。
- verifier 覆盖全部事件类型:离线 transcript 验证器不再静默跳过任何类型;摊牌阶段重复明文检查、按签名重建 finalHash。
- source fingerprint 覆盖完整信任边界:指纹不再只覆盖发牌核心,还包含认证 / 传输 / 启动 / 身份相关文件。
官方证据资源
- 透明度报告
- 公开证据状态
- 机器可读证据状态
- 独立验证指南
- 安全白皮书
- 已加固内容与已知差距(诚实披露)
- 最新源码发布清单
- AI 可读 JSON 摘要
- AI 可读站点摘要
- AI / 爬虫全站合订本(单页含所有公开页面)
权威发布身份
权威发布身份以 source/release.json 和 ai.json 中的当前组合为准:牌局客户端 CID、源码包 CID、压缩包 SHA256 和源码指纹。如果缓存页面、镜像或第三方摘要显示不同组合,应视为过期副本,并回到权威发布文件比对。
诚实边界
以上封的是"运营方单方作弊"路径。线下串通、屏幕共享、可验证洗牌零知识证明、完整 OPAQUE / SRP 抗离线爆破属于已知差距,如实列在 路线图,不用绝对化措辞掩盖。这也是本项目自称"研究原型"而非"完备产品"的原因。
联系我们
支持、Bug 提交、安全线索和授权事务:开源代码Source code support@fairpoker.app