Satunnaisen oraakkelin käyttäminen arpajaisten esimerkkiä käyttäen

Eräänä aamuna törmäsin artikkeliin todennettavissa oleva satunnaislukugeneraattori Waves-alustan lohkoketjussa.

Kokonaiskuva oli selkeä, mutta konkreettinen toteutustapa ei. Joitakin koodeja, allekirjoituksia, mitä, missä, miksi?

Useita neuvotteluja oraakkelin kirjoittajan kanssa, minkä seurauksena oli mahdollista yhdistää piirustuslogiikka (toteutettu PHP:ssä) algoritmiin satunnaisluvun saamiseksi.

  1. Turnauksen/kierroksen alussa pyydämme koodin ensimmäisen osan (R-koodi) oraakkelilta.

    Tällä hetkellä ei ole tietoa pelaajien määrästä, palkintopaikkojen määrästä, palkintomaksujen suuruudesta tai lottovoiton olemassaolosta yleensä. Oraakkeli antaa tapahtuman kautta henkilökohtaisen satunnaiskoodin, jota voivat sitten käyttää vain kerran ja vain sitä pyytäneet. Muuten, R-koodi voidaan "ostaa" (eli pyyntötapahtuman hinta + korvaus oraakkelille vastaustapahtumasta, tämä on noin 0.015 dollaria nykyisellä kurssilla, itse koodi myönnetään ilmaiseksi ) useita kertoja etukäteen, jotta et joutuisi odottamaan vastaustapahtuman vastaanottamista myöhemmin. Tein pienen säännöllisesti päivitettävän puskurin tietokantaan.

  2. Turnaus kestää yleensä 60 lohkoa Waves-alustan lohkoketjusta, tällä hetkellä noin 1 tunti. Turnaus katsotaan päättyneeksi ja päättyneeksi, jos siinä on 60 lohkon jälkeen vähintään kaksi lippua, muuten turnauksen toiminta-aikaa pidennetään seuraavilla 60 lohkolla.
  3. Välittömästi turnauksen päätyttyä generoimme ja lähetämme päivämäärätapahtuman (maksamme siitä myös n. 0.005 dollarin välityspalkkion), tarvittaessa useita, joihin on kirjattu kaikki arvonnan ehdot ja järjestetty pelaajalista (liput) joista meidän on valittava voittajat.
  4. Tässä vaiheessa meillä on jo koodin ensimmäinen osa (R-koodi) sekä tapahtumapäivän tunnus (TXID). Lähetämme ne allekirjoitettavaksi oraakkelille ketjutuksen muodossa (R-koodi + TXID), taas maksamme palkkion + korvauksen. Oraakkeli tarkistaa vastaanotetun tiedon yksilöllisyyden ja kuuluvuuden ja lähettää meille vastauksena koodin toisen osan (S-koodin) sha256-muodossa, joka on satunnaislukugeneraattorin lähtökohta.
  5. Saadaksemme satunnaisluvun, joka ilmaisee voittolipun järjestysnumeron, muunnamme S-koodin sha256-binääritiedoista heksadesimaalimuotoon (HEX). Sitten tuloksena olevasta HEX-merkkijonosta saamme numeron. Saamme loppuosan saadun luvun jakamisesta lippujen määrällä (kaikki_liput) ja lisäämme tulokseen 1 (jotta saadaan luku 1 ennen all_tickets). Lopputuloksena saamme voittajan sarjanumeron.
  6. Jos arvonnan ehtojen mukaan voittajia on useita, toistamme edelliset toiminnot palkintopaikkojen lukumäärän verran. Tässä tapauksessa joka kerta kun poistamme listalta jo voitetun lipun ja vähennämme all_tickets-arvoa yhdellä, ja S-koodin sijaan ilmoitamme edellisen vastaanotetun numeron.

Katsotaanpa erityistä esimerkkiä, turnausta nro 119:

Yhteensä 7 lippua (all_tickets)
Lippu maksoi 50 kolikkoa (panos)
Pelimaksu 10% (maksu)

Arpajaisten ehtojen mukaan 30 % menee voittorahoihin, ts. tässä tapauksessa 2 lippua on saatava palkinto, jonka koko lasketaan kaavan (Petos*kaikki_liput-Fee)/2 mukaan.

1. Vastaanotettu R-koodi: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Turnauksen päätyttyä meillä on lista lipuista pareittain: numero + osoite (sen lompakon osoite, josta turnaukseen osallistuminen maksettiin). Huomaa, että osoitteet voivat toistua, mikä tarkoittaa, että yksi osallistuja osti useita lippuja yhteen turnaukseen; tämä ei ole sääntöjen kiellettyä.

Tapahtuman lähetyspäivä: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Pyydetty S-koodi: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV kommentilla (R-koodi + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Vastaanotettu S-koodi: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Voittajat selvitettiin.

6. Lähetetyt maksut

Tämän seurauksena meillä on vaiheittainen tallennus palkintojen arvonnasta lohkoketjussa ja mahdollisuus tarkistaa se milloin tahansa. Järjestäjän on lähes mahdotonta manipuloida tuloksia, eikä sitä ainakaan enää voi tehdä huomaamatta.

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.

Lähde: will.com

Lisää kommentti