返回幸运抽奖

中奖结果如何核算

本页说明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

查看固定drand链信息

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. 复核结果

  1. 用已公开seed重新计算承诺哈希,与开轮公示值比较。
  2. 核对drand链、轮次、签名与randomness。
  3. 计算mixedSeed,再执行号码池算法。
  4. 将排序后的全部号码与本轮最终公示号码比较。揭晓尚未完成时只显示已公开部分,不能当作完整结果。

随机领号、自主选号及批量选号只改变你持有哪些号码,不改变结果推导规则,也不会提高某个号码本身的中奖概率。私密奖品内容不属于公开复核参数。

旧轮次说明

旧 700sb-draw-v1 轮次不使用drand:承诺输入是["700sb-draw-v1",id,total,count,seed],号码算法直接使用seed。旧轮次结果在开轮时已生成,不能称为“管理员在开奖前也不知道结果”。没有完整公平参数的更早历史轮次,不能用此说明补造证明。