跳到主要内容
BNB Chain · 智能合约开奖 · 链上存哈希

X 抽奖,
每一步都摆在链上。

tapeXO 是一个不需要钱包的 X/Twitter 抽奖工具:用 X 登录或输入用户名即可参与。名单在开奖前冻结,哈希写入链上,中奖结果由合约计算,任何人都能自己复算一遍。

  • 无需钱包 / 签名
  • 名单哈希上链
  • commit‑reveal 开奖
  • 结果可复算
0
参与者需要的钱包与签名
~21万 Gas
每场链上成本(commit + reveal + finalize)
2
上链哈希:entriesHash 与 resultsHash
100%
可用公开数据复算的开奖步骤
01 · 公平机制

为什么说它公平

我们不要求你相信我们,而是让你能自己检查。

01

无需钱包

发起和参与都不用连接钱包、不用签名。用 X 登录(OAuth)或直接输入 X 用户名。链上交易由项目方运营地址代为签名并支付 Gas。

02

名单先冻结

截止时,参与名单按固定规则整理(小写、去重、排序),计算 entriesHash,完整的 entries.json 公开可下载,它的哈希在开奖之前就写入合约。名单不做预先筛选,所有报名者都在里面。

03

commit‑reveal

运营方先把随机种子的哈希 keccak256(seed) 与名单哈希一起提交到合约。此时未来的区块哈希还不存在,运营方无法预知结果。

04

确定性开奖

若干区块后公开 seed,合约计算 randomness = keccak256(seed ‖ entriesHash ‖ 之后某区块的哈希),再用固定算法得出中奖序号。同样的输入永远得到同样的结果。同一公式可以继续算出所有人的完整排名;有关注条件时,按排名依次检查,前 N 个满足条件的人中奖。

05

结果哈希上链

seed、区块哈希、随机数、候选人检查记录与中奖名单写成 results.json,公开下载;它的 sha256 由合约 finalize 写上链,每场只能写一次。文件改动一个字节,哈希就对不上。

06

人人可验证

任何人都可以下载名单与结果,用开源脚本对照链上哈希检查,并复算排名与中奖者。

02 · 流程

开奖流程

颜色表示由谁执行:每一步都能在链上或公开文件里找到对应记录。

用户运营方(Cloudflare Worker,代付 Gas)XRaffle 合约(BNB Chain)公开文件(Cloudflare R2,链上只存哈希)
  1. 01

    发起抽奖

    用户

    填写标题、奖品、名额、开奖时间;X 登录或输入用户名

  2. 02

    参与报名

    用户

    X 登录(认证)或输入用户名,无需钱包

  3. 03

    冻结名单

    运营 Worker → R2

    小写·去重·排序 → entries.json(公开下载),计算 entriesHash

  4. 04

    Commit

    运营 Worker → XRaffle 合约

    合约记录 entriesHash、人数、名额、keccak256(seed)

  5. 05

    Reveal

    XRaffle 合约

    N 个区块后公开 seed,合约算出随机数与完整排名

  6. 06

    校验候选 · 结果上链

    运营 Worker → R2 + 合约 finalize

    按排名依次检查关注条件,未通过跳过、下一位递补;results.json 存入 R2,sha256 写上链

任何人都可验证下载 entries.json / results.json,用 verify.mjs 对照链上哈希检查并复算
randomness.txt
randomness = keccak256(seed ‖ entriesHash ‖ blockhash(commitBlock + revealDelay))
排名 = keccak256(randomness ‖ nonce) mod 人数   (nonce = 0,1,2…,跳过重复,前 N 位 = 合约 winnersOf)
有关注条件时:按排名依次检查候选人,前 N 个“通过”的人中奖,跳过的人都记录原因

截止与开奖由后台定时任务每分钟自动推进;发起人也可以提前点击“立即截止并开奖”。

03 · 最新抽奖

最新抽奖

查看全部
04 · 价格

价格

按场一次性付费,无订阅。用 USDT 或 BEM(BNB Chain / BEP‑20)转账即可,无需连接钱包、无需签名;用 BEM 支付享 8 折。

免费
0 USDT
最多 100 人参与
  • 全部公平机制
  • 名单与结果哈希上链
  • 关注条件
免费发起
500 人
1 USDT
或 BEM 支付 8 折
  • 最多 500 人参与
  • 同免费版全部功能
  • 截止前可随时升级
选择
最受欢迎
2,000 人
3 USDT
或 BEM 支付 8 折
  • 最多 2,000 人参与
  • 同免费版全部功能
  • 截止前可随时升级
选择
10,000 人
10 USDT
或 BEM 支付 8 折
  • 最多 10,000 人参与
  • 同免费版全部功能
  • 适合大型活动
选择

付款方式:选择档位后,系统显示该档位价格(30 分钟内有效)。向收款地址转入该金额即可:少 0.1 USD 以内也算,多付也算。链上确认后自动升级名额;若同时有多个订单符合同一笔转账,需要粘贴交易哈希核验。BEM 金额按下单时的 PancakeSwap 链上价格换算。人数满额后新的报名会被拒绝。

05 · 验证

如何自己验证

方法一:验证脚本

从详情页复制两个文件的链接(/files/raffles/<id>/entries.json、results.json),运行:

node worker/verify.mjs <entries 链接> <results 链接>

脚本会从链上读取 entriesHash(commit)和 resultsHash(Finalized 事件),检查 keccak256(entries.json) 与 sha256(results.json) 是否一致,再复算随机数、排名和候选人检查记录。

