Eines Morgens stieĂ ich auf einen Artikel ĂŒber auf der Blockchain der Waves-Plattform.
Das allgemeine Bild war klar, aber die spezifische Umsetzung â nicht. Irgendwelche Codes, Signaturen, was, wohin, warum?
Nach mehreren Konsultationen beim Autor des Orakels gelang es schlieĂlich, die Logik der Verlosung (auf PHP umgesetzt) mit dem Algorithmus zur Ermittlung einer Zufallszahl zu verbinden.
- Zum Zeitpunkt des Starts des Turniers/Runden fordern wir vom Orakel den ersten Teil des Codes (R-Code) an.
In diesem Moment gibt es keine Informationen ĂŒber die Anzahl der Spieler, die Anzahl der PreisplĂ€tze, die Höhe der Preisgelder und ĂŒberhaupt ĂŒber die Existenz der Lotterie. Das Orakel gibt durch eine Transaktion einen persönlichen Zufallscode aus, der spĂ€ter nur einmal verwendet werden kann und nur von dem, der ihn angefordert hat. Ăbrigens kann der R-Code im Voraus in mehreren Exemplaren âgekauftâ werden (d.h. die Transaktionskosten fĂŒr die Anfrage + EntschĂ€digung fĂŒr das Orakel fĂŒr die Antworttransaktion, diese Summe betrĂ€gt etwa 0,015 USD zum aktuellen Kurs, der Code selbst wird kostenlos ausgegeben), damit man dann nicht auf die Antworttransaktion warten muss. Ich habe einen kleinen regelmĂ€Ăig nachfĂŒllbaren Puffer in der Datenbank erstellt.
- Das Turnier dauert standardmĂ€Ăig 60 Blöcke der Waves-Plattform-Blockchain, derzeit entspricht das etwa 1 Stunde. Ein Turnier gilt als abgehalten und geschlossen, wenn nach 60 Blöcken mindestens zwei Tickets vorhanden sind, andernfalls wird die AktivitĂ€tszeit des Turniers um weitere 60 Blöcke verlĂ€ngert.
- Unmittelbar nach dem Abschluss des Turniers erstellen und senden wir die Daten-Transaktion (fĂŒr die wir ebenfalls eine GebĂŒhr von etwa 0,005 USD zahlen), falls erforderlich â mehrere, in der alle Bedingungen der Verlosung und die geordnete Liste der Spieler (Tickets) festgehalten sind, aus der wir die Gewinner auswĂ€hlen mĂŒssen.
- In diesem Stadium haben wir bereits den ersten Teil des Codes (R-Code) plus die ID der Daten-Transaktion (TXID). Wir senden sie zur Unterschrift an das Orakel in Form einer Verkettung (R-Code + TXID) und zahlen erneut GebĂŒhren + EntschĂ€digung. Das Orakel prĂŒft die erhaltenen Daten auf Einzigartigkeit und Zuordnung und sendet uns als Antwort den zweiten Teil des Codes (S-Code) im sha256-Format zurĂŒck, der den Ausgangspunkt fĂŒr den Zufallszahlengenerator darstellt.
- Um eine Zufallszahl zu erhalten, die die Reihenfolge der Gewinnscheine angibt, wandeln wir den S-Code aus den binÀren sha256-Daten in eine hexadezimale (HEX) Darstellung um. Dann erhalten wir aus der resultierenden HEX-Zeichenfolge eine Zahl. Wir berechnen den Rest der Division der erhaltenen Zahl durch die Anzahl der Tickets (all_tickets) und addieren 1 zum Ergebnis (um die Zahl 1 bis all_tickets zu erhalten). Am Ende haben wir die Gewinnnummer.
- Wenn es gemÀà den Bedingungen der Auslosung mehrere Gewinner gibt, wiederholen wir die vorherigen Schritte in der Anzahl, die der Anzahl der GewinnplÀtze entspricht. Dabei entfernen wir jedes Mal den bereits gewÀhlten Schein aus der Liste und verringern all_tickets um 1, und anstelle des S-Codes geben wir die vorherige erhaltene Zahl an.
Betrachten wir ein konkretes Beispiel, Turnier Nr. 119:
Insgesamt 7 Tickets (all_tickets)
Der Preis eines Tickets betrĂ€gt 50 MĂŒnzen (Bet)
SpielgebĂŒhr 10% (Fee)
Laut den Bedingungen der Lotterie flieĂen 30% in die GewinnprĂ€mien, d.h. in diesem Fall sollten 2 Tickets einen Preis erhalten, dessen GröĂe anhand der Formel (Bet*all_tickets-Fee)/2 berechnet wird.
1. R-Code erhalten:
2. Nach dem Abschluss des Turniers haben wir eine Liste der Tickets in Form von Paaren: Nummer + Adresse (Wallet-Adresse, von der die TeilnahmegebĂŒhr fĂŒr das Turnier bezahlt wurde). Beachten Sie, dass die Adressen sich wiederholen können, was bedeutet, dass ein Teilnehmer mehrere Tickets fĂŒr ein Turnier gekauft hat, was gemÀà den Regeln zulĂ€ssig ist.
Transaktionsdatum gesendet:
3. S-Code angefordert: mit dem Kommentar (R-Code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S
4. S-Code erhalten:
5. Gewinner bestimmt.
6.
Infolgedessen haben wir auf der Blockchain eine schrittweise Dokumentation des Verfahren zur Preisvergabe, die jederzeit ĂŒberprĂŒft werden kann. Es ist praktisch unmöglich, die Ergebnisse von Seiten des Veranstalters zu manipulieren, zumindest lĂ€sst es sich nicht unbemerkt tun.
Bestimmen Sie den Gewinner â 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 Zahl: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342
3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4
4. modulo -> Ticket: 4 -> 145
Bestimmen Sie den Gewinner â 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 Zahl: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360
3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1
4. modulo -> Ticket: 1 -> 139
Ende.Quelle: habr.com
