En morgon snubblade jag över en artikel om pÄ Waves plattform.
Den övergripande bilden var klar, men den specifika implementeringen â inte. NĂ„gra koder, signaturer, vad, vart, varför?
Efter flera konsultationer med författaren till oraklet lyckades jag förena logiken för utlottningen (implementerad i PHP) med algoritmen för att fÄ ett slumptal.
- Vid starten av turneringen/rundan begÀr vi frÄn oraklet den första delen av koden (R-code).
Vid detta ögonblick finns det ingen information om antalet spelare, antalet prisplatser, storleken pÄ prispengarna eller ens existensen av lotteriet. Oraklet utfÀrdar genom transaktionen en personlig slumptalskod som kan anvÀndas endast en gÄng och endast av den som begÀrt den. Förresten, R-code kan "köpas" (det handlar om kostnaden för transaktionsbegÀran + ersÀttning till oraklet för den svarande transaktionen, summan Àr cirka $0.015 enligt aktuell kurs, sjÀlva koden ges gratis) i förvÀg, sÄ att man slipper vÀnta pÄ att fÄ svarstransaktionen. Jag skapade en liten buffer i databasen som regelbundet fylls pÄ.
- Turneringen pÄgÄr normalt i 60 block av Waves plattformens blockchain, vilket för nÀrvarande motsvarar ungefÀr 1 timme. Turneringen anses ha Àgt rum och stÀngts om det finns minst tvÄ biljetter efter 60 block, annars förlÀngs turneringens aktiva tid med ytterligare 60 block.
- Omedelbart efter stĂ€ngningen av turneringen skapar och skickar vi en datatransaktion (för vilken vi ocksĂ„ betalar en avgift pĂ„ cirka $0.005), om nödvĂ€ndigt â flera, dĂ€r alla villkor för utlottningen och den ordnade listan över spelare (biljetter) som vi behöver vĂ€lja vinnare ifrĂ„n Ă€r dokumenterade.
- I detta skede har vi redan den första delen av koden (R-code) plus ID för datatransaktionen (TXID). Vi skickar dem för signering till oraklet i form av en konkatenering (R-code + TXID), igen betalar vi avgiften och ersÀttningen. Oraklet kontrollerar de mottagna uppgifterna för unikhet och Àgarskap och skickar tillbaka den andra delen av koden (S-code) i sha256-format, som utgör startpunkten för slumptalsgeneratorn.
- För att fÄ ett slumpmÀssigt nummer som anger den ordningsföljd som vinner biljetten, konverterar vi S-koden frÄn binÀr data i sha256 till hexadecimalt (HEX) format. DÀrefter hÀmtar vi ett nummer frÄn den resulterande HEX-strÀngen. Vi berÀknar resten av divisionen av det erhÄllna numret med antalet biljetter (all_tickets) och lÀgger till 1 (för att fÄ ett nummer frÄn 1 till all_tickets). Slutresultatet blir vinnarbiljettens ordningsnummer.
- Om det i lotteriets regler finns flera vinnare, upprepar vi tidigare operationer lika mÄnga gÄnger som det finns prispengar. Varje gÄng tar vi bort den biljett som redan har vunnit och minskar all_tickets med 1, och istÀllet för S-kod anger vi det tidigare erhÄllna numret.
LÄt oss gÄ igenom ett konkret exempel, turnering nr 119:
Totalt 7 biljetter (all_tickets)
Biljettpriset Àr 50 mynt (Bet)
Spelavgift 10% (Fee)
Enligt lotteriets villkor gÄr 30% till priser, dvs. i detta fall ska 2 biljetter fÄ pris, vars storlek berÀknas enligt formeln (Bet*all_tickets-Fee)/2.
1. Vi fick R-koden:
2. Efter avslutningen av turneringen har vi en lista över biljetter i form av par: nummer + adress (adressen frÄn plÄnboken som anvÀndes för att betala för deltagandet i turneringen). Observera att adresser kan upprepas, vilket innebÀr att en deltagare har köpt flera biljetter till samma turnering, nÄgot som inte strider mot reglerna.
Vi skickade transaktionsdatumet:
3. BegÀrde S-koden: med kommentar (R-kod + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S
4. Vi fick S-koden:
5. Vi bestÀmde vinnarna.
6.
Som resultat har vi en steg-för-steg registrering av prisutdelningsproceduren i blockchain som kan verifieras nÀr som helst. Att manipulera resultaten frÄn arrangörens sida Àr praktiskt taget omöjligt, Ätminstone kan det inte göras obemÀrkt.
bestÀm vinnaren nr 1
Alla biljetter:
Index: 1 Biljett:139
Index: 2 Biljett:141
Index: 3 Biljett:143
Index: 4 Biljett:145
Index: 5 Biljett:147
Index: 6 Biljett:149
Index: 7 Biljett:151
1. bin -> hex ( bin2hex(sha256(S-kod)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596
2. hex -> gmp nummer: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342
3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4
4. modulo -> biljett: 4 -> 145
bestÀm vinnaren nr 2
Alla biljetter:
Index: 1 Biljett:139
Index: 2 Biljett:141
Index: 3 Biljett:143
Index: 4 Biljett:147
Index: 5 Biljett:149
Index: 6 Biljett:151
1. bin -> hex ( bin2hex(sha256(föregÄende hex)) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0
2. hex -> gmp nummer: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. modulo -> biljett: 1 -> 139
Slut.KĂ€lla: habr.com
