Korištenje slučajnog proročišta na primjeru lutrije

Jednog sam jutra naišao na članak o provjerljivi generator slučajnih brojeva na platformi Waves blockchain.

Cjelokupna slika bila je jasna, ali konkretna metoda provedbe nije. Neki kodovi, potpisi, što, gdje, zašto?

Nakon nekoliko konzultacija s autorom proročanstva, kao rezultat, bilo je moguće kombinirati logiku crtanja (implementiranu u PHP-u) s algoritmom za dobivanje slučajnog broja.

  1. Na početku turnira/runda tražimo prvi dio koda (R-kod) od proročišta.

    U ovom trenutku nema informacija o broju igrača, broju nagradnih mjesta, visini isplata nagrada, niti uopće o postojanju lutrije. Oracle putem transakcije izdaje osobni nasumični kod, koji zatim mogu koristiti samo jednom i samo oni koji su ga zatražili. Usput, R-kod se može "kupiti" (što znači trošak transakcije zahtjeva + kompenzacija orakulu za transakciju odgovora, to je iznos od oko 0.015 dolara po trenutnoj stopi, sam kod se izdaje besplatno ) nekoliko puta unaprijed, kako ne biste kasnije čekali primitak transakcije s odgovorom. Napravio sam mali međuspremnik koji se redovno ažurira u bazi podataka.

  2. Turnir obično traje 60 blokova platforme Waves blockchain, trenutno traje otprilike 1 sat. Turnir se smatra završenim i zatvorenim ako nakon 60 blokova ima najmanje dvije ulaznice, u protivnom se vrijeme turnirske aktivnosti produžuje za sljedećih 60 blokova.
  3. Odmah nakon zatvaranja turnira generiramo i šaljemo transakciju datuma (također plaćamo proviziju od cca 0.005 $ za nju), ako je potrebno, nekoliko, u kojima su zabilježeni svi uvjeti izvlačenja i naručeni popis igrača (ulaznice) od kojih trebamo odabrati pobjednike.
  4. U ovoj fazi već imamo prvi dio koda (R-kod) plus ID datuma transakcije (TXID). Šaljemo ih na potpis orakulu u obliku konkatenacije (R-code + TXID), opet plaćamo proviziju + kompenzaciju. Oracle provjerava jedinstvenost i pripadnost primljenih podataka, te nam kao odgovor šalje drugi dio koda (S-code) u formatu sha256 koji je polazna točka za generator slučajnih brojeva.
  5. Da bismo dobili nasumični broj koji će označavati redni broj dobitnog listića, pretvaramo S-kod iz binarnih podataka sha256 u heksadecimalni (HEX) prikaz. Zatim iz rezultirajućeg HEX niza dobivamo broj. Dobivamo ostatak dijeljenja dobivenog broja s brojem ulaznica (all_tickets) i dodamo 1 rezultatu (kako bismo dobili broj 1 ispred all_tickets). Kao rezultat toga dobivamo serijski broj pobjednika.
  6. Ako prema uvjetima izvlačenja postoji više dobitnika, ponavljamo prethodne operacije u iznosu jednakom broju nagradnih mjesta. U tom slučaju svaki put s popisa uklanjamo listić koji je već dobitan i smanjujemo all_tickets za 1, a umjesto S-koda označavamo prethodni primljeni broj.

Pogledajmo konkretan pravi primjer, turnir br. 119:

Ukupno 7 ulaznica (all_tickets)
Cijena ulaznice 50 kovanica (Oklada)
Naknada za igru ​​10% (Naknada)

Prema uvjetima lutrije, 30% ide u novčani dobitak, tj. u ovom slučaju, 2 listića moraju dobiti nagradu, čija se veličina izračunava prema formuli (Bet*all_tickets-Fee)/2.

1. Primljeni R-kod: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Nakon zatvaranja turnira imamo popis ulaznica u obliku parova: broj + adresa (adresa novčanika iz kojeg je izvršeno plaćanje za sudjelovanje na turniru). Imajte na umu da se adrese mogu ponavljati, to znači da je jedan sudionik kupio više ulaznica za jedan turnir; to nije zabranjeno pravilima.

Datum poslane transakcije: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Traženi S-kod: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV s komentarom (R-kod + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Primljeni S-kod: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Određeni su pobjednici.

6. Poslane uplate

Kao rezultat toga, imamo detaljnu snimku postupka izvlačenja nagrada u blockchainu s mogućnošću provjere u bilo kojem trenutku. Organizatoru je gotovo nemoguće manipulirati rezultatima, barem više neće biti moguće neprimjećeno.

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.

Izvor: www.habr.com

Dodajte komentar