Ăhel hommikul sattusin artiklile, Waves platvormi plokiahelas.
Ăldine pilt oli selge, kuid konkreetse teostamise meetod ei olnud. Mida teha koodide, allkirjade ja kĂ”igi nende kĂŒsimustega?
PĂ€rast mitmeid konsultatsioone oraakli autoriga Ă”nnestus lĂ”ppkokkuvĂ”ttes ĂŒhendada loosimislahendus (teostatud PHP-s) juhusliku numbri saamise algoritmiga.
- Turniiri / vooru alguses kĂŒsime oraaklilt esimest koodijuppi (R-kood).
Sellisel hetkel pole mingit teavet mĂ€ngijate arvu, auhinnakohtade arvu, auhinnaraha suuruse ja isegi loterii olemasolu kohta. Oraakel annab tehingu kaudu vĂ€lja isikliku juhusliku koodi, mida saab hiljem kasutada ainult ĂŒhe korra ja ainult selle isiku poolt, kes seda kĂŒsis. Muide, R-koodi saab "ostma" (see hĂ”lmab tehingu taotlemise kulusid + kompensatsiooni oraaklile vastustehingu eest, see summa on praeguse kursi korral umbes $0.015, kuid kood vĂ€ljastatakse tasuta) ette mitmeid, et hiljem ei peaks ootele jÀÀma. Loodud vĂ€ike regulaarselt tĂ€iendatav vahemĂ€lu andmebaasis.
- Turniir kestab tavaliselt 60 plokki Waves platvormi plokiahelas, mis praegu vÔrdub umbes 1 tunni. Turniir loetakse toimunuks ja suletuks, kui pÀrast 60 plokki on selles vÀhemalt kaks piletit, vastasel juhul pikendatakse turniiri aktiivsusaega veel 60 ploki vÔrra.
- Otse turniiri sulgemise jÀrel koostame ja saadame andmete tehingu (mille eest maksame umbes $0.005 tasu), vajadusel mitu, kus on fikseeritud kÔik loosimise tingimused ja korrastatud mÀngijate (piletite) nimekiri, mille hulgast peame vÔitjad valima.
- Selles etapis on meil juba esimene koodijupp (R-kood) pluss tehingu ID (TXID). Saadame need oraaklile allkirjastamiseks konkatena (R-kood + TXID), maksame jÀlle tasu + kompensatsiooni. Oraakel kontrollib saadud andmeid unikaalsuse ja kuuluvuse osas ning vastuseks saadab meile teise osa koodist (S-kood) sha256 formaadis, mis on juhuslike arvude generaatori lÀhtepunkt.
- Kuna juhuslik number, mis nÀitab vÔitnud pileti jÀrjekorranumbrit, teisendame S-koodi binaarsetest sha256 andmetest heksadesimaalsesse (HEX) esitusesse. SeejÀrel saame saadud HEX stringist numbri. Sigurime jÀÀnuse, jagades saadud numbri piletite koguarvuga (all_tickets) ja lisame tulemusele 1 (et saada number 1 kuni all_tickets). LÔpuks saame vÔitja jÀrjekorranumbri.
- Kui loteriivÔitjate arvust on mitu, kordame eelmiseid toiminguid vÔidukohtade arvuga. Iga kord eemaldame vÔitnud pileti nimekirjast ja vÀhendame all_tickets'i 1 vÔrra, ning S-koodi asemel kasutame eelnevalt saadud numbrit.
Vaatame konkreetset reaalset nÀidet, turniir nr 119:
Kokku 7 piletit (all_tickets)
Pileti hind 50 mĂŒnti (Bet)
MĂ€ngutasu 10% (Fee)
Loterii tingimuste kohaselt lÀheb 30% auhindadele, st antud juhul peavad 2 piletit auhinna saama, mille suurust arvutatakse valemiga (Bet*all_tickets-Fee)/2.
1. Saime R-koodi:
2. Turniiri sulgemisel on meil piletite nimekiri paaridena: number + aadress (rahakoti aadress, mille kaudu osalustasu maksti). TĂ”stame esile, et aadressid vĂ”ivad korduda, mis tĂ€hendab, et ĂŒks osaleja on ostnud turniiri jaoks mitu piletit, seda ei keelata reeglites.
Saime tehingu kuupÀeva:
3. KĂŒsisime S-koodi: kommentaariga (R-kood + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S
4. Saime S-koodi:
5. MÀÀrasime vÔitjad.
6.
Seega on meil plokiahelas samm-sammuline dokumentatsioon auhindade loosimise protsessist, mille saab iga kell kontrollida. Tulemuste manipuleerimine korraldaja poolt on praktiliselt vÔimatu, vÀhemalt ei saa seda juba mÀrkamatult teha.
mÀÀrata vĂ”itja â 1
KÔik_piletid:
Indeks: 1 Pilet:139
Indeks: 2 Pilet:141
Indeks: 3 Pilet:143
Indeks: 4 Pilet:145
Indeks: 5 Pilet:147
Indeks: 6 Pilet:149
Indeks: 7 Pilet:151
1. bin -> hex ( bin2hex(sha256(S-kood)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596
2. hex -> gmp number: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342
3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4
4. modulo -> pilet: 4 -> 145
mÀÀrata vĂ”itja â 2
KÔik_piletid:
Indeks: 1 Pilet:139
Indeks: 2 Pilet:141
Indeks: 3 Pilet:143
Indeks: 4 Pilet:147
Indeks: 5 Pilet:149
Indeks: 6 Pilet:151
1. bin -> hex ( bin2hex(sha256(eelmine hex)) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0
2. hex -> gmp number: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. modulo -> pilet: 1 -> 139
LÔpp.Allikas: habr.com
