Përdorimi i një orakulli të rastësishëm duke përdorur shembullin e një llotarie

Një mëngjes hasa në një artikull për gjenerues i numrave të rastësishëm të verifikueshëm në blockchain e platformës Waves.

Pamja e përgjithshme ishte e qartë, por metoda specifike e zbatimit jo. Disa kode, nënshkrime, çfarë, ku, pse?

Disa konsultime me autorin e orakullit, si rezultat, ishte e mundur të kombinohej logjika e vizatimit (e zbatuar në PHP) me një algoritëm për marrjen e një numri të rastësishëm.

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

    Për momentin nuk ka asnjë informacion për numrin e lojtarëve, numrin e vendeve të çmimeve, madhësinë e pagesave të çmimeve apo ekzistencën e shortit në përgjithësi. Orakulli, nëpërmjet një transaksioni, lëshon një kod personal të rastësishëm, i cili më pas mund të përdoret vetëm një herë dhe vetëm nga ata që e kanë kërkuar atë. Nga rruga, kodi R mund të "blihet" (që do të thotë kostoja e transaksionit të kërkesës + kompensimi për orakullin për transaksionin e përgjigjes, kjo është një shumë prej rreth 0.015 dollarë me kursin aktual, vetë kodi lëshohet pa pagesë ) disa herë më parë, në mënyrë që të mos prisni më vonë marrjen e transaksionit të përgjigjes. Kam bërë një buffer të vogël të përditësuar rregullisht në bazën e të dhënave.

  2. Turneu zakonisht zgjat 60 blloqe të bllokut të platformës Waves, për momentin është afërsisht 1 orë. Turneu konsiderohet i përfunduar dhe i mbyllur nëse pas 60 blloqeve ka të paktën dy bileta në të, përndryshe koha e aktivitetit të turneut zgjatet për 60 blloqet e ardhshme.
  3. Menjëherë pas mbylljes së turneut, ne gjenerojmë dhe dërgojmë një transaksion data (ne paguajmë gjithashtu një komision prej afërsisht 0.005 dollarë për të), nëse është e nevojshme, disa, në të cilat regjistrohen të gjitha kushtet e shortit dhe një listë e porositur lojtarësh (bileta) nga të cilat duhet të zgjedhim fituesit.
  4. Në këtë fazë, ne kemi tashmë pjesën e parë të kodit (R-code) plus ID-në e datës së transaksionit (TXID). Ne i dërgojmë për nënshkrim në orakull në formën e lidhjes (kodi R + TXID), përsëri paguajmë një komision + kompensim. Orakulli kontrollon të dhënat e marra për veçantinë dhe përkatësinë, dhe si përgjigje na dërgon pjesën e dytë të kodit (S-code) në formatin sha256, i cili është pika fillestare për gjeneruesin e numrave të rastësishëm.
  5. Për të marrë një numër të rastësishëm që do të tregojë numrin e sekuencës së biletës fituese, ne konvertojmë kodin S nga të dhënat binare sha256 në një paraqitje heksadecimal (HEX). Pastaj nga vargu që rezulton HEX, marrim një numër. Marrim pjesën e mbetur të pjesëtimit të numrit që rezulton me numrin e biletave (të gjitha_biletat) dhe i shtojmë 1 rezultatit (për të marrë numrin 1 para të gjitha_biletat). Si rezultat, marrim numrin serial të fituesit.
  6. Nëse, sipas kushteve të shortit, ka disa fitues, atëherë ne përsërisim operacionet e mëparshme në një shumë të barabartë me numrin e vendeve të çmimeve. Në këtë rast, çdo herë ne heqim nga lista një biletë që tashmë ka fituar dhe zvogëlojmë all_tickets me 1, dhe në vend të S-code tregojmë numrin e mëparshëm të marrë.

Le të shohim një shembull konkret të vërtetë, turneun nr. 119:

Gjithsej 7 bileta (të gjitha_biletat)
Bileta kushton 50 monedha (Basti)
Tarifa e lojës 10% (Tarifa)

Sipas kushteve të shortit, 30% shkon për çmimin, d.m.th. në këtë rast, 2 bileta duhet të marrin një çmim, madhësia e të cilit llogaritet sipas formulës (Bat*të gjitha_biletat-Tarifa)/2.

1. Marrë kodin R: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Pas mbylljes së turneut, ne kemi një listë të biletave në formën e çifteve: numër + adresa (adresa e portofolit nga e cila është bërë pagesa për pjesëmarrjen në turne). Ju lutemi vini re se adresat mund të përsëriten, kjo do të thotë që një pjesëmarrës bleu disa bileta për një turne; kjo nuk është e ndaluar nga rregullat.

Data e dërgimit të transaksionit: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. S-kodi i kërkuar: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV me koment (R-kodi + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Marrë S-kodin: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. U përcaktuan fituesit.

6. Pagesat e dërguara

Si rezultat, ne kemi një regjistrim hap pas hapi të procedurës së tërheqjes së çmimeve në blockchain me aftësinë për ta kontrolluar atë në çdo kohë. Është pothuajse e pamundur që organizatori të manipulojë rezultatet; të paktën, nuk do të jetë më e mundur të bëhet pa u vënë re.

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.

Burimi: www.habr.com

Shto një koment