Einsatz eines zufälligen Orakels am Beispiel einer Lotterie

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

Die allgemeine Funktionsweise war klar, aber die spezifische Implementierung – nicht. Irrten Codes, Signaturen, was genau, wo, warum?

Nach mehreren Beratungen mit dem Orakel gelang es schließlich, die Logik der Verlosung (die in PHP umgesetzt wurde) mit dem Algorithmus zur Generierung einer Zufallszahl zu vereinen.

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

    Zu diesem Zeitpunkt gibt es weder Informationen über die Anzahl der Spieler noch über die Anzahl der Preise, noch über die Höhe der Gewinnsummen und überhaupt über die Existenz der Lotterie. Das Orakel liefert über die Transaktion einen persönlichen Zufallscode, der anschließend nur einmal und nur von dem, der ihn angefordert hat, verwendet werden kann. Übrigens kann der R-Code im Voraus 'erworben' werden (damit ist die Transaktionsgebühr für die Anfrage + Entschädigung des Orakels für die Antworttransaktion gemeint, dies kostet etwa 0,015 $ zum aktuellen Kurs, der Code selbst wird kostenlos bereitgestellt), um später nicht auf die Antworttransaktion warten zu müssen. Ich habe einen kleinen, regelmäßig aktualisierten Puffer in der Datenbank eingerichtet.

  2. Das Turnier dauert standardmäßig 60 Blöcke der Waves-Blockchain, was derzeit etwa 1 Stunde entspricht. Das Turnier gilt als abgeschlossen und erfolgreich, wenn nach 60 Blöcken mindestens zwei Tickets vorhanden sind. Andernfalls wird die Aktivitätszeit des Turniers um weitere 60 Blöcke verlängert.
  3. Unmittelbar nach dem Abschluss des Turniers erstellen und senden wir die Transaktionsdaten (für die wir ebenfalls eine Gebühr von etwa 0,005 $ bezahlen), gegebenenfalls mehrere, in denen alle Bedingungen der Auslosung festgehalten und eine geordnete Liste der Spieler (Tickets), aus der wir die Gewinner auswählen müssen, enthalten ist.
  4. An diesem Punkt haben wir bereits den ersten Teil des Codes (R-Code) sowie die ID der Transaktionsdaten (TXID). Wir senden diese zur Signatur an den Oracle in Form einer Verkettung (R-Code + TXID) und zahlen erneut eine Gebühr sowie eine Entschädigung. Der Oracle überprüft die erhaltenen Daten auf Einzigartigkeit und Zugehörigkeit und sendet uns als Antwort den zweiten Teil des Codes (S-Code) im sha256-Format, der als Ausgangspunkt für den Zufallszahlengenerator dient.
  5. Um eine zufällige Zahl zu erhalten, die die Reihenfolge des gewinnenden Tickets angibt, wandeln wir den S-Code aus den Binärdaten von sha256 in eine hexadezimale (HEX) Darstellung um. Dann erhalten wir aus der resultierenden HEX-Zeichenfolge eine Zahl. Wir berechnen den Rest der Division dieser Zahl durch die Anzahl der Tickets (all_tickets) und addieren 1 zum Ergebnis (um eine Zahl zwischen 1 und all_tickets zu erhalten). Am Ende haben wir die Reihenfolge des Gewinners.
  6. Wenn es laut den Bedingungen der Verlosung mehrere Gewinner gibt, wiederholen wir die vorherigen Schritte entsprechend der Anzahl der Preisplätze. Bei jedem Schritt entfernen wir dabei das Ticket, das bereits gewonnen hat, und reduzieren all_tickets um 1, wobei wir anstelle des S-Codes die zuvor erhaltene Zahl verwenden.

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

Insgesamt 7 Tickets (all_tickets)
Der Ticketpreis beträgt 50 Münzen (Bet)
Der Spielbeitrag liegt bei 10 % (Fee)

Laut den Lotteriebestimmungen fließen 30 % in den Preisfonds, d.h. in diesem Fall sollten 2 Tickets einen Preis erhalten, dessen Höhe durch die Formel (Bet * all_tickets - Fee) / 2 berechnet wird.

1. Wir haben den R-Code erhalten: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

Nach dem Abschluss des Turniers haben wir eine Liste von Tickets in Form von Paaren: Nummer + Adresse (Wallet-Adresse, von der die Teilnahmegebühr bezahlt wurde). Es ist zu beachten, dass Adressen sich wiederholen können, was bedeutet, dass ein Teilnehmer mehrere Tickets für ein Turnier gekauft hat, was von den Regeln nicht verboten ist.

Wir haben das Transaktionsdatum gesendet: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

Wir haben den S-Code angefordert: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV mit dem Kommentar (R-Code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

Wir haben den S-Code erhalten: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

Wir haben die Gewinner ermittelt.

6. Auszahlungen wurden gesendet.

So haben wir eine schrittweise Dokumentation des Preisverlosungsverfahrens in der Blockchain, die jederzeit überprüfbar ist. Es ist nahezu unmöglich, die Ergebnisse seitens des Veranstalters zu manipulieren, zumindest wird es nicht unbemerkt geschehen können.

bestimmen Sie den Gewinner Nr. 1

Alle_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 Nummer: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342

3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4

4. modulo -> Ticket: 4 -> 145

bestimmen Sie den Gewinner Nr. 2

Alle_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 Nummer: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. modulo -> Ticket: 1 -> 139

End.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster