Mei help fan in willekeurige orakel mei help fan it foarbyld fan in lottery

Op in moarn kaam ik in artikel oer ferifiearje willekeurige getallengenerator op it Waves-platfoarm blockchain.

It totale byld wie dúdlik, mar de spesifike útfiering metoade wie net. Guon koades, hantekeningen, wat, wêr, wêrom?

Ferskate oerlis mei de skriuwer fan it orakel, as gefolch, it wie mooglik om te kombinearjen de tekening logika (implementearre yn PHP) mei in algoritme foar it krijen fan in willekeurich getal.

  1. Oan it begjin fan it toernoai/ronde freegje wy it earste diel fan 'e koade (R-koade) fan it orakel.

    Op dit stuit is d'r gjin ynformaasje oer it oantal spilers, it oantal priisplakken, de grutte fan priisbetellingen, of it bestean fan 'e lotterij yn it algemien. It orakel jout fia in transaksje in persoanlike willekeurige koade út, dy't dan mar ien kear brûkt wurde kin troch dyjingen dy't it frege hawwe. Trouwens, R-koade kin "kocht" wurde (dat betsjut dat de kosten fan 'e fersyktransaksje + kompensaasje oan' e orakel foar de antwurdtransaksje, dit is in bedrach fan sawat $ 0.015 by it hjoeddeistige taryf, de koade sels wurdt fergees útjûn ) ferskate kearen foarôf, om net te wachtsjen op de ûntfangst fan 'e antwurdtransaksje letter. Ik makke in lyts regelmjittich bywurke buffer yn 'e databank.

  2. It toernoai duorret normaal 60 blokken fan it Waves-platfoarm blockchain, op it stuit is it sawat 1 oere. It toernoai wurdt beskôge foltôge en sletten as nei 60 blokken binne der op syn minst twa kaartsjes yn it, oars it toernoai aktiviteit tiid wurdt ferlingd foar de folgjende 60 blokken.
  3. Fuort nei it sluten fan it toernoai generearje en stjoere wy in datumtransaksje (wy betelje der ek in kommisje fan likernôch $ 0.005 foar), as it nedich is, ferskate, wêryn alle betingsten fan 'e tekening binne opnommen en in bestelde list fan spilers (kaartsjes) dêr't wy moatte selektearje de winners.
  4. Op dit stadium hawwe wy al it earste diel fan 'e koade (R-koade) plus de transaksjedatum ID (TXID). Wy stjoere se foar ûndertekening oan it orakel yn 'e foarm fan gearhing (R-koade + TXID), wer betelje wy in kommisje + kompensaasje. It orakel kontrolearret de ûntfongen gegevens foar unykens en hearren, en as antwurd stjoert ús it twadde diel fan 'e koade (S-koade) yn sha256-formaat, dat is it útgongspunt foar de willekeurige getalgenerator.
  5. Om in willekeurich getal te krijen dat it folchoardernûmer fan it winnende kaartsje sil oanjaan, konvertearje wy de S-koade fan 'e sha256-binêre gegevens nei in heksadesimale (HEX) fertsjintwurdiging. Dan út de resultearjende HEX string, wy krije in nûmer. Wy krije de rest fan it dielen fan it resultearjende nûmer troch it oantal kaartsjes (all_tickets) en foegje 1 ta oan it resultaat (om it nûmer 1 foar all_tickets te krijen). As gefolch krije wy it searjenûmer fan 'e winner.
  6. As d'r, neffens de betingsten fan 'e tekening, ferskate winners binne, dan werhelje wy de foarige operaasjes yn in bedrach gelyk oan it oantal priisplakken. Yn dit gefal, eltse kear we fuortsmite út de list in kaartsje dat hat al wûn en ferminderjen all_tickets mei 1, en ynstee fan S-koade wy jouwe it foarige nûmer ûntfongen.

Litte wy nei in spesifyk echte foarbyld sjen, toernoai nûmer 119:

Totaal 7 tickets (alle_tickets)
Kaartsje kostet 50 munten (ynset)
Spultsjefergoeding 10% (fergoeding)

Neffens de betingsten fan de lotterij giet 30% nei it prizejild, d.w.s. yn dit gefal, 2 tickets moatte ûntfange in priis, de grutte fan dat wurdt berekkene neffens de formule (Bet * all_tickets-Fee) / 2.

1. Untfongen R-koade: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Nei't it toernoai slút, hawwe wy in list mei kaartsjes yn 'e foarm fan pearen: nûmer + adres (it adres fan' e beurs wêrfan betelling foar dielname oan it toernoai makke is). Tink derom dat adressen meie wurde werhelle, dit betsjut dat ien dielnimmer kocht ferskate kaartsjes foar ien toernoai dit is net ferbean troch de regels;

Ferstjoerde transaksjedatum: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Oanfrege S-koade: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV mei opmerking (R-koade + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Untfongen S-koade: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. De winners waarden bepaald.

6. Ferstjoerd betellingen

As gefolch hawwe wy in stap-foar-stap opname fan 'e priistekeningproseduere yn' e blockchain mei de mooglikheid om it op elk momint te kontrolearjen. It is hast ûnmooglik foar de organisator om teminsten de resultaten te manipulearjen, it sil net mear ûngemurken dwaan kinne;

determine the winner № 1

All_tickets:
Index: 1 Ticket:139
Index: 2 Ticket:141
Index: 3 Ticket:143
Index: 4 Ticket:145
Index: 5 Ticket:147
Index: 6 Ticket:149
Index: 7 Ticket:151

1. bin -> hex ( bin2hex(sha256(S-code)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596

2. hex -> gmp number: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342

3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4

4. modulo -> ticket: 4 -> 145

determine the winner № 2

All_tickets:

Index: 1 Ticket:139
Index: 2 Ticket:141
Index: 3 Ticket:143
Index: 4 Ticket:147
Index: 5 Ticket:149
Index: 6 Ticket:151

1. bin -> hex ( bin2hex(sha256(previous hex)) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0
2. hex -> gmp number: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. modulo -> ticket: 1 -> 139

End.

Boarne: www.habr.com

Add a comment