HeapSeek

开发者的技术交流社区

关于小黑屋帮助FAQ协议
HeapSeek @ 2026

lottery

盖楼抽奖验证

Commit-Reveal 公平性验证

🔐 COMMIT-REVEAL 可证明公平

盖楼抽奖 · 公平性存证

中奖结果由开奖前已锁定的密码学种子与全体参与者快照共同决定。主办方无法预测、无法操纵;开奖后任何人都能用公开数据独立复算,亲手核对中奖名单。

✅ 公平性验证通过
承诺一致 SHA256(seed)=commitHash:通过  ·  开奖复算 finalSeed:通过
✓
承诺 Commit
创建时生成秘密种子,公开其 SHA-256 哈希,种子从此锁定。
✓
参与封存
每条有效回复记入快照,楼层与顺序公开不可改。
✓
揭示 Reveal
已公开原始种子,可验证哈希一致。
✓
复算验证
用公开数据复算,结果与中奖名单一致。
serverSeed(已揭示)
2113b428b8c41d6c04c296a00466c26cc1b9f29072a31132618e856c1e96e85b
commitHash
0b24b06306b6081bb8d927e6b3bc0f11daa98da4aa15245adf60f08b692f7d55
参与者快照哈希 snapshotHash
ffcaecd2f8bfe3476c14d2fa600b816d3e29c33ce5f660d94b9815e982cf8cbf
finalSeed = HMAC(serverSeed, snapshotHash)
58e735d38c61faf98cda461cc9649b119a73c10287a9de8a5c94a3e79003938b
中奖楼层 winningFloors
[3]
参与者快照(3 人,已去重)
[ { "floor": 1, "user": 7 }, { "floor": 2, "user": 3 }, { "floor": 3, "user": 5 } ]
离线复算脚本(复制即可运行)
// 任何人都能离线复算(Node 或浏览器均可,需 crypto) const { createHash, createHmac } = require("node:crypto") const serverSeed = "2113b428b8c41d6c04c296a00466c26cc1b9f29072a31132618e856c1e96e85b" const snapshot = [{"floor":1,"user":7},{"floor":2,"user":3},{"floor":3,"user":5}] // 去重后按楼层排序的参与者 // 1) 验证承诺:应等于 commitHash console.log(createHash("sha256").update(serverSeed).digest("hex") === "0b24b06306b6081bb8d927e6b3bc0f11daa98da4aa15245adf60f08b692f7d55") // 2) 复算 finalSeed const snapshotHash = createHash("sha256").update(JSON.stringify(snapshot)).digest("hex") const finalSeed = createHmac("sha256", serverSeed).update(snapshotHash).digest("hex") // 3) 用 finalSeed 链式 SHA256 派生 rng,Fisher-Yates 洗牌取前 N 名 → 与公开中奖楼层一致
站点 Logo
站点 Logo
HeapSeek