Avant que la tombola n'accepte la moindre participation réelle, nous avons fait tourner un tour complet sur le mainnet Ethereum avec notre propre argent — de vrais USDC, un vrai aléa Chainlink VRF, à un cinquante-millième de la taille. Ça a marché. Chaque transaction ci-dessous est sur la chaîne publique et vous pouvez toutes les ouvrir.
| Étape | Sur Etherscan |
|---|---|
| Premier billet acheté | 0xd6abe868…a90181 |
| …39 autres transactions d'achat | 2 000 billets, 20,00 USDC au total |
| Tirage demandé à Chainlink VRF | 0xa9065817…1d9f9a |
| Aléa livré et tour réglé | 0xe027c234…3be700 |
Le tour a collecté 20,00 USDC et versé 20,00 USDC. Comme il s'agissait d'une répétition, la même adresse était la maison et tous les gagnants, donc tout est revenu — mais le contrat l'ignorait, et a réparti exactement comme il le fera lors d'un vrai tour.
Les gagnants sont tirés par Chainlink VRF v2.5, qui produit un nombre aléatoire accompagné d'une preuve cryptographique qu'il n'a pas été altéré. La preuve est vérifiée on-chain avant que notre contrat ait le droit de s'en servir. Personne — ni nous, ni un mineur, ni Chainlink — ne peut choisir les gagnants.
Nous n'utilisons délibérément pas les données de bloc pour cela. Un proposeur de bloc peut voir des valeurs comme prevrandao avant publication, et pourrait discrètement relancer un tirage valant un million de dollars. Chainlink VRF coûte plus cher et le vaut.
| Requête | 0xa9065817…1d9f9a |
| Réponse | 0xe027c234…3be700 |
| Délai de réponse | 84 secondes |
| LINK réellement facturés | 0,017217 sur 50 gardés en réserve |
Tous les 100 distincts, tous dans la plage 0–1 999. Le premier billet tiré (1501, en rouge) emporte la montre ; les 99 autres emportent les espèces.
Dans l'ordre où le contrat les a livrés. Le billet 1501 est absent parce qu'il a gagné la montre, un objet physique remis hors chaîne plutôt qu'un transfert.
| # | Billet gagnant | USDC versés |
|---|---|---|
| 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 |
De vrais USDC ont circulé, un vrai aléa est arrivé, l'arithmétique est tombée juste, et le contrat s'est vidé jusqu'au dernier centime sans que personne n'intervienne.
Une répétition réussie montre que le contrat fait ce qu'il faut quand personne ne l'attaque. C'est une autre question que celle de savoir s'il résiste à quelqu'un qui a un million de dollars à gagner, et seul un audit professionnel répond à la seconde.
| Rôle | Adresse |
|---|---|
| Tombola de répétition | 0x65B0A55B0d303381b4bf0aF95D9c1cb67E257a1D |
| Keeper (le fait tourner sans surveillance) | 0xFEA128525A0787FC512Cd815AA0c5Ab34B1c7e1e |
| USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
| Coordinateur Chainlink VRF | 0xD7f86b4b8Cae7D942340FF628F82735b7a20893a |
Ce contrat de répétition n'est pas celui qu'utilisera un vrai tour. Il est configuré à un cinquante-millième de l'échelle, et ses adresses de maison et de gardien sont le portefeuille de test. Le contrat de production est déployé séparément et son adresse sera publiée ici et sur la page de la tombola avant qu'il n'accepte le moindre billet.