在抽奖接受任何一笔真实参与之前,我们用自己的钱在以太坊主网上完整跑了一轮——真的 USDC,真的 Chainlink VRF 随机数,规模是五万分之一。它跑通了。下面每一笔交易都在公开链上,你可以全部打开看。
| 步骤 | 在 Etherscan 上 |
|---|---|
| 买下第一张券 | 0xd6abe868…a90181 |
| …另外 39 笔购买交易 | 2,000 张券,合计 20.00 USDC |
| 向 Chainlink VRF 发起开奖请求 | 0xa9065817…1d9f9a |
| 随机数送达,本轮结算 | 0xe027c234…3be700 |
这一轮收进 20.00 USDC,付出 20.00 USDC。因为这是预演,同一个地址既是庄家也是每一位中奖者,所以钱全都回来了——但合约并不知道这件事,它完全按照真实一轮的方式做了分配。
中奖者由 Chainlink VRF v2.5 开出,它在给出随机数的同时附上一份密码学证明,证明这个数没有被动过手脚。证明会先在链上验证通过,我们的合约才被允许使用它。没有人——不是我们,不是矿工,也不是 Chainlink——能挑选中奖者。
我们刻意不用区块数据来做这件事。出块者在广播之前就能看到 prevrandao 这类值,完全可以悄悄把一次价值百万美元的开奖重掷一遍。Chainlink VRF 更贵,但值这个价。
| 请求 | 0xa9065817…1d9f9a |
| 履行 | 0xe027c234…3be700 |
| 应答耗时 | 84 秒 |
| 实际扣除的 LINK | 持有 50 作为储备,实扣 0.017217 |
100 张全部互不相同,全部落在 0–1,999 区间内。第一张被开出的券(1501,红色)拿走手表;其余 99 张拿现金。
按合约发放的先后顺序排列。1501 号券不在表内,因为它中的是手表——那是一件线下交付的实物,而不是一笔转账。
| # | 中奖券 | 已付 USDC |
|---|---|---|
| 1 | 1097 | 0.08 |
| 2 | 56 | 0.08 |
| 3 | 1962 | 0.08 |
| 4 | 468 | 0.08 |
| 5 | 1576 | 0.08 |
| 6 | 75 | 0.08 |
| 7 | 251 | 0.08 |
| 8 | 998 | 0.08 |
| 9 | 731 | 0.08 |
| 10 | 1999 | 0.08 |
| 11 | 391 | 0.08 |
| 12 | 766 | 0.08 |
| 13 | 1672 | 0.08 |
| 14 | 1065 | 0.08 |
| 15 | 869 | 0.08 |
| 16 | 1547 | 0.08 |
| 17 | 146 | 0.08 |
| 18 | 1788 | 0.08 |
| 19 | 887 | 0.08 |
| 20 | 558 | 0.08 |
| 21 | 1040 | 0.08 |
| 22 | 395 | 0.08 |
| 23 | 1370 | 0.08 |
| 24 | 846 | 0.08 |
| 25 | 1631 | 0.08 |
| 26 | 1581 | 0.08 |
| 27 | 696 | 0.08 |
| 28 | 755 | 0.08 |
| 29 | 986 | 0.08 |
| 30 | 1652 | 0.08 |
| 31 | 1664 | 0.08 |
| 32 | 625 | 0.08 |
| 33 | 1123 | 0.08 |
| 34 | 847 | 0.08 |
| 35 | 52 | 0.08 |
| 36 | 1471 | 0.08 |
| 37 | 895 | 0.08 |
| 38 | 747 | 0.08 |
| 39 | 598 | 0.08 |
| 40 | 1092 | 0.08 |
| 41 | 1755 | 0.08 |
| 42 | 1585 | 0.08 |
| 43 | 1514 | 0.08 |
| 44 | 763 | 0.08 |
| 45 | 1235 | 0.08 |
| 46 | 179 | 0.08 |
| 47 | 1503 | 0.08 |
| 48 | 913 | 0.08 |
| 49 | 1003 | 0.08 |
| 50 | 245 | 0.08 |
| 51 | 555 | 0.08 |
| 52 | 1388 | 0.08 |
| 53 | 213 | 0.08 |
| 54 | 619 | 0.08 |
| 55 | 1485 | 0.08 |
| 56 | 935 | 0.08 |
| 57 | 610 | 0.08 |
| 58 | 715 | 0.08 |
| 59 | 107 | 0.08 |
| 60 | 1158 | 0.08 |
| 61 | 965 | 0.08 |
| 62 | 1764 | 0.08 |
| 63 | 660 | 0.08 |
| 64 | 1453 | 0.08 |
| 65 | 1175 | 0.08 |
| 66 | 1810 | 0.08 |
| 67 | 659 | 0.08 |
| 68 | 633 | 0.08 |
| 69 | 47 | 0.08 |
| 70 | 830 | 0.08 |
| 71 | 743 | 0.08 |
| 72 | 201 | 0.08 |
| 73 | 461 | 0.08 |
| 74 | 589 | 0.08 |
| 75 | 1510 | 0.08 |
| 76 | 1919 | 0.08 |
| 77 | 883 | 0.08 |
| 78 | 1297 | 0.08 |
| 79 | 478 | 0.08 |
| 80 | 121 | 0.08 |
| 81 | 1829 | 0.08 |
| 82 | 1634 | 0.08 |
| 83 | 1523 | 0.08 |
| 84 | 1749 | 0.08 |
| 85 | 989 | 0.08 |
| 86 | 1386 | 0.08 |
| 87 | 576 | 0.08 |
| 88 | 741 | 0.08 |
| 89 | 480 | 0.08 |
| 90 | 258 | 0.08 |
| 91 | 1371 | 0.08 |
| 92 | 1206 | 0.08 |
| 93 | 1941 | 0.08 |
| 94 | 1400 | 0.08 |
| 95 | 484 | 0.08 |
| 96 | 1410 | 0.08 |
| 97 | 686 | 0.08 |
| 98 | 108 | 0.08 |
| 99 | 812 | 0.08 |
真的 USDC 动了,真的随机数到了,算术分毫不差,合约在无人干预的情况下把自己清空到最后一分钱。
一次跑通的预演说明的是:在没有人攻击它的时候,合约做的是对的事。至于它能不能扛住一个有一百万美元可赢的人,那是另一个问题,只有专业审计能回答。
| 作用 | 地址 |
|---|---|
| 预演用抽奖合约 | 0x65B0A55B0d303381b4bf0aF95D9c1cb67E257a1D |
| Keeper(无人值守运行) | 0xFEA128525A0787FC512Cd815AA0c5Ab34B1c7e1e |
| USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
| Chainlink VRF 协调器 | 0xD7f86b4b8Cae7D942340FF628F82735b7a20893a |
这个预演合约不是真实一轮会使用的那一个。它按五万分之一的规模配置,庄家和 guardian 地址都是测试钱包。生产合约会单独部署,它的地址会在这里和抽奖页面上公布,然后才会接受第一张券。