Uzante hazardan orakolon uzante la ekzemplon de loterio

Iun matenon mi trovis artikolon pri kontrolebla hazarda nombro-generatoro sur la blokĉeno de la platformo Waves.

La ĝenerala bildo estis klara, sed la specifa efektiviga metodo ne estis. Iuj kodoj, subskriboj, kio, kie, kial?

Pluraj konsultoj kun la aŭtoro de la orakolo, kiel rezulto, eblis kombini la desegnan logikon (efektivigitan en PHP) kun algoritmo por akiri hazardan nombron.

  1. Komence de la turniro/rondo, ni petas la unuan parton de la kodo (R-kodo) de la orakolo.

    Nuntempe, ne ekzistas informoj pri la nombro da ludantoj, la nombro da premiolokoj, la grandeco de premiopagoj, aŭ la ekzisto de la loterio ĝenerale. La orakolo, per transakcio, eldonas personan hazardan kodon, kiu tiam povas esti uzata nur unufoje kaj nur de tiuj, kiuj petis ĝin. Cetere, R-kodo povas esti "aĉetata" (signifas la koston de la peta transakcio + kompenso al la orakolo por la responda transakcio, ĉi tio estas kvanto de ĉirkaŭ $ 0.015 laŭ la aktuala kurzo, la kodo mem estas eldonita senpage. ) plurfoje anticipe, por ne atendi poste la ricevon de la responda transakcio. Mi faris malgrandan regule ĝisdatigitan bufron en la datumbazo.

  2. La turniro kutime daŭras 60 blokojn de la platforma blokĉeno Waves, nuntempe ĝi estas proksimume 1 horo. La turniro estas konsiderata finita kaj fermita se post 60 blokoj estas almenaŭ du biletoj en ĝi, alie la turnira agadtempo plilongiĝas por la sekvaj 60 blokoj.
  3. Tuj post la fermiĝo de la turniro, ni generas kaj sendas datan transakcion (ni ankaŭ pagas komisionon de proksimume $0.005 por ĝi), se necese, plurajn, en kiuj ĉiuj kondiĉoj de la desegnaĵo estas registritaj kaj ordigita listo de ludantoj (biletoj) el kiuj ni devas elekti la gajnantojn.
  4. En ĉi tiu etapo, ni jam havas la unuan parton de la kodo (R-kodo) plus la transakcian datan ID (TXID). Ni sendas ilin por subskribo al la orakolo en formo de kunligado (R-kodo + TXID), denove ni pagas komisionon + kompenson. La orakolo kontrolas la ricevitajn datumojn pri unikeco kaj aparteno, kaj responde sendas al ni la duan parton de la kodo (S-kodo) en formato sha256, kiu estas la deirpunkto por la hazarda nombrogeneratoro.
  5. Por akiri hazardan nombron, kiu indikos la sinsekvon de la gajna bileto, ni konvertas la S-kodon de la binaraj datumoj sha256 al deksesuma (HEX) reprezento. Tiam de la rezulta HEX-ŝnuro, ni ricevas nombron. Ni ricevas la reston de dividado de la rezulta nombro per la nombro da biletoj (ĉiuj_biletoj) kaj aldonas 1 al la rezulto (por ricevi la nombron 1 antaŭ ĉiuj_biletoj). Kiel rezulto, ni ricevas la serian numeron de la gajninto.
  6. Se, laŭ la kondiĉoj de la desegnaĵo, estas pluraj gajnantoj, tiam ni ripetas la antaŭajn operaciojn en kvanto egala al la nombro da premiaj lokoj. En ĉi tiu kazo, ĉiufoje ni forigas el la listo bileton kiu jam gajnis kaj reduktas ĉiujn_biletojn je 1, kaj anstataŭ S-kodo ni indikas la antaŭan nombron ricevitan.

Ni rigardu specifan realan ekzemplon, turniro n-ro 119:

Entute 7 biletoj (ĉiuj_biletoj)
Bileto kostis 50 monerojn (Veto)
Ludkotizo 10% (Kotizo)

Laŭ la kondiĉoj de la loterio, 30% iras al la premimono, t.e. ĉi-kaze, 2 biletoj devas ricevi premion, kies grandeco estas kalkulita laŭ la formulo (Veto*ĉiuj_biletoj-Kotizo)/2.

1. Ricevita R-kodo: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Post la fermiĝo de la turniro, ni havas liston de biletoj en formo de paroj: numero + adreso (la adreso de la monujo el kiu estis farita pago por partopreno en la turniro). Bonvolu noti, ke adresoj povas esti ripetitaj, tio signifas, ke unu partoprenanto aĉetis plurajn biletojn al unu turniro; tio ne estas malpermesita de la reguloj.

Transakcia dato sendita: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Petita S-kodo: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV kun komento (R-kodo + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Ricevita S-kodo: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. La gajnantoj estis determinitaj.

6. Sendis pagojn

Kiel rezulto, ni havas paŝon post paŝo registradon de la proceduro de desegna premio en la blokĉeno kun la kapablo kontroli ĝin iam ajn. Estas preskaŭ neeble por la organizanto manipuli la rezultojn; almenaŭ, ne plu eblos fari ĝin nerimarkite.

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.

fonto: www.habr.com

Aldoni komenton