Χρησιμοποιώντας έναν τυχαίο χρησμό χρησιμοποιώντας το παράδειγμα μιας λαχειοφόρου αγοράς

Ένα πρωί έπεσα πάνω σε ένα άρθρο για επαληθεύσιμη γεννήτρια τυχαίων αριθμών στο blockchain της πλατφόρμας Waves.

Η συνολική εικόνα ήταν σαφής, αλλά η συγκεκριμένη μέθοδος υλοποίησης όχι. Μερικοί κωδικοί, υπογραφές, τι, πού, γιατί;

Αρκετές διαβουλεύσεις με τον συγγραφέα του χρησμού, ως αποτέλεσμα, ήταν δυνατός ο συνδυασμός της λογικής σχεδίασης (που εφαρμόζεται στην PHP) με έναν αλγόριθμο για τη λήψη ενός τυχαίου αριθμού.

  1. Στην αρχή του τουρνουά/γύρου, ζητάμε το πρώτο μέρος του κώδικα (R-code) από το μαντείο.

    Προς το παρόν, δεν υπάρχουν πληροφορίες σχετικά με τον αριθμό των παικτών, τον αριθμό των θέσεων βραβείων, το μέγεθος των πληρωμών των επάθλων ή την ύπαρξη της λοταρίας γενικά. Το μαντείο, μέσω μιας συναλλαγής, εκδίδει έναν προσωπικό τυχαίο κωδικό, ο οποίος στη συνέχεια μπορεί να χρησιμοποιηθεί μόνο μία φορά και μόνο από αυτούς που τον ζήτησαν. Παρεμπιπτόντως, ο κωδικός R μπορεί να "αγοραστεί" (που σημαίνει το κόστος της συναλλαγής αιτήματος + αποζημίωση στο μαντείο για τη συναλλαγή απόκρισης, αυτό είναι ένα ποσό περίπου 0.015 $ με την τρέχουσα τιμή, ο ίδιος ο κωδικός εκδίδεται δωρεάν ) πολλές φορές εκ των προτέρων, για να μην περιμένετε την παραλαβή της συναλλαγής απάντησης αργότερα. Έφτιαξα ένα μικρό τακτικά ενημερωμένο buffer στη βάση δεδομένων.

  2. Το τουρνουά διαρκεί συνήθως 60 μπλοκ της blockchain της πλατφόρμας Waves, αυτή τη στιγμή είναι περίπου 1 ώρα. Το τουρνουά θεωρείται ολοκληρωμένο και κλειστό εάν μετά από 60 μπλοκ υπάρχουν τουλάχιστον δύο εισιτήρια σε αυτό, διαφορετικά ο χρόνος δραστηριότητας του τουρνουά παρατείνεται για τα επόμενα 60 μπλοκ.
  3. Αμέσως μετά το κλείσιμο του τουρνουά, δημιουργούμε και στέλνουμε μια συναλλαγή ημερομηνίας (πληρώνουμε επίσης προμήθεια περίπου 0.005 $ για αυτήν), εάν είναι απαραίτητο, αρκετές, στις οποίες καταγράφονται όλες οι συνθήκες της κλήρωσης και μια ταξινομημένη λίστα παικτών (εισιτήρια) από το οποίο πρέπει να επιλέξουμε τους νικητές.
  4. Σε αυτό το στάδιο, έχουμε ήδη το πρώτο μέρος του κωδικού (R-code) συν το αναγνωριστικό ημερομηνίας συναλλαγής (TXID). Τα στέλνουμε για υπογραφή στο μαντείο με τη μορφή συνένωσης (R-code + TXID), και πάλι πληρώνουμε προμήθεια + αποζημίωση. Το μαντείο ελέγχει τα δεδομένα που λαμβάνονται για μοναδικότητα και ανήκουν και ως απάντηση μας στέλνει το δεύτερο μέρος του κώδικα (S-code) σε μορφή sha256, που είναι το σημείο εκκίνησης για τη γεννήτρια τυχαίων αριθμών.
  5. Για να λάβουμε έναν τυχαίο αριθμό που θα υποδεικνύει τον αριθμό σειράς του κερδισμένου δελτίου, μετατρέπουμε τον κωδικό S από τα δυαδικά δεδομένα sha256 σε μια δεκαεξαδική (HEX) αναπαράσταση. Στη συνέχεια, από τη συμβολοσειρά HEX που προκύπτει, παίρνουμε έναν αριθμό. Παίρνουμε το υπόλοιπο της διαίρεσης του αριθμού που προκύπτει με τον αριθμό των εισιτηρίων (all_tickets) και προσθέτουμε 1 στο αποτέλεσμα (για να πάρουμε τον αριθμό 1 πριν από όλα_tickets). Ως αποτέλεσμα, παίρνουμε τον αύξοντα αριθμό του νικητή.
  6. Εάν, σύμφωνα με τους όρους της κλήρωσης, υπάρχουν αρκετοί νικητές, τότε επαναλαμβάνουμε τις προηγούμενες ενέργειες σε ποσό ίσο με τον αριθμό των θέσεων βραβείων. Σε αυτήν την περίπτωση, κάθε φορά που αφαιρούμε από τη λίστα ένα εισιτήριο που έχει ήδη κερδίσει και μειώνουμε τα all_tickets κατά 1 και αντί για S-code υποδεικνύουμε τον προηγούμενο αριθμό που λάβαμε.

Ας δούμε ένα συγκεκριμένο πραγματικό παράδειγμα, το τουρνουά Νο. 119:

Σύνολο 7 εισιτήρια (all_tickets)
Κόστος εισιτηρίου 50 νομίσματα (στοίχημα)
Χρέωση παιχνιδιού 10% (Χρέωση)

Σύμφωνα με τους όρους της κλήρωσης, το 30% πηγαίνει στο χρηματικό έπαθλο, δηλ. Σε αυτή την περίπτωση, 2 εισιτήρια πρέπει να λάβουν ένα έπαθλο, το μέγεθος του οποίου υπολογίζεται σύμφωνα με τον τύπο (Στοιχήματα*όλα_εισιτήρια-Χρέωση)/2.

1. Λήφθηκε ο κωδικός R: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Μετά το κλείσιμο του τουρνουά, έχουμε μια λίστα με εισιτήρια σε μορφή ζευγαριών: αριθμός + διεύθυνση (η διεύθυνση του πορτοφολιού από το οποίο έγινε η πληρωμή για τη συμμετοχή στο τουρνουά). Λάβετε υπόψη ότι οι διευθύνσεις μπορεί να επαναληφθούν, αυτό σημαίνει ότι ένας συμμετέχων αγόρασε πολλά εισιτήρια για ένα τουρνουά αυτό δεν απαγορεύεται από τους κανόνες.

Ημερομηνία αποστολής συναλλαγής: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Ζητούμενος κωδικός S: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV με σχόλιο (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Λήφθηκε ο κωδικός S: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Καθορίστηκαν οι νικητές.

6. Απεσταλμένες πληρωμές

Ως αποτέλεσμα, έχουμε μια βήμα-βήμα καταγραφή της διαδικασίας κλήρωσης του βραβείου στο blockchain με δυνατότητα ελέγχου ανά πάσα στιγμή. Είναι σχεδόν αδύνατο για τον διοργανωτή να χειραγωγήσει τα αποτελέσματα τουλάχιστον, δεν θα είναι πλέον δυνατό να το κάνει απαρατήρητο.

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.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο