Brug af et tilfældigt orakel ved hjælp af eksemplet med et lotteri

En morgen faldt jeg over en artikel om verificerbar tilfældig talgenerator på Waves platformen blockchain.

Det overordnede billede var klart, men den specifikke implementeringsmetode var det ikke. Nogle koder, signaturer, hvad, hvor, hvorfor?

Flere konsultationer med forfatteren af ​​oraklet, som et resultat, var det muligt at kombinere tegnelogikken (implementeret i PHP) med en algoritme til at opnå et tilfældigt tal.

  1. Ved starten af ​​turneringen/runden anmoder vi oraklet om den første del af koden (R-koden).

    På nuværende tidspunkt er der ingen information om antallet af spillere, antallet af præmiepladser, størrelsen af ​​præmiebetalinger eller eksistensen af ​​lotteriet generelt. Oraklet udsteder gennem en transaktion en personlig tilfældig kode, som derefter kun kan bruges én gang og kun af dem, der har anmodet om det. I øvrigt kan R-kode "købes" (hvilket betyder omkostningerne ved anmodningstransaktionen + kompensation til oraklet for svartransaktionen, dette er et beløb på omkring $0.015 til den aktuelle kurs, selve koden udstedes gratis ) flere gange i forvejen, for ikke at vente på modtagelsen af ​​svartransaktionen senere. Jeg lavede en lille jævnligt opdateret buffer i databasen.

  2. Turneringen varer normalt 60 blokke af Waves platform blockchain, i øjeblikket er det cirka 1 time. Turneringen anses for afsluttet og lukket, hvis der efter 60 blokke er mindst to billetter i den, ellers forlænges turneringsaktivitetstiden for de næste 60 blokke.
  3. Umiddelbart efter turneringens afslutning genererer og sender vi en datotransaktion (vi betaler også en kommission på ca. $0.005 for det), om nødvendigt flere, hvor alle betingelserne for trækningen er registreret og en bestilt liste over spillere (billetter) hvorfra vi skal udvælge vinderne.
  4. På dette stadium har vi allerede den første del af koden (R-kode) plus transaktionsdato-ID (TXID). Vi sender dem til underskrift til oraklet i form af sammenkædning (R-kode + TXID), igen betaler vi en kommission + kompensation. Oraklet tjekker de modtagne data for unikke og tilhørsforhold, og sender os som svar den anden del af koden (S-kode) i sha256-format, som er udgangspunktet for tilfældig talgeneratoren.
  5. For at opnå et tilfældigt tal, der vil angive sekvensnummeret på den vindende kupon, konverterer vi S-koden fra sha256 binære data til en hexadecimal (HEX) repræsentation. Så fra den resulterende HEX-streng får vi et tal. Vi får resten af ​​at dividere det resulterende tal med antallet af billetter (alle_billetter) og tilføje 1 til resultatet (for at få tallet 1 før alle_billetter). Som et resultat får vi serienummeret på vinderen.
  6. Hvis der i henhold til betingelserne for trækningen er flere vindere, gentager vi de foregående operationer i et beløb svarende til antallet af præmiepladser. I dette tilfælde fjerner vi hver gang en billet, der allerede har vundet, fra listen og reducerer alle_billetter med 1, og i stedet for S-kode angiver vi det tidligere modtagne antal.

Lad os se på et specifikt rigtigt eksempel, turnering nr. 119:

I alt 7 billetter (alle_billetter)
Billet koster 50 mønter (væddemål)
Spillegebyr 10 % (gebyr)

Ifølge betingelserne for lotteriet går 30% til præmiepengene, dvs. i dette tilfælde skal 2 billetter modtage en præmie, hvis størrelse er beregnet efter formlen (Bet*all_tickets-Fee)/2.

1. Modtaget R-kode: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Efter turneringens afslutning har vi en liste over billetter i form af par: nummer + adresse (adressen på den tegnebog, hvorfra betalingen for deltagelse i turneringen blev foretaget). Bemærk venligst at adresser kan gentages, det betyder at én deltager har købt flere billetter til én turnering, dette er ikke forbudt i henhold til reglerne.

Transaktionsdato sendt: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Anmodet S-kode: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV med kommentar (R-kode + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Modtaget S-kode: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Vinderne blev kåret.

6. Sendte betalinger

Som et resultat har vi en trin-for-trin registrering af præmietrækningsproceduren i blockchain med mulighed for at tjekke den til enhver tid. Det er næsten umuligt for arrangøren at manipulere resultaterne, i det mindste vil det ikke længere være muligt at gøre det ubemærket.

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.

Kilde: www.habr.com

Tilføj en kommentar