中奖结果如何核算
本页说明700sb现行计算步骤。实际复核请打开抽奖页的“哈希公示与校验”,使用对应轮次公开的参数;不要混用不同轮次或不同算法版本。
1. 新轮次:先承诺,再等待未来信标
算法版本为 700sb-drand-v2。开轮时产生32字节随机种子seed(64位小写十六进制),先公开承诺哈希,种子暂不公开。设轮次ID为id、总号码数为total、奖品数为count:
chain = "8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce" commitment = SHA256(JSON.stringify([ "700sb-drand-v2", id, total, count, chain, seed ]))
所有号码领完时锁定至少30秒后的未来drand信标轮次。开奖worker验证固定链、固定轮次及BLS签名,不因失败更换信标轮次。信标发布后才计算结果。
2. 核对公开的随机信标
在校验面板查看beaconRound、randomness和signature,可到下方公开来源核对对应轮次(将ROUND替换为信标轮次):
https://api.drand.sh/8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce/public/ROUND
randomness应等于signature十六进制解码后的字节SHA-256。这个哈希检查不能代替BLS签名真实性验证,完整独立核验还需使用该链公钥验证BLS。
3. 混合种子
mixedSeed = SHA256(JSON.stringify([ "700sb-drand-v2", seed, chain, beaconRound, randomness ]))
所有SHA-256输入均按UTF-8编码,输出小写十六进制;JSON.stringify不加空格,ID、号码数、奖品数、计数器及信标轮次使用数字类型。
4. 无放回抽取中奖号码
建立1到total的号码池,counter从0开始。虽然外层版本是v2,号码推导内部标签仍是 700sb-draw-v1,复算时不要替换。
pool = [1, 2, ..., total]
result = []; counter = 0
while result.length < count:
size = pool.length
limit = floor(4294967296 / size) * size
digest = SHA256(JSON.stringify([
"700sb-draw-v1", mixedSeed, id, total, count, counter
]))
counter += 1
value = 将digest前8位十六进制转成无符号整数
if value >= limit: 跳过并继续下一次循环
index = value % size
result.push(pool[index])
pool[index] = pool[pool.length - 1]
pool.pop()
result按数值从小到大排序拒绝采样避免简单取模偏差,无放回确保中奖号码不重复。排序后的号码按奖品原始录入顺序逐份对应。每10秒揭晓一个只是展示节奏,不会重新抽取。
5. 复核结果
- 用已公开seed重新计算承诺哈希,与开轮公示值比较。
- 核对drand链、轮次、签名与randomness。
- 计算mixedSeed,再执行号码池算法。
- 将排序后的全部号码与本轮最终公示号码比较。揭晓尚未完成时只显示已公开部分,不能当作完整结果。
随机领号、自主选号及批量选号只改变你持有哪些号码,不改变结果推导规则,也不会提高某个号码本身的中奖概率。私密奖品内容不属于公开复核参数。
旧轮次说明
旧 700sb-draw-v1 轮次不使用drand:承诺输入是["700sb-draw-v1",id,total,count,seed],号码算法直接使用seed。旧轮次结果在开轮时已生成,不能称为“管理员在开奖前也不知道结果”。没有完整公平参数的更早历史轮次,不能用此说明补造证明。