Verwendung eines zufälligen Orakels am Beispiel einer Lotterie

Eines Morgens stieß ich auf einen Artikel darüber überprüfbarer Zufallszahlengenerator auf der Waves-Plattform-Blockchain.

Das Gesamtbild war klar, die konkrete Umsetzungsmethode jedoch nicht. Einige Codes, Signaturen, was, wo, warum?

Durch mehrere Rücksprachen mit dem Autor des Orakels war es möglich, die Zeichenlogik (implementiert in PHP) mit einem Algorithmus zum Erhalten einer Zufallszahl zu kombinieren.

  1. Zu Beginn des Turniers/der Runde fordern wir den ersten Teil des Codes (R-Code) vom Orakel an.

    Derzeit liegen keine Informationen über die Anzahl der Spieler, die Anzahl der Gewinnplätze, die Höhe der Gewinnauszahlungen oder die Existenz der Lotterie im Allgemeinen vor. Das Orakel gibt durch eine Transaktion einen persönlichen Zufallscode aus, der dann nur einmal und nur von denjenigen verwendet werden kann, die ihn angefordert haben. Übrigens kann der R-Code „gekauft“ werden (d. h. die Kosten für die Anforderungstransaktion + die Entschädigung an das Orakel für die Antworttransaktion, dies entspricht einem Betrag von etwa 0.015 US-Dollar zum aktuellen Preis, der Code selbst wird kostenlos ausgegeben ) mehrmals im Voraus, um nicht später auf den Eingang der Antworttransaktion warten zu müssen. Ich habe einen kleinen, regelmäßig aktualisierten Puffer in der Datenbank erstellt.

  2. Das Turnier dauert normalerweise 60 Blöcke der Waves-Plattform-Blockchain, derzeit dauert es etwa 1 Stunde. Das Turnier gilt als abgeschlossen und geschlossen, wenn nach 60 Blöcken mindestens zwei Tickets vorhanden sind, andernfalls verlängert sich die Turnieraktivitätszeit um die nächsten 60 Blöcke.
  3. Unmittelbar nach Ende des Turniers erstellen und versenden wir eine Datumstransaktion (wir zahlen dafür auch eine Provision von ca. 0.005 $), ggf. mehrere, in der alle Bedingungen der Verlosung festgehalten sind und eine geordnete Liste der Spieler (Tickets) aus denen wir die Gewinner auswählen müssen.
  4. Zu diesem Zeitpunkt haben wir bereits den ersten Teil des Codes (R-Code) plus die Transaktionsdatum-ID (TXID). Wir senden sie zur Unterschrift in Form einer Verkettung (R-Code + TXID) an das Orakel und zahlen wiederum eine Provision + Entschädigung. Das Orakel prüft die empfangenen Daten auf Einzigartigkeit und Zugehörigkeit und sendet uns als Antwort den zweiten Teil des Codes (S-Code) im sha256-Format, der den Ausgangspunkt für den Zufallszahlengenerator darstellt.
  5. Um eine Zufallszahl zu erhalten, die die Sequenznummer des Gewinnscheins angibt, konvertieren wir den S-Code aus den sha256-Binärdaten in eine hexadezimale (HEX) Darstellung. Aus der resultierenden HEX-Zeichenfolge erhalten wir dann eine Zahl. Wir erhalten den Rest, indem wir die resultierende Zahl durch die Anzahl der Tickets (all_tickets) dividieren und 1 zum Ergebnis addieren (um die Zahl 1 vor all_tickets zu erhalten). Als Ergebnis erhalten wir die Seriennummer des Gewinners.
  6. Wenn es gemäß den Auslosungsbedingungen mehrere Gewinner gibt, wiederholen wir die vorherigen Vorgänge in Höhe der Anzahl der Gewinnplätze. In diesem Fall entfernen wir jedes Mal ein Ticket, das bereits gewonnen hat, aus der Liste, reduzieren all_tickets um 1 und geben anstelle des S-Codes die zuvor erhaltene Nummer an.

Schauen wir uns ein konkretes reales Beispiel an, Turnier Nr. 119:

Insgesamt 7 Tickets (all_tickets)
Ticket kostet 50 Münzen (Wette)
Spielgebühr 10 % (Gebühr)

Laut Lotteriebedingungen entfallen 30 % auf das Preisgeld, d. h. In diesem Fall müssen 2 Tickets einen Preis erhalten, dessen Höhe nach der Formel (Einsatz*alle_Tickets-Gebühr)/2 berechnet wird.

1. R-Code erhalten: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Nach Ende des Turniers haben wir eine Liste der Tickets in Form von Paaren: Nummer + Adresse (die Adresse des Wallets, von dem aus die Zahlung für die Teilnahme am Turnier erfolgt ist). Bitte beachten Sie, dass sich Adressen wiederholen können. Dies bedeutet, dass ein Teilnehmer mehrere Tickets für ein Turnier gekauft hat. Dies ist durch die Regeln nicht verboten.

Datum der gesendeten Transaktion: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

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

4. S-Code erhalten: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Die Gewinner wurden ermittelt.

6. Gesendete Zahlungen

Dadurch haben wir eine schrittweise Aufzeichnung des Gewinnspielvorgangs in der Blockchain und können diese jederzeit überprüfen. Es ist für den Veranstalter nahezu unmöglich, die Ergebnisse zu manipulieren, zumindest nicht mehr unbemerkt.

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

Kommentar hinzufügen