Ausazko orakulu bat erabiltzea loteria baten adibidea erabiliz

Goiz batean artikulu batekin topo egin nuen ausazko zenbaki-sorgailu egiaztagarria Waves plataforma blockchain-en.

Irudi orokorra argia zen, baina ezarpen-metodo zehatza ez. Kode batzuk, sinadurak, zer, non, zergatik?

Orakuluaren egileari egindako hainbat kontsulta, ondorioz, marrazketa logika (PHP-n inplementatutakoa) ausazko zenbaki bat lortzeko algoritmo batekin konbinatu ahal izan zen.

  1. Txapelketa/txanda hasieran, kodearen lehen zatia (R-kodea) eskatzen diogu orakuluari.

    Momentu honetan, ez dago jokalari-kopuruari, sari-leku-kopuruari, sari-ordainketen tamainari edo, oro har, loteria dagoenari buruzko informaziorik. Orakuluak, transakzio baten bidez, ausazko kode pertsonal bat igortzen du, gero behin bakarrik eta eskatu dutenek bakarrik erabil dezaketena. Bide batez, R-kodea "erosi" daiteke (eskaera transakzioaren kostua + orakuluari erantzuna emateko transakzioaren kostua esan nahi du, hau 0.015 dolar inguruko zenbatekoa da egungo tarifan, kodea bera doan jaulkitzen da. ) hainbat aldiz aldez aurretik, gero erantzun-transakzioa jaso arte itxaron ez dadin. Datu-basean aldizka eguneratzen den buffer txiki bat egin nuen.

  2. Txapelketak Waves plataformako blockchain-eko 60 bloke irauten ditu normalean, momentuz ordu 1 gutxi gorabehera. Txapelketa amaitutzat eta itxitzat joko da 60 bloke igaro ondoren gutxienez bi sarrera badaude, bestela txapelketaren jarduera-denbora hurrengo 60 blokeetarako luzatzen da.
  3. Txapelketa itxi eta berehala, data-transakzio bat sortu eta bidaltzen dugu (gutxi gorabehera 0.005 $-ko komisioa ere ordaintzen dugu horretarako), behar izanez gero, hainbat, zeinetan zozketako baldintza guztiak erregistratzen diren eta jokalarien zerrenda ordenatua (sarrerak) bertatik aukeratu behar ditugu irabazleak.
  4. Fase honetan, dagoeneko badugu kodearen lehen zatia (R-kodea) gehi transakzio dataren IDa (TXID). Sinadura egiteko orakulura bidaltzen ditugu kateatu moduan (R-kodea + TXID), berriro komisioa + kalte-ordaina ordaintzen dugu. Orakuluak jasotako datuen berezitasuna eta pertenentzia egiaztatzen ditu, eta erantzun gisa kodearen bigarren zatia (S-kodea) sha256 formatuan bidaltzen digu, ausazko zenbaki-sorgailuaren abiapuntua dena.
  5. Txartel irabazlearen sekuentzia-zenbakia adieraziko duen ausazko zenbaki bat lortzeko, sha256 datu bitarretatik S-kodea hamaseitar (HEX) irudikapen bihurtzen dugu. Ondoren, ondoriozko HEX katetik, zenbaki bat lortuko dugu. Sortutako zenbakia txartel kopuruarekin (txartel_guztiak) zatitzearen hondarra lortzen dugu eta emaitzari 1 gehitzen diogu (txartel_guztiak baino lehen 1 zenbakia lortzeko). Ondorioz, irabazlearen serie-zenbakia lortuko dugu.
  6. Zozketako baldintzen arabera, hainbat irabazle badaude, aurreko eragiketak errepikatuko ditugu sari-leku kopuruaren berdinean. Kasu honetan, dagoeneko irabazi duen txartel bat zerrendatik kentzen dugun bakoitzean eta all_tickets 1ean murrizten dugu, eta S kodearen ordez jasotako aurreko zenbakia adieraziko dugu.

Ikus dezagun benetako adibide zehatz bat, 119. zk. txapelketa:

Guztira 7 sarrera (sarrera_guztiak)
Sarrerak 50 txanpon balio ditu (apustua)
Joko-kuota % 10 (kuota)

Loteriaren baldintzen arabera, %30 sariaren dirura doa, hau da. kasu honetan, 2 sarrerak sari bat jaso beharko dute, eta horren tamaina (Apustua*sarrera_guztiak-Tasa)/2 formularen arabera kalkulatzen da.

1. Jasotako R kodea: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Txapelketa itxi ondoren, bikote moduan dauden sarreren zerrenda dugu: zenbakia + helbidea (txapelketan parte hartzeko ordainketa egin den diru-zorroaren helbidea). Kontuan izan helbideak errepikatu daitezkeela, hau da, parte-hartzaile batek txapelketa baterako hainbat sarrera erosi dituela esan nahi du; hori ez dago arauek debekatuta.

Transakzioaren bidalketa-data: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Eskatutako S kodea: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV iruzkinarekin (R-kodea + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Jasotako S kodea: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Irabazleak zehaztu ziren.

6. Bidalitako ordainketak

Ondorioz, sarien zozketa prozeduraren urratsez urrats grabaketa dugu blockchain-en, edozein unetan egiaztatzeko aukerarekin. Antolatzaileak ia ezinezkoa da emaitzak manipulatzea;behintzat, ezin izango da oharkabean egin.

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.

Iturria: www.habr.com

Gehitu iruzkin berria