Goiz batean artikulu batekin topo egin nuen
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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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:
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:
3. Eskatutako S kodea:
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S
4. Jasotako S kodea:
5. Irabazleak zehaztu ziren.
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