Utilizzando un oracolo casuale usando l'esempio di una lotteria

Una mattina mi sono imbattuto in un articolo su generatore di numeri casuali verificabili sulla blockchain della piattaforma Waves.

Il quadro generale era chiaro, ma il metodo di attuazione specifico non lo era. Alcuni codici, firme, cosa, dove, perché?

Dopo diverse consultazioni con l'autore dell'oracolo, è stato possibile combinare la logica del disegno (implementata in PHP) con un algoritmo per ottenere un numero casuale.

  1. All'inizio del torneo/round chiediamo all'oracolo la prima parte del codice (R-code).

    Al momento non ci sono informazioni sul numero di giocatori, sul numero di posti in palio, sull'entità dei pagamenti dei premi o sull'esistenza della lotteria in generale. L'oracolo, attraverso una transazione, emette un codice casuale personale, che potrà poi essere utilizzato una sola volta e soltanto da chi ne ha fatto richiesta. A proposito, il codice R può essere "acquistato" (ovvero il costo della transazione di richiesta + il compenso all'oracolo per la transazione di risposta, questo è un importo di circa $ 0.015 al tasso attuale, il codice stesso viene rilasciato gratuitamente ) più volte in anticipo, in modo da non attendere successivamente la ricezione della transazione di risposta. Ho creato un piccolo buffer aggiornato regolarmente nel database.

  2. Il torneo dura solitamente 60 blocchi della blockchain della piattaforma Waves, al momento è di circa 1 ora. Il torneo è considerato completato e chiuso se dopo 60 blocchi sono presenti almeno due ticket, altrimenti il ​​tempo di attività del torneo viene prolungato per i successivi 60 blocchi.
  3. Subito dopo la chiusura del torneo, generiamo e inviamo una transazione di data (per questa paghiamo anche una commissione di circa $ 0.005), se necessario, diverse, in cui sono registrate tutte le condizioni dell'estrazione e un elenco ordinato di giocatori (biglietti) da cui dobbiamo selezionare i vincitori.
  4. In questa fase abbiamo già la prima parte del codice (R-code) più l'ID della data della transazione (TXID). Li inviamo per la firma all'oracolo sotto forma di concatenazione (codice R + TXID), ancora una volta paghiamo una commissione + compenso. L'oracolo controlla l'unicità e l'appartenenza dei dati ricevuti e in risposta ci invia la seconda parte del codice (S-code) in formato sha256, che è il punto di partenza per il generatore di numeri casuali.
  5. Per ottenere un numero casuale che indicherà il numero progressivo del biglietto vincente, convertiamo il codice S dai dati binari sha256 in una rappresentazione esadecimale (HEX). Quindi dalla stringa HEX risultante otteniamo un numero. Otteniamo il resto dividendo il numero risultante per il numero di biglietti (all_tickets) e aggiungiamo 1 al risultato (per ottenere il numero 1 prima di all_tickets). Di conseguenza, otteniamo il numero di serie del vincitore.
  6. Se, secondo le condizioni dell'estrazione, ci sono più vincitori, ripetiamo le operazioni precedenti per un importo pari al numero di posti premio. In questo caso, ogni volta togliamo dalla lista un biglietto che ha già vinto e riduciamo all_tickets di 1, e al posto di S-code indichiamo il numero ricevuto in precedenza.

Diamo un'occhiata a un esempio reale specifico, il torneo n. 119:

Totale 7 biglietti (all_tickets)
Il biglietto costa 50 monete (scommessa)
Commissione di gioco 10% (Commissione)

Secondo le condizioni della lotteria, il 30% va al premio in denaro, ad es. in questo caso, 2 biglietti devono ricevere un premio, il cui importo è calcolato secondo la formula (Scommessa*tutti_ticket-Commissione)/2.

1. Codice R ricevuto: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Dopo la chiusura del torneo, abbiamo un elenco di biglietti sotto forma di coppie: numero + indirizzo (l'indirizzo del portafoglio da cui è stato effettuato il pagamento per la partecipazione al torneo). Tieni presente che gli indirizzi possono essere ripetuti, ciò significa che un partecipante ha acquistato più biglietti per un torneo; ciò non è vietato dalle regole.

Data della transazione inviata: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Codice S richiesto: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV con commento (codice R + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Codice S ricevuto: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. I vincitori sono stati determinati.

6. Pagamenti inviati

Di conseguenza, abbiamo una registrazione passo passo della procedura di estrazione del premio nella blockchain con la possibilità di controllarla in qualsiasi momento. È quasi impossibile per l'organizzatore manipolare i risultati; almeno, non sarà più possibile farlo inosservato.

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.

Fonte: habr.com

Aggiungi un commento