Notaðu handahófskennda véfrétt með því að nota dæmi um happdrætti

Einn morguninn rakst ég á grein um sannanlegan slembitölugjafa á Waves vettvang blockchain.

Heildarmyndin var skýr en hin tiltekna útfærsluaðferð ekki. Sumir kóðar, undirskriftir, hvað, hvar, hvers vegna?

Nokkur samráð við höfund véfréttarinnar, þar af leiðandi, var hægt að sameina teikningarrökfræðina (útfærð í PHP) með reiknirit til að fá slembitölu.

  1. Við upphaf móts/umferðar biðjum við um fyrsta hluta kóðans (R-kóða) frá véfréttinum.

    Á þessari stundu eru engar upplýsingar um fjölda spilara, fjölda vinningsstaða, stærð vinningagreiðslna eða tilvist happdrættisins almennt. Véfrétturinn gefur út persónulegan slembikóða í gegnum viðskipti, sem síðan er aðeins hægt að nota einu sinni og aðeins af þeim sem óskuðu eftir því. Við the vegur, R-kóða er hægt að "kaupa" (sem þýðir kostnað við beiðni viðskiptin + bætur til véfrétta fyrir svarfærsluna, þetta er upphæð um $0.015 á núverandi gengi, kóðinn sjálfur er gefinn út ókeypis ) nokkrum sinnum fyrirfram, til að bíða ekki eftir móttöku svarfærslunnar síðar. Ég gerði lítið reglulega uppfært biðminni í gagnagrunninum.

  2. Mótið tekur venjulega 60 blokkir af Waves platform blockchain, í augnablikinu er það um það bil 1 klukkustund. Mótið telst lokið og lokað ef eftir 60 blokkir eru að minnsta kosti tveir miðar í því, annars lengist virknitími mótsins í næstu 60 blokkir.
  3. Strax eftir að mótinu lýkur, búum við til og sendum dagsetningarfærslu (við borgum einnig um það bil $0.005 þóknun fyrir það), ef nauðsyn krefur, nokkrar, þar sem öll skilyrði dráttarins eru skráð og skipaður listi yfir leikmenn (miðar) sem við þurfum að velja vinningshafa úr.
  4. Á þessu stigi erum við nú þegar með fyrsta hluta kóðans (R-kóða) auk auðkenni viðskiptadagsetningar (TXID). Við sendum þá til undirskriftar til véfréttarinnar í formi samtengingar (R-kóði + TXID), aftur borgum við þóknun + bætur. Véfrétturinn athugar móttekið gögn með tilliti til sérstöðu og tilheyrandi og sendir okkur sem svar seinni hluta kóðans (S-kóða) á sha256 sniði, sem er upphafspunktur slembitöluframleiðandans.
  5. Til að fá slembitölu sem gefur til kynna raðnúmer vinningsmiðans, umbreytum við S-kóðanum úr sha256 tvöfalda gögnunum í sextánskur (HEX) framsetningu. Síðan fáum við tölu úr HEX strengnum sem myndast. Við fáum afganginn af því að deila tölunni sem myndast með fjölda miða (allir_miðar) og bæta 1 við niðurstöðuna (til að fá töluna 1 á undan öllum_miðum). Fyrir vikið fáum við raðnúmer sigurvegarans.
  6. Ef það eru nokkrir sigurvegarar, samkvæmt skilyrðum dráttarins, þá endurtökum við fyrri aðgerðir í upphæð sem jafngildir fjölda verðlaunasæta. Í þessu tilviki, í hvert skipti sem við fjarlægjum af listanum miða sem hefur þegar unnið og fækkum alla_miða um 1, og í stað S-kóða tilgreinum við fyrri númerið sem við fengum.

Lítum á ákveðið raunverulegt dæmi, mót nr. 119:

Alls 7 miðar (allir_miðar)
Miði kostaði 50 mynt (veðmál)
Leikjagjald 10% (gjald)

Samkvæmt skilyrðum lottósins renna 30% í vinningsféð, þ.e. í þessu tilviki verða 2 miðar að fá verðlaun, stærð þeirra er reiknuð út samkvæmt formúlunni (Bet*all_tickets-Fee)/2.

1. Móttekin R-kóði: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Eftir að mótinu lýkur höfum við lista yfir miða í formi pöra: númer + heimilisfang (heimilisfang vesksins sem greitt var fyrir þátttöku í mótinu úr). Athugið að heimilisföng geta verið endurtekin, þetta þýðir að einn þátttakandi keypti nokkra miða á eitt mót; þetta er ekki bannað samkvæmt reglum.

Sendingardagur viðskipta: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Umbeðinn S-kóði: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV með athugasemd (R-kóði + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Móttekin S-kóði: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Sigurvegarar voru ákveðnir.

6. Sendar greiðslur

Fyrir vikið höfum við skref-fyrir-skref upptöku af verðlaunaútdráttarferlinu í blockchain með getu til að athuga það hvenær sem er. Það er nánast ómögulegt fyrir skipuleggjanda að hagræða niðurstöðunum, að minnsta kosti verður ekki lengur hægt að gera það óséður.

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.

Heimild: www.habr.com

Bæta við athugasemd