无需钱包
发起和参与都不用连接钱包、不用签名。用 X 登录(OAuth)或直接输入 X 用户名。链上交易由项目方运营地址代为签名并支付 Gas。
我们不要求你相信我们,而是让你能自己检查。
发起和参与都不用连接钱包、不用签名。用 X 登录(OAuth)或直接输入 X 用户名。链上交易由项目方运营地址代为签名并支付 Gas。
截止时,参与名单按固定规则整理(小写、去重、排序),计算 entriesHash,完整的 entries.json 公开可下载,它的哈希在开奖之前就写入合约。名单不做预先筛选,所有报名者都在里面。
运营方先把随机种子的哈希 keccak256(seed) 与名单哈希一起提交到合约。此时未来的区块哈希还不存在,运营方无法预知结果。
若干区块后公开 seed,合约计算 randomness = keccak256(seed ‖ entriesHash ‖ 之后某区块的哈希),再用固定算法得出中奖序号。同样的输入永远得到同样的结果。同一公式可以继续算出所有人的完整排名;有关注条件时,按排名依次检查,前 N 个满足条件的人中奖。
seed、区块哈希、随机数、候选人检查记录与中奖名单写成 results.json,公开下载;它的 sha256 由合约 finalize 写上链,每场只能写一次。文件改动一个字节,哈希就对不上。
任何人都可以下载名单与结果,用开源脚本对照链上哈希检查,并复算排名与中奖者。
颜色表示由谁执行:每一步都能在链上或公开文件里找到对应记录。
填写标题、奖品、名额、开奖时间;X 登录或输入用户名
X 登录(认证)或输入用户名,无需钱包
小写·去重·排序 → entries.json(公开下载),计算 entriesHash
合约记录 entriesHash、人数、名额、keccak256(seed)
N 个区块后公开 seed,合约算出随机数与完整排名
按排名依次检查关注条件,未通过跳过、下一位递补;results.json 存入 R2,sha256 写上链
verify.mjs 对照链上哈希检查并复算randomness = keccak256(seed ‖ entriesHash ‖ blockhash(commitBlock + revealDelay)) 排名 = keccak256(randomness ‖ nonce) mod 人数 (nonce = 0,1,2…,跳过重复,前 N 位 = 合约 winnersOf) 有关注条件时:按排名依次检查候选人,前 N 个“通过”的人中奖,跳过的人都记录原因
截止与开奖由后台定时任务每分钟自动推进;发起人也可以提前点击“立即截止并开奖”。
按场一次性付费,无订阅。用 USDT 或 BEM(BNB Chain / BEP‑20)转账即可,无需连接钱包、无需签名;用 BEM 支付享 8 折。
付款方式:选择档位后,系统显示该档位价格(30 分钟内有效)。向收款地址转入该金额即可:少 0.1 USD 以内也算,多付也算。链上确认后自动升级名额;若同时有多个订单符合同一笔转账,需要粘贴交易哈希核验。BEM 金额按下单时的 PancakeSwap 链上价格换算。人数满额后新的报名会被拒绝。
从详情页复制两个文件的链接(/files/raffles/<id>/entries.json、results.json),运行:
脚本会从链上读取 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、合约地址、交易链接与文件下载链接。
blockhashMissing。参与者永远免费,也不需要钱包或签名。发起人免费可办最多 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 在 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 登录参与。
只读取用户名与头像(users.read、tweet.read),不会代你发推,访问令牌用后即丢弃。条件校验使用的是项目方自己的数据源凭证(第三方 xapi.to 或 X 官方 API),只查询公开关系数据,不需要你授权额外权限。