🔐 COMMIT-REVEAL 可证明公平
盖楼抽奖 · 公平性存证
中奖结果由开奖前已锁定的密码学种子与全体参与者快照共同决定。主办方无法预测、无法操纵;开奖后任何人都能用公开数据独立复算,亲手核对中奖名单。
✅ 公平性验证通过
承诺一致 SHA256(seed)=commitHash:通过 · 开奖复算 finalSeed:通过
✓
承诺 Commit
创建时生成秘密种子,公开其 SHA-256 哈希,种子从此锁定。
✓
参与封存
每条有效回复记入快照,楼层与顺序公开不可改。
✓
揭示 Reveal
已公开原始种子,可验证哈希一致。
serverSeed(已揭示)
2113b428b8c41d6c04c296a00466c26cc1b9f29072a31132618e856c1e96e85b
commitHash
0b24b06306b6081bb8d927e6b3bc0f11daa98da4aa15245adf60f08b692f7d55
参与者快照哈希 snapshotHash
ffcaecd2f8bfe3476c14d2fa600b816d3e29c33ce5f660d94b9815e982cf8cbf
finalSeed = HMAC(serverSeed, snapshotHash)
58e735d38c61faf98cda461cc9649b119a73c10287a9de8a5c94a3e79003938b
参与者快照(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 名 → 与公开中奖楼层一致