Gebruik 'n ewekansige orakel deur die voorbeeld van 'n lotery te gebruik

Ek het een oggend op 'n artikel afgekom oor verifieerbare ewekansige getalgenerator op die Waves-platform blockchain.

Die geheelbeeld was duidelik, maar die spesifieke implementeringsmetode was nie. Sommige kodes, handtekeninge, wat, waar, hoekom?

Verskeie konsultasies met die outeur van die orakel, as gevolg hiervan, was dit moontlik om die tekenlogika (geïmplementeer in PHP) te kombineer met 'n algoritme vir die verkryging van 'n ewekansige getal.

  1. Aan die begin van die toernooi/rondte versoek ons ​​die eerste deel van die kode (R-kode) van die orakel.

    Op hierdie oomblik is daar geen inligting oor die aantal spelers, die aantal prysplekke, die grootte van prysbetalings of die bestaan ​​van die lotery in die algemeen nie. Die orakel, deur middel van 'n transaksie, reik 'n persoonlike ewekansige kode uit, wat dan slegs een keer en slegs gebruik kan word deur diegene wat dit versoek het. Terloops, R-kode kan "gekoop" word (wat beteken die koste van die versoektransaksie + vergoeding aan die orakel vir die reaksietransaksie, dit is 'n bedrag van ongeveer $0.015 teen die huidige koers, die kode self word gratis uitgereik ) verskeie kere vooraf, om nie later te wag vir die ontvangs van die reaksietransaksie nie. Ek het 'n klein buffer wat gereeld opgedateer is in die databasis gemaak.

  2. Die toernooi duur gewoonlik 60 blokke van die Waves-platform-blokketting, op die oomblik is dit ongeveer 1 uur. Die toernooi word as voltooi en gesluit beskou as daar na 60 blokke ten minste twee kaartjies daarin is, anders word die toernooi-aktiwiteitstyd vir die volgende 60 blokke verleng.
  3. Onmiddellik nadat die toernooi gesluit het, genereer en stuur ons 'n datumtransaksie (ons betaal ook 'n kommissie van ongeveer $0.005 daarvoor), indien nodig, verskeie, waarin al die voorwaardes van die trekking aangeteken word en 'n geordende lys van spelers (kaartjies) waaruit ons die wenners moet kies.
  4. Op hierdie stadium het ons reeds die eerste deel van die kode (R-kode) plus die transaksiedatum-ID (TXID). Ons stuur dit vir ondertekening aan die orakel in die vorm van samevoeging (R-kode + TXID), weer betaal ons 'n kommissie + vergoeding. Die orakel kontroleer die ontvangde data vir uniekheid en behoort, en stuur in reaksie vir ons die tweede deel van die kode (S-kode) in sha256-formaat, wat die beginpunt is vir die ewekansige getalgenerator.
  5. Om 'n ewekansige getal te verkry wat die volgordenommer van die wenkaartjie sal aandui, skakel ons die S-kode van die sha256 binêre data om na 'n heksadesimale (HEX) voorstelling. Dan kry ons 'n nommer uit die gevolglike HEX-string. Ons kry die res deur die resulterende getal te deel deur die aantal kaartjies (alle_kaartjies) en voeg 1 by die resultaat (om die getal 1 voor alle_kaartjies te kry). As gevolg hiervan kry ons die reeksnommer van die wenner.
  6. As daar, volgens die voorwaardes van die trekking, verskeie wenners is, herhaal ons die vorige bewerkings in 'n bedrag gelykstaande aan die aantal prysplekke. In hierdie geval verwyder ons elke keer van die lys 'n kaartjie wat reeds gewen het en verminder alle_kaartjies met 1, en in plaas van S-kode dui ons die vorige nommer wat ontvang is aan.

Kom ons kyk na 'n spesifieke werklike voorbeeld, toernooi nr. 119:

Totaal 7 kaartjies (alle_kaartjies)
Kaartjie kos 50 munte (weddenskap)
Spelfooi 10% (fooi)

Volgens die voorwaardes van die lotery gaan 30% aan die prysgeld, m.a.w. in hierdie geval moet 2 kaartjies 'n prys ontvang, waarvan die grootte volgens die formule (Bet*all_tickets-Fee)/2 bereken word.

1. Ontvang R-kode: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Nadat die toernooi gesluit het, het ons 'n lys van kaartjies in die vorm van pare: nommer + adres (die adres van die beursie waaruit betaling vir deelname aan die toernooi gemaak is). Neem asseblief kennis dat adresse herhaal kan word, dit beteken dat een deelnemer verskeie kaartjies vir een toernooi gekoop het; dit word nie deur die reëls verbied nie.

Transaksiedatum gestuur: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Versoekte S-kode: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV met kommentaar (R-kode + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Ontvang S-kode: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Die wenners is bepaal.

6. Betalings gestuur

As gevolg hiervan het ons 'n stap-vir-stap opname van die prystrekkingsprosedure in die blokketting met die vermoë om dit te eniger tyd na te gaan. Dit is byna onmoontlik vir die organiseerder om die resultate te manipuleer; dit sal ten minste nie meer moontlik wees om dit ongemerk te doen nie.

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.

Bron: will.com

Voeg 'n opmerking