Bruke et tilfeldig orakel ved å bruke eksemplet med et lotteri

En morgen kom jeg over en artikkel om verifiserbar tilfeldig tallgenerator på Waves-plattformen blokkjede.

Det overordnede bildet var klart, men den spesifikke implementeringsmetoden var det ikke. Noen koder, signaturer, hva, hvor, hvorfor?

Flere konsultasjoner med forfatteren av oraklet, som et resultat var det mulig å kombinere tegnelogikken (implementert i PHP) med en algoritme for å få et tilfeldig tall.

  1. Ved starten av turneringen/runden ber vi om den første delen av koden (R-koden) fra oraklet.

    For øyeblikket er det ingen informasjon om antall spillere, antall premieplasser, størrelsen på premieutbetalinger eller eksistensen av lotteriet generelt. Oraklet, gjennom en transaksjon, utsteder en personlig tilfeldig kode, som deretter bare kan brukes én gang og bare av de som ba om det. Forresten, R-kode kan "kjøpes" (som betyr kostnaden for forespørselstransaksjonen + kompensasjon til oraklet for svartransaksjonen, dette er et beløp på rundt $0.015 med gjeldende kurs, selve koden utstedes gratis ) flere ganger på forhånd, for ikke å vente på mottak av svartransaksjonen senere. Jeg laget en liten jevnlig oppdatert buffer i databasen.

  2. Turneringen varer vanligvis i 60 blokker av Waves-plattformens blokkjede, for øyeblikket er det omtrent 1 time. Turneringen anses som fullført og stengt hvis det etter 60 blokker er minst to billetter i den, ellers forlenges turneringsaktivitetstiden for de neste 60 blokkene.
  3. Umiddelbart etter at turneringen stenger, genererer og sender vi en datotransaksjon (vi betaler også en provisjon på omtrent $0.005 for det), om nødvendig, flere, der alle betingelsene for trekningen er registrert og en bestilt liste over spillere (billetter) hvor vi må velge vinnerne.
  4. På dette stadiet har vi allerede den første delen av koden (R-kode) pluss transaksjonsdato-ID (TXID). Vi sender dem for signatur til oraklet i form av sammenkobling (R-kode + TXID), igjen betaler vi provisjon + kompensasjon. Oraklet sjekker de mottatte dataene for unikhet og tilhørighet, og sender oss som svar den andre delen av koden (S-koden) i sha256-format, som er utgangspunktet for tilfeldig tallgeneratoren.
  5. For å få et tilfeldig tall som vil indikere sekvensnummeret til vinnerloddet, konverterer vi S-koden fra sha256 binære data til en heksadesimal (HEX) representasjon. Så fra den resulterende HEX-strengen får vi et tall. Vi får resten av å dele det resulterende tallet med antall billetter (alle_billetter) og legge til 1 til resultatet (for å få tallet 1 før alle_billetter). Som et resultat får vi serienummeret til vinneren.
  6. Hvis det, i henhold til betingelsene for trekningen, er flere vinnere, gjentar vi de forrige operasjonene i et beløp som tilsvarer antall premieplasser. I dette tilfellet, hver gang vi fjerner fra listen en billett som allerede har vunnet og reduserer alle_billetter med 1, og i stedet for S-kode angir vi det forrige antallet mottatt.

La oss se på et spesifikt ekte eksempel, turnering nr. 119:

Totalt 7 billetter (alle_billetter)
Billett koster 50 mynter (innsats)
Spillavgift 10 % (avgift)

I henhold til vilkårene for lotteriet går 30 % til premiepengene, d.v.s. i dette tilfellet må 2 billetter motta en premie, hvis størrelse beregnes i henhold til formelen (Bet*all_tickets-Fee)/2.

1. Mottatt R-kode: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Etter at turneringen avsluttes, har vi en liste over billetter i form av par: nummer + adresse (adressen til lommeboken som betalingen for deltakelse i turneringen ble utført fra). Vær oppmerksom på at adresser kan gjentas, dette betyr at en deltaker kjøpte flere billetter til en turnering, dette er ikke forbudt i henhold til reglene.

Sendt transaksjonsdato: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

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

4. Mottatt S-kode: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Vinnerne ble kåret.

6. Sendte betalinger

Som et resultat har vi en trinnvis registrering av premietrekningsprosedyren i blokkjeden med muligheten til å sjekke den når som helst. Det er nesten umulig for arrangøren å manipulere resultatene, i det minste vil det ikke lenger være mulig å gjøre det ubemerket.

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

Legg til en kommentar