Përdorimi i orakullit të rastësishëm në shembullin e lotarisë

Një mëngjes, më ra në sy një artikull mbi gjeneratorin e kontrolluar të numrave të rastësishëm në platformën Waves.

Pamja e përgjithshme ishte e qartë, por mënyra e zbatimit konkret nuk ishte. Cfarë kodesh, firmosh, çfarë, ku, përse?

Pas disa konsultimeve me autorin e orakullit, arritëm të bashkonim logjikën e shpërndarjes (të realizuar në PHP) me algoritmin për të marrë numrin e rastësishëm.

  1. Në momentin e fillimit të turneut / raundit, ne kërkojmë nga orakulli pjesën e parë të kodit (R-code).

    Në këtë moment nuk ka asnjë informacion mbi numrin e lojtarëve, as mbi numrin e vendeve me çmime, as mbi shumën e shpërblimeve dhe as mbi ekzistencën e lotarisë. Orakulli, përmes transaksionit, jep një kod të rastësishëm personal, i cili më pas mund të përdoret vetëm një herë dhe vetëm nga ai që e kërkoi. Në fakt, R-code mund të "blihet" (ku nënkuptohet kostoja e transaksionit të kërkesës + kompensimi për orakullin për transaksionin e përgjigjes, një shumë rreth $0.015 me kursin aktual, vetë kodi jepet falas) paraprakisht disa, për të mos pritur më pas për të marrë transaksionin e përgjigjes. Kam bërë një buffer të vogël që plotësohet rregullisht në BDB.

  2. Turneu zgjat standardisht 60 blloqe të platformës Waves, për momentin rreth 1 orë. Turneu konsiderohet i zakonshëm dhe i mbyllur, nëse pas 60 blloqeve do të ketë të paktën dy bileta, përndryshe koha e aktivitetit të turneut shtrihet për 60 blloqe të tjera.
  3. MenjĂ«herĂ« pas mbylljes sĂ« turneut formojmĂ« dhe dĂ«rgojmĂ« njĂ« transaksion tĂ« dhĂ«nash (pĂ«r tĂ« cilin gjithashtu paguajmĂ« njĂ« provizion rreth $0.005), nĂ«se Ă«shtĂ« e nevojshme — disa, nĂ« tĂ« cilat dokumentohet tĂ« gjitha kushtet e shpĂ«rndarjes dhe lista e renditur e lojtarĂ«ve (bileta) nga tĂ« cilĂ«t duhet tĂ« zgjedhim fituesit.
  4. Në këtë etapë ne tashmë kemi pjesën e parë të kodit (R-code) plus ID-në e transaksionit të dhënash (TXID). Ne i dërgojmë ata për nënshkrim orakullit në formën e një konkatinimi (R-code + TXID), përsëri paguajmë komisionin + kompensimin. Orakulli kontrollon të dhënat e marra për unikalitet dhe përkatësi, dhe në përgjigje na dërgon pjesën e dytë të kodit (S-code) në formatin sha256, i cili është pika e nisjes për gjeneratorin e numrave të rastësishëm.
  5. Për të marrë një numër të rastësishëm, i cili do të tregojë numrin rendor të biletës fituese, ne e transformojmë S-code nga të dhëna binarë sha256 në përfaqësimin hexadecimal (HEX). Më pas, nga stringu HEX që kemi marrë, marrim numrin. Marrim mbetjen e ndarjes së numrit të marrë me numrin e biletave (all_tickets) dhe i shtojmë rezultatit 1 (për të marrë numrin 1 deri tek all_tickets). Në fund, ne marrim numrin rendor të fituesit.
  6. Nëse sipas kushtet e shpërndarjes ka disa fitues, atëherë përsërisim operacionet e mëparshme në numër të barabartë me numrin e vendeve me çmime. Gjatë kësaj kohe, çdo herë eleminojmë nga lista biletën që ka fituar dhe ulim all_tickets me 1, ndërsa në vend të S-code, shënojmë numrin e mëparshëm të marrë.

Le të shqyrtojmë një shembull konkret, turneu nr. 119:

Gjithsej 7 bileta (all_tickets)
Çmimi i biletĂ«s 50 monedha (Bet)
Taksimi i lojës 10% (Fee)

Sipas kushteve të lotarisë, 30% shkon në çmime, pra në këtë rast 2 bileta duhet të marrin çmimin, shuma e të cilit llogaritet sipas formulës (Bet*all_tickets-Fee)/2.

1. Morëm R-code: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Pas mbylljes së turneut, kemi një listë biletash në formën e çiftëve: numri + adresa (adresa e portofolit nga e cila është paguar pjesëmarrja në turne). Vërejmë se adresat mund të përsëriten, që do të thotë se një pjesëmarrës bleu disa bileta në një turne, kjo nuk ndalohet nga rregullat.

Dërguam transaksionin e dhënash: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Kërkuam S-code: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV me koment (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Morëm S-code: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Përcaktuam fituesit.

6. Dërguam shpërblimet.

Si rezultat, ne kemi në blockchain një dokumentim hap pas hapi të procedurës së shpërndarjes me mundësinë për ta verifikuar në çdo moment. Manipulimi i rezultateve nga ana e organizatorit është praktikisht i pamundur, të paktën nuk do të mund të bëhet në mënyrë të padukshme.

pĂ«rcaktoni fituesin № 1

Të_gjitha_biletat:
Indeksi: 1 Bileta:139
Indeksi: 2 Bileta:141
Indeksi: 3 Bileta:143
Indeksi: 4 Bileta:145
Indeksi: 5 Bileta:147
Indeksi: 6 Bileta:149
Indeksi: 7 Bileta:151

1. bin -> hex ( bin2hex(sha256(S-kodi)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596

2. hex -> numri gmp: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342

3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4

4. modulo -> bileta: 4 -> 145

pĂ«rcaktoni fituesin № 2

Të_gjitha_biletat:

Indeksi: 1 Bileta:139
Indeksi: 2 Bileta:141
Indeksi: 3 Bileta:143
Indeksi: 4 Bileta:147
Indeksi: 5 Bileta:149
Indeksi: 6 Bileta:151

1. bin -> hex ( bin2hex(sha256(hexin e mëparshëm)) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0
2. hex -> numri gmp: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. modulo -> bileta: 1 -> 139

Fund.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster