Një mëngjes, një artikull mbi në blokçen Waves platform.
Pamja e pĂ«rgjithshme ishte e qartĂ«, por mĂ«nyra e implementimit tĂ« saj â jo. Disa kode, nĂ«nshkrime, çfarĂ«, ku, pĂ«rse?
Pasi u konsultova me autorin e orakullit, arrita të bashkoj logjikën e shortit (të realizuar në PHP) me algoritmin për të marrë një numër të rastësishëm.
- Në momentin e fillimit të turneut/rafit ne kërkojmë nga orakulli pjesën e parë të kodit (R-code).
Në këtë moment nuk ka informacion as për numrin e lojtarëve, as për numrin e vendeve të fituara, as për madhësinë e pagesave të fitimeve dhe në përgjithësi për ekzistencën e llotarisë. Orakulli përmes një transaksioni lëshon një kod të rastësishëm personal, i cili mund të përdoret vetëm një herë dhe vetëm nga ai që e kërkoi. Për fat të mirë, R-code mund të "blihet" (do të thotë kostoja e transaksionit të kërkesës + kompensimi për orakullin për transaksionin e përgjigjes, ky është një shumë në rreth $0.015 sipas kursit aktual, vetë kodi lëshohet falas) paraprakisht disa, për të mos pritur më pas për marrjen e transaksionit të përgjigjes. Unë krijova një tampon të vogël që plotësohet rregullisht në DB.
- Turneu zgjat standardisht 60 blloqe të blokçenit Waves platform, aktualisht ky është afërsisht 1 orë. Turneu konsiderohet i realizuar dhe i mbyllur, nëse pas 60 blloqeve ka të paktën dy bileta, përndryshe koha e aktivizimit të turneut zgjatet për 60 blloqe të tjera.
- MenjĂ«herĂ« pas mbylljes sĂ« turneut, ne formojmĂ« dhe dĂ«rgojmĂ« njĂ« data transaksion (pĂ«r tĂ« cilĂ«n gjithashtu paguajmĂ« njĂ« komision prej rreth $0.005), nĂ«se Ă«shtĂ« e nevojshme â disa, nĂ« tĂ« cilin janĂ« registruar tĂ« gjitha kushtet e shortit dhe njĂ« listĂ« e renditur e lojtarĂ«ve (biletave) nga e cila duhet tĂ« nxjerrim fituesit.
- Në këtë fazë, ne tashmë kemi pjesën e parë të kodit (R-code) plus ID data transaksion (TXID). Ne i dërgojmë ato për nënshkrim orakullit në formën e një kombinimi (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, e cila është pika e fillimit për gjeneruesin e numrave të rastësishëm.
- Për të marrë një numër të rastësishëm, i cili do të tregojë numrin rendor të biletës fituese, ne e kthejmë S-code nga të dhënat binare sha256 në paraqitjen heksadecimal (HEX). Më pas, nga stringu HEX që kemi marrë, nxjerrim numrin. Marrim mbetjen nga ndarja e numrit të marrë me numrin e biletave (all_tickets) dhe i shtojmë 1 rezultatit (për të marrë numrin 1 deri te all_tickets). Si rezultat, ne marrim numrin rendor të fituesit.
- Nëse sipas kushteve të shpërndarjes ka më shumë se një fitues, ne përsërisim operacionet e mëparshme një numër herësh të barabartë me numrin e vendeve të çmimeve. Gjatë këtij procesi, çdo herë e heqim nga lista biletën që ka fituar tashmë dhe e zvogëlsojmë all_tickets me 1, dhe në vend të S-code tregojmë numrin e mëparshëm të marrë.
Le tĂ« analizojmĂ« njĂ« shembull konkret, turneu â119:
Totali 7 bileta (all_tickets)
Ămimi i biletĂ«s 50 monedha (Bet)
Taksë lojëje 10% (Fee)
Sipas kushteve të lotarisë, 30% shkon në çmimet, dmth në këtë rast 2 bileta duhet të marrin çmimin, madhësia e të cilit llogaritet me formulën (Bet*all_tickets-Fee)/2.
1. Morëm R-code:
2. Pas mbylljes së turneut kemi një listë biletash në formën e çiftëve: numri + adresa (adresa e portofolit nga e cila u bë pagesa për pjesëmarrjen në turne). Vërejmë se adresat mund të përsëriten, kjo do të thotë se një pjesëmarrës bleu disa bileta në një turne, kjo nuk ndalohet nga rregullat.
Dërguam data tranzakcionit:
3. Kërkuam S-code: me koment (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S
4. Morëm S-code:
5. Përcaktuam fituesit.
6.
Si rezultat, ne kemi në blockchain një regjistrim hap pas hapi të procedurës së shpërndarjes së çmimeve me mundësinë për ta verifikuar atë në çdo kohë. Për të manipuluar rezultatet nga ana e organizatorit është praktikisht e pamundur, të paktën nuk do të mund të bëhet pa u vënë re.
përcaktoni fituesin nr 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-code)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596
2. hex -> numri gmp: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342
3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4
4. modulo -> bileta: 4 -> 145
përcaktoni fituesin nr 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(previous hex)) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0
2. hex -> numri gmp: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. modulo -> bileta: 1 -> 139
Fund.Burimi: habr.com
