Izmantojot izlases orākulu, izmantojot loterijas piemēru

Kādu rÄ«tu uzgāju rakstu par pārbaudāms nejauÅ”o skaitļu Ä£enerators uz Waves platformas blokķēdes.

Kopējā aina bija skaidra, bet konkrētā Ä«stenoÅ”anas metode nebija. Daži kodi, paraksti, kas, kur, kāpēc?

Vairākas konsultācijas ar orākula autoru, kā rezultātā radās iespēja apvienot zÄ«mÄ“Å”anas loÄ£iku (realizēta PHP) ar nejauÅ”a skaitļa iegÅ«Å”anas algoritmu.

  1. Turnīra/raunda sākumā mēs pieprasām no orākula koda pirmo daļu (R-kods).

    Å obrÄ«d nav informācijas ne par spēlētāju skaitu, ne par laimestu vietu skaitu, ne par balvu izmaksu apmēriem, ne par loterijas esamÄ«bu kopumā. Orākuls, veicot darÄ«jumu, izsniedz personisku nejauÅ”u kodu, ko pēc tam var izmantot tikai vienu reizi un tikai tie, kas to pieprasÄ«juÅ”i. Starp citu, R-kodu var ā€œiegādātiesā€ (tas nozÄ«mē pieprasÄ«juma darÄ«juma izmaksas + kompensācija orākulam par atbildes darÄ«jumu, tā ir summa aptuveni USD 0.015 pēc paÅ”reizējā kursa, pats kods tiek izsniegts bez maksas ) vairākas reizes iepriekÅ”, lai vēlāk nesagaidÄ«tu atbildes darÄ«juma saņemÅ”anu. Es izveidoju nelielu regulāri atjauninātu buferi datu bāzē.

  2. TurnÄ«rs parasti ilgst 60 Waves platformas blokķēdes blokus, Å”obrÄ«d tas ir aptuveni 1 stunda. TurnÄ«rs tiek uzskatÄ«ts par pabeigtu un noslēgtu, ja pēc 60 blokiem tajā ir vismaz divas biļetes, pretējā gadÄ«jumā turnÄ«ra aktivitātes laiks tiek pagarināts uz nākamajiem 60 blokiem.
  3. Uzreiz pēc turnÄ«ra slēgÅ”anas Ä£enerējam un nosÅ«tām datuma transakciju (par to arÄ« maksājam komisijas maksu aptuveni 0.005$), ja nepiecieÅ”ams, vairākas, kurās tiek fiksēti visi izlozes nosacÄ«jumi un pasÅ«tÄ«ts spēlētāju saraksts (biļetes) no kuriem mums ir jāizvēlas uzvarētāji.
  4. Å ajā posmā mums jau ir pirmā koda daļa (R-kods) un darÄ«juma datuma ID (TXID). Mēs tos nosÅ«tām parakstÄ«Å”anai orākulam savienojuma veidā (R-kods + TXID), atkal maksājam komisiju + kompensāciju. Orākuls pārbauda saņemto datu unikalitāti un piederÄ«bu, un atbildot mums nosÅ«ta otro koda daļu (S-kodu) sha256 formātā, kas ir nejauÅ”o skaitļu Ä£eneratora sākumpunkts.
  5. Lai iegÅ«tu nejauÅ”u skaitli, kas norādÄ«s laimētās biļetes kārtas numuru, mēs konvertējam S-kodu no sha256 binārajiem datiem uz heksadecimālo (HEX) attēlojumu. Tad no iegÅ«tās HEX virknes mēs iegÅ«stam skaitli. Mēs iegÅ«stam atlikuÅ”o daļu, dalot iegÅ«to skaitli ar biļeÅ”u skaitu (visas_biļetes) un pievienojot rezultātam 1 (lai iegÅ«tu skaitli 1 pirms all_tickets). Rezultātā mēs iegÅ«stam uzvarētāja sērijas numuru.
  6. Ja saskaņā ar izlozes nosacÄ«jumiem ir vairāki uzvarētāji, tad atkārtojam iepriekŔējās darbÄ«bas apmērā, kas vienāds ar balvu vietu skaitu. Å ajā gadÄ«jumā katru reizi no saraksta izņemam jau laimētu biļeti un samazinām all_tickets par 1, un S-koda vietā norādām iepriekÅ” saņemto numuru.

Paskatīsimies uz konkrētu reālu piemēru, turnīru Nr. 119:

Kopā 7 biļetes (visas_biļetes)
Biļete maksā 50 monētas (Bet)
Spēles maksa 10% (Maksa)

AtbilstoÅ”i loterijas nosacÄ«jumiem 30% tiek naudas balvai, t.i. Å”ajā gadÄ«jumā 2 biļetēm jāsaņem balva, kuras lielums tiek aprēķināts pēc formulas (Bet*visas_biļetes-Maksa)/2.

1. Saņemtais R-kods: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Pēc turnÄ«ra slēgÅ”anas mums ir biļeÅ”u saraksts pa pāriem: numurs + adrese (maka adrese, no kuras tika veikta apmaksa par dalÄ«bu turnÄ«rā). LÅ«dzu, ņemiet vērā, ka adreses var atkārtoties, tas nozÄ«mē, ka viens dalÄ«bnieks ir iegādājies vairākas biļetes uz vienu turnÄ«ru, tas nav aizliegts ar noteikumiem.

Darījuma datums nosūtīts: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. PieprasÄ«tais S kods: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV ar komentāru (R-kods + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Saņemtais S kods: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Uzvarētāji tika noteikti.

6. Nosūtīti maksājumi

Rezultātā mums ir soli pa solim balvu izlozes procedūras ieraksts blokķēdē ar iespēju to jebkurā laikā pārbaudīt. Organizatoram ir gandrīz neiespējami manipulēt ar rezultātiem, vismaz to vairs nevarēs izdarīt nemanot.

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.

Avots: www.habr.com

Pievieno komentāru