Mit einem zufÀlligen Orakel am Beispiel einer Lotterie

Eines Morgens fiel mir ein Artikel ĂŒber den getesteten Zufallszahlengenerator auf der Blockchain der Waves-Plattform auf.

Das Gesamtbild war verstÀndlich, die Methode der spezifischen Umsetzung jedoch nicht. Irgendwelche Codes, Unterschriften, was, wo, warum?

Bei einigen Konsultationen mit dem Autor des Orakels stellte sich heraus, dass die Logik der Zeichnung (in PHP implementiert) mit einem Algorithmus zum Erhalten einer Zufallszahl kombiniert wurde.

  1. Zu Beginn des Turniers / der Runde fragen wir das Orakel nach dem ersten Teil des Codes (R-Code).

    Derzeit gibt es keine Informationen ĂŒber die Anzahl der Spieler, die Anzahl der Preise, die Höhe der Preiszahlungen und allgemein ĂŒber die Existenz einer Lotterie. Das Orakel durch eine Transaktion gibt einen persönlichen Zufallscode aus, der in Zukunft nur noch einmal und nur fĂŒr diejenigen verwendet werden kann, die ihn angefordert haben. Übrigens kann der R-Code im Voraus „gekauft“ werden (bezogen auf die Kosten der Anforderungstransaktion + Orakelkompensation fĂŒr die Antworttransaktion, dies ist ein Betrag in der GrĂ¶ĂŸenordnung von 0,015 USD zum aktuellen Preis, der Code selbst wird kostenlos ausgegeben), sodass Sie nicht warten mĂŒssen, bis die Antworttransaktion spĂ€ter eingeht. Ich habe einen kleinen regelmĂ€ĂŸig aktualisierten Puffer in der Datenbank erstellt.
  2. Das Turnier dauert standardmĂ€ĂŸig mit 60 Blöcken der Waves-Plattform-Blockchain, im Moment dauert es ungefĂ€hr 1 Stunde. Ein Turnier gilt als gehalten und geschlossen, wenn nach 60 Blöcken mindestens zwei Tickets vorhanden sind. Andernfalls wird die AktivitĂ€tszeit des Turniers um die nĂ€chsten 60 Blöcke verlĂ€ngert.
  3. Unmittelbar nach dem Ende des Turniers bilden wir das Datum der Transaktion und senden es (wir zahlen auch eine Provision von ungefĂ€hr 0,005 USD dafĂŒr), falls erforderlich, einige, in denen alle Bedingungen der Ziehung und eine geordnete Liste von Spielern (Tickets) festgelegt sind, aus denen wir die Gewinner auswĂ€hlen mĂŒssen.
  4. Zu diesem Zeitpunkt haben wir bereits den ersten Teil des Codes (R-Code) sowie die Transaktionsdatum-ID (TXID). Wir senden sie zur Unterschrift in Form einer Verkettung (R-Code + TXID) an das Orakel, zahlen erneut eine Provision + EntschĂ€digung. Das Orakel ĂŒberprĂŒft die Daten auf Eindeutigkeit und Zugehörigkeit und sendet uns als Antwort den zweiten Teil des Codes (S-Code) im sha256-Format, der der Ausgangspunkt fĂŒr den Zufallszahlengenerator ist.
  5. Um eine Zufallszahl zu erhalten, die die Sequenznummer des Gewinnertickets angibt, konvertieren wir den S-Code von sha256-BinÀrdaten in eine hexadezimale (HEX) Darstellung. Dann erhalten wir aus der resultierenden HEX-Zeichenfolge eine Zahl. Wir erhalten den Rest der Division der resultierenden Anzahl durch die Anzahl der Tickets (all_tickets) und addieren zum Ergebnis 1 (um die Nummer 1 zu all_tickets zu erhalten). Als Ergebnis erhalten wir die Seriennummer des Gewinners.
  6. Wenn es unter den Bedingungen der Ziehung mehrere Gewinner gibt, wiederholen wir die vorherigen VorgÀnge in einer Höhe, die der Anzahl der Preise entspricht. Gleichzeitig löschen wir jedes Mal, wenn wir das bereits gewonnene Ticket aus der Liste löschen und all_tickets um 1 reduzieren, anstelle des S-Codes die zuvor erhaltene Nummer.

Lassen Sie uns ein konkretes Beispiel aus der Praxis analysieren, Turnier Nr. 119:

Nur 7 Tickets (all_tickets)
Ticketpreis 50 MĂŒnzen (Wette)
SpielgebĂŒhr 10% (GebĂŒhr)

GemĂ€ĂŸ den Bedingungen der Lotterie erhalten 30% den Preis, d.h. In diesem Fall mĂŒssen 2 Tickets einen Preis erhalten, dessen GrĂ¶ĂŸe nach der Formel (Bet * all_tickets-Fee) / 2 berechnet wird.

1. Erhaltener R-Code: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Nach dem Ende des Turniers haben wir eine Liste von Tickets in Form von Paaren: Nummer + Adresse (Brieftaschenadresse, von der die Teilnahme am Turnier bezahlt wurde). Beachten Sie, dass die Adressen wiederholt werden können. Dies bedeutet, dass ein Teilnehmer mehrere Tickets in einem Turnier gekauft hat. Dies ist nach den Regeln nicht verboten.

Gesendetes Transaktionsdatum: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Angeforderter S-Code: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV mit Kommentar (R-Code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Erhaltener S-Code: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Die Gewinner wurden ermittelt.

6. Auszahlungen gesendet

Infolgedessen haben wir in der Blockchain eine schrittweise Fixierung des Gewinnspielprozesses mit der Möglichkeit, ihn jederzeit zu ĂŒberprĂŒfen. Es ist fast unmöglich, die Ergebnisse des Veranstalters zu manipulieren, zumindest wird es nicht leise funktionieren.

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. 

Source: https://habr.com/ru/post/de454102/


All Articles