Använda ett slumpmässigt orakel med exemplet på ett lotteri

En morgon stötte jag på en artikel om verifierbar slumptalsgenerator på Waves-plattformens blockchain.

Den övergripande bilden var tydlig, men den specifika implementeringsmetoden var det inte. Några koder, signaturer, vad, var, varför?

Flera konsultationer med författaren till oraklet, som ett resultat var det möjligt att kombinera ritningslogiken (implementerad i PHP) med en algoritm för att erhålla ett slumptal.

  1. I början av turneringen/omgången begär vi den första delen av koden (R-koden) från oraklet.

    För närvarande finns det ingen information om antalet spelare, antalet prisplatser, storleken på prisutbetalningarna eller lotteriets existens i allmänhet. Oraklet, genom en transaktion, utfärdar en personlig slumpmässig kod, som sedan endast kan användas en gång och endast av de som begärt den. Förresten, R-kod kan "köpas" (vilket betyder kostnaden för begäranstransaktionen + kompensation till oraklet för svarstransaktionen, detta är ett belopp på cirka 0.015 USD med nuvarande kurs, själva koden utfärdas gratis ) flera gånger i förväg, för att inte vänta på mottagandet av svarstransaktionen senare. Jag gjorde en liten regelbundet uppdaterad buffert i databasen.

  2. Turneringen varar vanligtvis 60 block av Waves-plattformens blockchain, för tillfället är det cirka 1 timme. Turneringen anses avslutad och stängd om det efter 60 block finns minst två biljetter i den, annars förlängs turneringsaktivitetstiden för de kommande 60 blocken.
  3. Omedelbart efter att turneringen stängt genererar och skickar vi en datumtransaktion (vi betalar också en provision på cirka 0.005 USD för det), vid behov flera, där alla villkor för dragningen registreras och en beställd lista över spelare (biljetter) där vi måste välja ut vinnarna.
  4. I detta skede har vi redan den första delen av koden (R-koden) plus transaktionsdatum-ID (TXID). Vi skickar dem för underskrift till oraklet i form av sammanlänkning (R-kod + TXID), återigen betalar vi en provision + ersättning. Oraklet kontrollerar den mottagna datan för unikhet och tillhörighet och skickar som svar oss den andra delen av koden (S-koden) i sha256-format, vilket är startpunkten för slumptalsgeneratorn.
  5. För att få ett slumptal som kommer att indikera sekvensnumret för den vinnande lotten, konverterar vi S-koden från sha256 binära data till en hexadecimal (HEX) representation. Sedan får vi ett nummer från den resulterande HEX-strängen. Vi får resten av att dividera det resulterande talet med antalet biljetter (alla_biljetter) och lägga till 1 till resultatet (för att få talet 1 före alla_biljetter). Som ett resultat får vi vinnarens serienummer.
  6. Om det, enligt villkoren för dragningen, finns flera vinnare, upprepar vi de tidigare operationerna i ett belopp som motsvarar antalet prisplatser. I det här fallet tar vi bort från listan en biljett som redan har vunnit och minskar alla_biljetter med 1, och istället för S-kod anger vi det tidigare mottagna numret.

Låt oss titta på ett specifikt verkligt exempel, turnering nr 119:

Totalt 7 biljetter (alla_biljetter)
Biljetten kostar 50 mynt (satsning)
Spelavgift 10 % (avgift)

Enligt villkoren för lotteriet går 30 % till prispengarna, d.v.s. i detta fall måste 2 biljetter få ett pris, vars storlek beräknas enligt formeln (Bet*all_tickets-Fee)/2.

1. Mottagen R-kod: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Efter att turneringen avslutats har vi en lista över biljetter i form av par: nummer + adress (adressen till plånboken från vilken betalningen för deltagande i turneringen gjordes). Observera att adresser kan upprepas, detta innebär att en deltagare köpt flera biljetter till en turnering, detta är inte förbjudet enligt reglerna.

Transaktionsdatum skickat: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Begärd S-kod: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV med kommentar (R-kod + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Mottagen S-kod: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Vinnarna fastställdes.

6. Skickade betalningar

Som ett resultat har vi en steg-för-steg-inspelning av prisdragningsproceduren i blockkedjan med möjlighet att kontrollera det när som helst. Det är nästan omöjligt för arrangören att manipulera resultaten, åtminstone kommer det inte längre att vara möjligt att göra det obemärkt.

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.

Källa: will.com

Lägg en kommentar