方法二:直接查合约

  • raffles(id):核对 seedHash == keccak256(seed)、entriesHash、人数与名额。
  • 核对区块哈希等于 blockhash(commitBlock + revealDelay)。
  • deriveWinners(randomness, n, k):纯函数,任何人可调用复算。
  • winnersOf(id):由链上随机数算出的排名前 N 位;Finalized 事件:结果文件的 resultsHash。

每个抽奖详情页都列出 entriesHash、seed、区块哈希、随机数、resultsHash、合约地址、交易链接与文件下载链接。

06 · 局限

诚实说明:它不能保证什么

  • 运营方可以选择不公开 seed。扣留无法被阻止,但 commit 记录永久在链上,未开奖的抽奖一目了然。
  • 输入用户名不能证明账号归属。只有 X 登录的参与会标记 ✔;同一网络最多 5 个未登录报名。发起人可以设置“仅限 X 登录参与”。
  • 关注条件的校验有局限。只有项目方配置了校验数据源,才会在开奖后按排名检查候选人;否则排名前 N 位直接中奖,由发起人核对。“是否关注”的判定无法事后重放:排名和跳过记录人人可验证,但每次检查的结果只能相信数据源当时的返回。当前计划使用的数据源是第三方服务 xapi.to(转接 fapi.uk),并非 X 官方 API,数据准确性取决于该第三方;查询失败会重试一次;仍无法确认时,默认跳过此人并记录为“无法确认”(项目方可配置为保留)。目前只支持“关注账号”条件,不支持点赞、转发等条件。
  • 区块哈希理论上可被出块者影响(代价很高);若公开晚于 256 个区块,区块哈希为 0,合约会标记 blockhashMissing。
  • 合约尚未经过第三方审计。
07 · FAQ

常见问题

参与需要钱包或付费吗?

参与者永远免费,也不需要钱包或签名。发起人免费可办最多 100 人的抽奖;更多名额按场一次性付费(1 / 3 / 10 USDT,BEM 8 折),付款只需普通转账,不用连接钱包。链上 Gas 由项目方运营地址支付。

付款后多久生效?转错金额怎么办?

转账达到所需区块确认后(通常 1–2 分钟)自动升级;也可粘贴交易哈希立即核验。系统按“币种 + 收款地址 + 订单有效期 + 金额不少于价格减 0.1 USD”匹配转账,多付也算。只有恰好一个订单符合时才自动升级;若有多个订单同时符合,请粘贴交易哈希核验。同一笔交易只能用于一个订单。少付超过 0.1 USD,或订单过期后才转账,都需要联系项目方人工处理。

文件不在链上,会不会被换掉?

链上只存两个哈希:commit 时的 entriesHash(keccak256),以及 finalize 时的 resultsHash(sha256,每场只能写一次)。完整文件放在 Cloudflare R2 公开下载,这样每场抽奖只需约 21 万 Gas。文件可以被删除,但不能被悄悄修改:任何改动都会和链上哈希对不上。建议想留证的人自己保存一份文件。

运营方能不能偷偷改名单?

名单的哈希在开奖前就写入合约;之后任何改动都会让哈希对不上,验证即失败。

运营方能不能挑一个对自己有利的 seed?

seed 在 commit 时就被哈希锁定,而结果还取决于 commit 之后才产生的区块哈希,所以提交时无法知道结果。运营方唯一能做的是不公开——这会在链上留下痕迹。

可以设置参与条件吗?

可以要求“关注某些账号”(最多 5 个),详情页会显示“去关注”按钮。目前不支持点赞、转发等条件。开奖时不会预先筛掉任何人:完整名单冻结上链,开奖后按链上随机数得到的排名依次检查候选人。通过的人中奖,未关注的人被跳过并记录原因,由下一位递补,直到凑满名额、名单查完,或达到检查上限(默认 max(50, 名额×10) 人)。每一位被检查的人、结果和时间都写入 results.json。未配置数据源时,排名前 N 位直接中奖,需要发起人自行核对。

校验数据从哪里来?

项目方可选择第三方服务 xapi.to(其背后是 fapi.uk 提供的 X 数据接口)或 X 官方 API。tapeXO 默认配置为 xapi.to,这是第三方数据源,不是 X 官方,结果仅供参考;所用数据源会记录在 entries.json 和 results.json 中。

开奖后才检查,会不会被暗箱操作?

不会悄悄改顺序:排名完全由链上随机数决定,任何人都可以用 verify.mjs 重算。results.json 按顺序列出每一位被检查的候选人,包括结果、原因和时间;被跳过的人一定有记录。脚本会检查顺序是否与重算一致、是否有人没有原因就被跳过、中奖者是否就是前 N 个通过的人。脚本无法证明的是数据源当时返回的“是否关注”是否属实。

为什么有的人显示“无法确认”?

数据源查询失败、返回格式无法解析、超出调用上限,或(使用官方 API 时)大账号的粉丝列表只抓取了最新一部分。这些情况不代表没有关注;系统会先重试一次,仍无法确认时默认跳过并标注“无法确认”,跳过记录公开可查。

同一个人能报名多次吗?

同一用户名只算一次(不区分大小写)。但输入用户名无法证明身份,建议用 X 登录参与。

X 登录会拿到我的什么权限?

只读取用户名与头像(users.read、tweet.read),不会代你发推,访问令牌用后即丢弃。条件校验使用的是项目方自己的数据源凭证(第三方 xapi.to 或 X 官方 API),只查询公开关系数据,不需要你授权额外权限。

开一场让人信服的抽奖

名单冻结、随机数上链、结果可复算——全程不需要钱包。