Ăhel hommikul jĂ€i mulle silma artikkel blockchain Waves platvormil.
Ăldine pilt oli arusaadav, kuid konkreetne teostus jĂ€i segaseks. Mis need koodid, allkirjad on, kuhu, miks?
PĂ€rast mitmeid konsultatsioone orakli autoriga Ă”nnestus mul ĂŒhendada loosimise loogika (teostatud PHP-s) juhusliku arvu saamise algoritmiga.
- Turniiri/vooru alguses kĂŒsime oraklilt esimest koodiosa (R-kood).
Sel hetkel pole teavet mĂ€ngijate arvu, auhindade arvu, auhindade suuruse ega loterii olemasolu kohta. Oraakel vĂ€ljastab tehingu kaudu isikliku juhusliku koodi, mida saab kasutada ainult ĂŒks kord ja ainult selle isiku poolt, kes seda kĂŒsis. Ăks huvitav detail: R-koodi saab ette osta (mĂ”eldes tehingu taotlemise kulu + orakli kompenseerimise kulu vastustehingu eest, see summa on praeguse kursiga umbes $0.015, kuid kood ise antakse tasuta) mitme eksemplari kaupa, et ei peaks hiljem vastustehingu ootele jÀÀma. Olen teinud vĂ€ikese regulaarne tĂ€iendava puhvri andmebaasis.
- Turni kestab tavaliselt 60 plokkides Waves platvormi plokiahelas, mis praegu kestab enam-vÀhem 1 tund. Turniiri peetakse toimunuks ja suletuks, kui pÀrast 60 plokki on selles vÀhemalt kaks piletit, vastasel juhul pikendatakse turniiri aktiivsuse aega jÀrgmiste 60 ploki vÔrra.
- PÀrast turniiri sulgemist genereerime ja saadame tehingu andmed (mille eest maksame samuti tasu ligikaudu $0.005), vajadusel mitu, kus on fikseeritud kÔik loosimise tingimused ja jÀrjestatud mÀngijate (piletite) loetelu, kust peame valima vÔitjad.
- Sellel etapil on meil juba olemas esimene osa koodist (R-kood) pluss tehingu ID (TXID). Saadame need allkirjastamiseks oraaklile kujul ĂŒhendamises (R-kood + TXID), maksame taas tasu + hĂŒvitise. Oraakel kontrollib saadud andmeid unikaalsuse ja kuuluvuse osas ning vastuseks saadab meile teise osa koodist (S-kood) sha256 formaadis, mis on ka juhuslike numbrite generaatori lĂ€htepunkt.
- Kuna saada juhuslik number, mis nĂ€itab vĂ”itmise pileti jĂ€rjestusnumbrit, muundame S-koodi binaarsetest andmetest sha256 kuueheksandiks (HEX) esituseks. SeejĂ€rel saame HEX-stringist arvu. Saame ĂŒlejÀÀgi jagamisest saadud numbrist piletite koguarvuga (all_tickets) ja lisame tulemustele 1 (et saada number 1 kuni all_tickets). LĂ”puks saame vĂ”itja jĂ€rjestusnumbri.
- Kui loosimise tingimustes on mitu vÔitjat, kordame eelnevaid toiminguid sama palju kordi kui on auhinnakohti. Igal korral eemaldame vÔitnud pileti nimekirjast ja vÀhendame all_tickets vÀÀrtust 1 vÔrra, asendades S-koodi eelnevalt saadud numbriga.
Vaatame konkreetselt tÔelist 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 saama auhinda, mille suurus arvutatakse valemiga (Bet * all_tickets - Fee) / 2.
1. Saime R-koodi:
2. PĂ€rast turniiri lĂ”ppu on meil piletite nimekiri paaride kujul: number + aadress (rahakoti aadress, millega osalemise eest tasuti). VÀÀrib mĂ€rkimist, et aadressid vĂ”ivad korduda, mis tĂ€hendab, et ĂŒks osaleja on ostnud mitu piletit ĂŒhele turniirile, mis ei ole reeglitega keelatud.
Saadetud tehingu kuupÀev:
3. Taotlesime S-koodi: kommentaariga (R-kood + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S
4. Saime S-koodi:
5. MÀÀrasime vÔitjad.
6.
Tulemuseks on meil plokiahelas samm-sammult fikseerimise protsess auhindade loosimisega, mille kontrollimine on vÔimalik igal ajal. Korraldaja poolt tulemusi vÔltsida on praktiliselt vÔimatu, vÀhemalt ei saa seda enam mÀrkamatult teha.
mÀÀrake 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. binaarne -> kuheksand - (bin2hex(sha256(S-kood))): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596
2. kuheksand -> gmp number: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342
3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4
4. modulo -> pilet: 4 -> 145
mÀÀrake 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. binaarne -> kuheksand - (bin2hex(sha256(eelmise kuheksandi))): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0
2. kuheksand -> gmp number: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. modulo -> pilet: 1 -> 139
LÔpp.Allikas: habr.com
