Utilizà un oraculu aleatoriu cù l'esempiu di una lotteria

Una matina aghju trovu un articulu circa generatore di numeri aleatorii verificabile nantu à a blockchain di a piattaforma Waves.

A stampa generale era chjara, ma u metudu di implementazione specificu ùn era micca. Certi codici, firme, chì, induve, perchè ?

Parechje cunsultazioni cù l'autore di l'oraculu, in u risultatu, era pussibule cumminà a logica di disegnu (implementata in PHP) cù un algoritmu per ottene un numeru aleatoriu.

  1. À u principiu di u torneu / turnu, dumandemu a prima parte di u codice (R-code) da l'oraculu.

    À questu mumentu, ùn ci hè micca infurmazione nantu à u numeru di ghjucatori, u numeru di posti di premiu, a dimensione di pagamentu di premiu, o l'esistenza di a lotteria in generale. L'oraculu, attraversu una transazzione, emette un codice casuale persunale, chì pò esse usatu solu una volta è solu da quelli chì l'anu dumandatu. In modu, R-code pò esse "acquistu" (chì significheghja u costu di a transazzione di dumanda + compensazione à l'oraculu per a transazzione di risposta, questu hè una quantità di circa $ 0.015 à a tarifa attuale, u codice stessu hè emessu gratuitu). ) parechje volte in anticipu, per ùn aspittà per a ricezione di a transazzione di risposta dopu. Aghju fattu un picculu buffer regularmente aghjurnatu in a basa di dati.

  2. U torneu dura generalmente 60 blocchi di u blockchain di a piattaforma Waves, à u mumentu hè di circa 1 ora. U torneu hè cunsideratu cumpletu è chjusu se dopu à 60 blocchi ci sò almenu dui biglietti in questu, altrimenti u tempu di l'attività di u torneu hè allargatu per i prossimi 60 blocchi.
  3. Immediatamente dopu chì u torneu chjude, generà è mandemu una transazzione di data (paghemu ancu una cumissioni di circa $ 0.005 per questu), se ne necessariu, parechji, in quale tutte e cundizioni di u disegnu sò registrate è una lista urdinata di ghjucatori (biglietti) da quale avemu bisognu di selezziunà i vincitori.
  4. À questu stadiu, avemu digià a prima parte di u codice (R-code) più l'ID di data di transazzione (TXID). Mandemu per a firma à l'oraculu in forma di concatenazione (R-code + TXID), dinò paghemu una cumissioni + compensazione. L'oraculu cuntrolla i dati ricevuti per unicità è appartenenza, è in risposta ci manda a seconda parte di u codice (S-code) in u formatu sha256, chì hè u puntu di partenza per u generatore di numeri aleatorii.
  5. Per ottene un numeru aleatoriu chì indicà u numeru di sequenza di u bigliettu vincitore, cunvertemu u codice S da i dati binari sha256 à una rappresentazione esadecimale (HEX). Allora da a stringa HEX risultante, avemu un numeru. Avemu u restu di dividendu u numeru resultanti da u numeru di biglietti (all_tickets) è aghjunghje 1 à u risultatu (per ottene u numeru 1 prima di all_tickets). In u risultatu, avemu u numeru di seriale di u vincitore.
  6. Se, secondu e cundizioni di u disegnu, ci sò parechji vincitori, allora ripetimu l'operazioni previ in ​​una quantità uguale à u numeru di posti di premiu. In questu casu, ogni volta chì sguassate da a lista un bigliettu chì hà digià vintu è riduce all_tickets da 1, è invece di S-code indichemu u numeru precedente ricevutu.

Fighjemu un esempiu veru specificu, u torneu n ° 119:

Totale 7 biglietti (all_tickets)
U bigliettu costa 50 muniti (Scommessa)
Tariffa di ghjocu 10% (Tassa)

Sicondu e cundizioni di a loteria, 30% và à u premiu di soldi, i.e. in questu casu, i biglietti 2 devenu riceve un premiu, a dimensione di quale hè calculata secondu a formula (Bet*all_tickets-Fee)/2.

1. Ricevutu R-code: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Dopu chì u torneu chjude, avemu una lista di biglietti in forma di coppie: numeru + indirizzu (l'indirizzu di a billetera da quale u pagamentu per a participazione à u torneu hè statu fattu). Per piacè nutate chì l'indirizzi ponu esse ripetuti, questu significa chì un participante hà compru parechji biglietti per un torneu ùn hè micca pruibitu da e regule.

Data di a transazzione mandata: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. S-code dumandatu: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV cù cumentu (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Ricevutu S-code: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. I vincitori sò stati determinati.

6. Pagamenti mandatu

In u risultatu, avemu un arregistramentu passu à passu di a prucedura di disegnu di premiu in u blockchain cù a capacità di verificà in ogni mumentu. Hè guasi impussibile per l'urganizatore di manipulà i risultati almenu, ùn serà più pussibule di fà inapertu.

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

Add a comment