Een willekeurig orakel gebruiken met het voorbeeld van een loterij

Op een ochtend kwam ik een artikel tegen over verifieerbare willekeurige nummergenerator op de blockchain van het Waves-platform.

Het totaalbeeld was duidelijk, maar de specifieke implementatiewijze niet. Sommige codes, handtekeningen, wat, waar, waarom?

Verschillende consultaties met de auteur van het orakel, als resultaat was het mogelijk om de tekenlogica (geïmplementeerd in PHP) te combineren met een algoritme voor het verkrijgen van een willekeurig getal.

  1. Bij aanvang van het toernooi/ronde vragen wij het eerste deel van de code (R-code) op bij het orakel.

    Op dit moment is er geen informatie over het aantal spelers, het aantal prijsplaatsen, de omvang van de prijsbetalingen of het bestaan ​​van de loterij in het algemeen. Het orakel geeft via een transactie een persoonlijke willekeurige code uit, die vervolgens slechts één keer kan worden gebruikt en alleen door degenen die erom hebben gevraagd. Overigens kan R-code worden “gekocht” (dat wil zeggen de kosten van de verzoektransactie + compensatie aan het orakel voor de responstransactie, dit is een bedrag van ongeveer $ 0.015 tegen het huidige tarief, de code zelf wordt gratis uitgegeven ) meerdere keren van tevoren, om later niet te wachten op de ontvangst van de responstransactie. Ik heb een kleine, regelmatig bijgewerkte buffer in de database gemaakt.

  2. Het toernooi duurt doorgaans 60 blokken van de blockchain van het Waves-platform, op dit moment is dit ongeveer 1 uur. Het toernooi wordt als voltooid en gesloten beschouwd als er na 60 blokken minstens twee tickets inzitten, anders wordt de activiteitstijd van het toernooi verlengd met de volgende 60 blokken.
  3. Onmiddellijk nadat het toernooi is gesloten, genereren en verzenden we een datumtransactie (we betalen er ook een commissie van ongeveer $ 0.005 voor), indien nodig meerdere, waarin alle voorwaarden van de trekking zijn vastgelegd en een geordende lijst met spelers (tickets) waaruit we de winnaars moeten selecteren.
  4. In dit stadium hebben we al het eerste deel van de code (R-code) plus de transactiedatum-ID (TXID). We sturen ze ter ondertekening naar het orakel in de vorm van aaneenschakeling (R-code + TXID), opnieuw betalen we een commissie + compensatie. Het orakel controleert de ontvangen gegevens op uniciteit en verbondenheid, en stuurt ons in reactie daarop het tweede deel van de code (S-code) in sha256-formaat, wat het startpunt is voor de generator van willekeurige getallen.
  5. Om een ​​willekeurig getal te verkrijgen dat het volgnummer van het winnende lot aangeeft, converteren we de S-code van de binaire sha256-gegevens naar een hexadecimale (HEX) weergave. Vervolgens krijgen we uit de resulterende HEX-reeks een getal. We krijgen de rest van het resulterende getal gedeeld door het aantal tickets (all_tickets) en tellen 1 op bij het resultaat (om het getal 1 vóór all_tickets te krijgen). Als resultaat krijgen we het serienummer van de winnaar.
  6. Als er volgens de voorwaarden van de trekking meerdere winnaars zijn, herhalen we de voorgaande bewerkingen voor een bedrag dat gelijk is aan het aantal prijsplaatsen. In dit geval verwijderen we elke keer dat we een ticket dat al gewonnen heeft uit de lijst en verminderen we all_tickets met 1, en in plaats van de S-code geven we het eerder ontvangen nummer aan.

Laten we eens kijken naar een specifiek, echt voorbeeld, toernooi nr. 119:

Totaal 7 kaartjes (all_tickets)
Ticket kost 50 munten (inzet)
Spelkosten 10% (kosten)

Volgens de voorwaarden van de loterij gaat 30% naar het prijzengeld, d.w.z. in dit geval moeten 2 tickets een prijs ontvangen, waarvan de grootte wordt berekend volgens de formule (Bet*all_tickets-Fee)/2.

1. Ontvangen R-code: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Nadat het toernooi is gesloten, hebben we een lijst met tickets in de vorm van paren: nummer + adres (het adres van de portemonnee waaruit de betaling voor deelname aan het toernooi is gedaan). Houd er rekening mee dat adressen herhaald kunnen worden, dit betekent dat één deelnemer meerdere kaartjes voor één toernooi heeft gekocht; dit is niet verboden door de regels.

Transactiedatum verzonden: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Gevraagde S-code: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV met commentaar (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Ontvangen S-code: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. De winnaars werden bepaald.

6. Betalingen verzonden

Als gevolg hiervan hebben we een stapsgewijze registratie van de prijstrekkingsprocedure in de blockchain, met de mogelijkheid om deze op elk moment te controleren. Het is voor de organisator bijna onmogelijk om de resultaten te manipuleren; althans, het zal niet meer mogelijk zijn om dit onopgemerkt te doen.

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: www.habr.com

Voeg een reactie