Τυχαίο μαντείο με βάση την ψηφιακή υπογραφή στο blockchain

Από την ιδέα στην υλοποίηση: τροποποιούμε το υπάρχον σχήμα ψηφιακής υπογραφής ελλειπτικής καμπύλης ώστε να είναι ντετερμινιστικό και βάσει αυτού παρέχουμε συναρτήσεις για τη λήψη ψευδοτυχαίων αριθμών επαληθεύσιμων εντός της αλυσίδας μπλοκ.

Τυχαίο μαντείο με βάση την ψηφιακή υπογραφή στο blockchain

Ιδέα

Το φθινόπωρο του 2018, συμπεριλήφθηκε το blockchain Waves ενεργοποιήθηκαν τα πρώτα έξυπνα συμβόλαια, προέκυψε αμέσως το ερώτημα για τη δυνατότητα απόκτησης ψευδοτυχαίοι αριθμοίπου μπορείτε να εμπιστευτείτε.

Περπατώντας σε αυτό το ερώτημα, τελικά κατέληξα στο συμπέρασμα: κάθε blockchain είναι ένα κύτταρο· είναι αδύνατο να αποκτήσετε μια αξιόπιστη πηγή εντροπίας σε ένα κλειστό σύστημα.

Αλλά μου άρεσε ακόμα μια ιδέα: αν τυχαίο χρησμό θα υπογράψει δεδομένα χρήστη με έναν ντετερμινιστικό αλγόριθμο, τότε ο χρήστης θα μπορεί πάντα να επαληθεύει μια τέτοια υπογραφή χρησιμοποιώντας το δημόσιο κλειδί και θα είναι σίγουρος ότι η τιμή που προκύπτει είναι μοναδική. Ο χρησμός, όσο κι αν θέλει, δεν μπορεί να αλλάξει τίποτα· ο αλγόριθμος παράγει ένα σαφές αποτέλεσμα. Ουσιαστικά, ο χρήστης καταγράφει το αποτέλεσμα, αλλά δεν το γνωρίζει μέχρι να το δημοσιεύσει ο χρησμός. Αποδεικνύεται ότι δεν μπορείτε να εμπιστευτείτε καθόλου το μαντείο, αλλά να ελέγξετε το αποτέλεσμα της δουλειάς του. Στη συνέχεια, σε περίπτωση επιτυχούς επαλήθευσης, μια τέτοια υπογραφή μπορεί να θεωρηθεί πηγή εντροπίας για έναν ψευδοτυχαίο αριθμό.

Η πλατφόρμα blockchain Waves χρησιμοποιεί ένα σχήμα υπογραφών EdDSA επιλογή Ed25519. Σε αυτό το σχήμα, η υπογραφή αποτελείται από τις τιμές R και S, όπου το R εξαρτάται από μια τυχαία τιμή και το S υπολογίζεται με βάση το μήνυμα που υπογράφεται, το ιδιωτικό κλειδί και τον ίδιο τυχαίο αριθμό με το R. Αποδεικνύεται ότι δεν υπάρχει μοναδική εξάρτηση για το ίδιο Υπάρχουν πολλές έγκυρες υπογραφές για ένα μήνυμα χρήστη.

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

Αλλά, όπως αποδείχθηκε, είναι πραγματικά δυνατό να γίνει ντετερμινιστικό.

Είχα μεγάλες ελπίδες για επαληθεύσιμη τυχαία συνάρτηση (VRF), αλλά αφού μελέτησα το υλικό, έπρεπε να εγκαταλείψω αυτήν την επιλογή. Αν και το VRF προσφέρει μια ντετερμινιστική εκδοχή της υπογραφής και της απόδειξής της, υπάρχει μια περίεργη θέση στον αλγόριθμο που ανοίγει μια μαύρη τρύπα για χειραγώγηση του μαντείου. Δηλαδή, κατά τον υπολογισμό της τιμής του k (ενότητα 5.1) χρησιμοποιείται ένα ιδιωτικό κλειδί, το οποίο παραμένει άγνωστο στον χρήστη, πράγμα που σημαίνει ότι ο χρήστης δεν μπορεί να επαληθεύσει την ορθότητα του υπολογισμού του k, πράγμα που σημαίνει ότι το μαντείο μπορεί να χρησιμοποιήσει οποιαδήποτε τιμή του k χρειάζεται και ταυτόχρονα να διατηρεί μια βάση δεδομένων αντιστοιχιών του k και τα υπογεγραμμένα δεδομένα για να μπορούμε πάντα να υπολογίζουμε εκ νέου το σωστό αποτέλεσμα από την άποψη του VRF . Εάν δείτε ένα σχέδιο που βασίζεται σε VRF χωρίς να αποκαλύψετε το ιδιωτικό κλειδί, μπορείτε να είστε έξυπνοι: υποδείξτε την ανάγκη είτε να αποκαλύψετε το κλειδί είτε να το εξαιρέσετε από τον υπολογισμό του k, τότε το ιδιωτικό κλειδί θα αποκαλυφθεί αυτόματα όταν εμφανιστεί η πρώτη υπογραφή . Σε γενικές γραμμές, όπως ήδη αναφέρθηκε, ένα περίεργο σχέδιο για έναν τυχαίο χρησμό.

Μετά από λίγη σκέψη και την υποστήριξη τοπικών αναλυτών, γεννήθηκε το πρόγραμμα εργασίας VECRO.

Το VECRO είναι μια συντομογραφία του Verifiable Elliptic Curve Random Oracle, που στα ρωσικά σημαίνει επαληθεύσιμος τυχαίος χρησμός σε ελλειπτικές καμπύλες.

Όλα αποδείχθηκαν αρκετά απλά· για να επιτύχετε τον ντετερμινισμό, πρέπει να διορθώσετε την τιμή του R πριν εμφανιστεί το μήνυμα προς υπογραφή. Εάν το R είναι δεσμευμένο και είναι μέρος του υπογεγραμμένου μηνύματος, πράγμα που διασφαλίζει περαιτέρω ότι το R δεσμεύεται στο μήνυμα που υπογράφεται, η τιμή του S καθορίζεται μοναδικά από το μήνυμα του χρήστη και επομένως μπορεί να χρησιμοποιηθεί ως πηγή ψευδοτυχαίων αριθμών.

Σε ένα τέτοιο σχήμα, δεν έχει σημασία πώς καθορίζεται το R· αυτό παραμένει ευθύνη του μαντείου. Είναι σημαντικό το S να καθορίζεται μοναδικά από τον χρήστη, αλλά η τιμή του είναι άγνωστη μέχρι να το δημοσιεύσει ο χρησμός. Όλα όσα θέλαμε!

Μιλώντας για σταθερό R, σημειώστε ότι επαναχρησιμοποιημένο R όταν υπογράφετε διάφορα μηνύματα, αποκαλύπτει μοναδικά το ιδιωτικό κλειδί στο σχήμα EdDSA. Είναι εξαιρετικά σημαντικό για τον ιδιοκτήτη του μαντείου να εξαλείψει τη δυνατότητα επαναχρησιμοποίησης του R για την υπογραφή διαφορετικών μηνυμάτων χρήστη. Δηλαδή, με οποιαδήποτε χειραγώγηση ή συμπαιγνία, το μαντείο θα κινδυνεύει πάντα να χάσει το ιδιωτικό του κλειδί.

Συνολικά, το oracle πρέπει να παρέχει στους χρήστες δύο λειτουργίες: αρχικοποίηση, η οποία καθορίζει την τιμή R και υπογραφή, η οποία επιστρέφει την τιμή S. Σε αυτήν την περίπτωση, το ζεύγος R, S είναι η συνήθης επαληθεύσιμη υπογραφή ενός μηνύματος χρήστη που περιέχει ένα σταθερό τιμή R και αυθαίρετα δεδομένα χρήστη.

Μπορεί να υποστηριχθεί ότι αυτό το σχήμα για το blockchain δεν είναι τίποτα περισσότερο από συνηθισμένο δέσμευση-επέκταση. Ουσιαστικά, ναι, είναι αυτή. Αλλά υπάρχουν αρκετές αποχρώσεις. Πρώτον, το μαντείο λειτουργεί πάντα με το ίδιο κλειδί σε όλες τις λειτουργίες, για παράδειγμα, αυτό είναι βολικό για χρήση σε συμβόλαια. Δεύτερον, υπάρχει κίνδυνος να χάσει το μαντείο το ιδιωτικό κλειδί εάν συμπεριφέρεται εσφαλμένα, για παράδειγμα, το oracle σας επιτρέπει να κάνετε δείγματα του αποτελέσματος, τότε αρκεί να κάνετε μόνο δύο δοκιμές για να μάθετε το ιδιωτικό κλειδί και να κερδίσετε πρόσβαση στο πορτοφόλι. Τρίτον, μια υπογραφή που είναι εγγενώς επαληθεύσιμη στο blockchain και είναι πηγή τυχαίας είναι όμορφη.

Για έξι μήνες η ιδέα της υλοποίησης σιγόβραζε στο μυαλό μου, μέχρι που τελικά εμφανίστηκε το κίνητρο στη μορφή επιχορήγηση από την Waves Labs. Με μια μεγάλη επιχορήγηση έρχεται μεγάλη ευθύνη, οπότε το έργο θα είναι εκεί!

Реализация

Έτσι, σε αυτό το έργο Το VECRO εφαρμόστηκε στο blockchain Waves σε λειτουργία αιτήματος-απόκρισης χρησιμοποιώντας συναλλαγές μεταφοράς μεταξύ του χρήστη και του μαντείου. Ταυτόχρονα, εγκαθίσταται ένα σενάριο στον λογαριασμό oracle που ελέγχει την εργασία αυστηρά σύμφωνα με τη λογική που περιγράφεται παραπάνω. Οι συναλλαγές της Oracle επαληθεύονται και αποκαθίσταται ολόκληρη η αλυσίδα αλληλεπίδρασης των χρηστών. Και οι τέσσερις συναλλαγές εμπλέκονται στην επαλήθευση της τελικής αξίας· το έξυπνο συμβόλαιο τις ενώνει με ένα αυστηρό νήμα επαλήθευσης, ελέγχοντας όλες τις τιμές βήμα προς βήμα και δεν αφήνει περιθώριο για οποιαδήποτε χειραγώγηση.

Για άλλη μια φορά για να το αφήσουμε στην άκρη και να το ξεκαθαρίσουμε. Ο χρησμός δεν λειτουργεί απλώς σύμφωνα με το προτεινόμενο σχήμα. Το έργο του ελέγχεται πλήρως σε επίπεδο blockchain από το κατεστημένο σφιχτά με ένα έξυπνο συμβόλαιο. Κάντε ένα βήμα προς τα αριστερά και η συναλλαγή απλά δεν θα πραγματοποιηθεί. Έτσι, εάν μια συναλλαγή περιλαμβάνεται στο blockchain, ο χρήστης δεν χρειάζεται καν να ελέγξει τίποτα· εκατοντάδες κόμβοι δικτύου έχουν ήδη ελέγξει τα πάντα για αυτόν.

Επί του παρόντος, υπάρχει ένα VECRO που τρέχει στο mainnet της Waves (μπορείτε να εκτελέσετε το δικό σας, δεν είναι δύσκολο, απλά ρίξτε μια ματιά στο παράδειγμα διαμόρφωσης). Ο τρέχων κώδικας εκτελείται σε PHP (ενεργό WavesKit, για την οποία σου είπα νωρίτερα).

Για να χρησιμοποιήσετε την υπηρεσία Oracle πρέπει:

  • Διορθώστε το R;
    • Στείλτε τουλάχιστον 0.005 Waves στο ψευδώνυμο oracle init@vecr;
    • Λάβετε τον κωδικό R στο πεδίο συνημμένου στη μεταφορά 1 διακριτικού R-vecr από το μαντείο στον χρήστη.
  • Πάρτε μια υπογραφή?
    • Στείλτε τουλάχιστον 0.005 Waves στο ψευδώνυμο oracle random@vecr και επίσης ΠΡΕΠΕΙ να υποδείξετε τον προηγουμένως ληφθέν κωδικό R και πρόσθετα δεδομένα χρήστη στο πεδίο συνημμένου.
    • Λάβετε τον κωδικό S στο πεδίο συνημμένου στη μεταφορά 1 διακριτικού S-vecr από το μαντείο στον χρήστη.
  • Χρησιμοποιήστε τον κωδικό S ως πηγή ψευδοτυχαίων αριθμών.

Αποχρώσεις της τρέχουσας εφαρμογής:

  • Τα κύματα που αποστέλλονται στο μαντείο χρησιμοποιούνται ως προμήθεια για τη συναλλαγή επιστροφής στον χρήστη, έως το μέγιστο 1 Waves.
  • Ο κώδικας R είναι η συνένωση ενός byte του χαρακτήρα «R» και μιας τιμής R με κωδικοποίηση βάσης 32 58 byte.
  • Ο κωδικός R στο συνημμένο πρέπει να είναι πρώτος, τα δεδομένα χρήστη έρχονται μετά τον κωδικό R.
  • Ο S-code είναι η συνένωση ενός byte του χαρακτήρα «S» και μιας τιμής S με κωδικοποίηση βάσης 32 58 byte.
  • Το S είναι το αποτέλεσμα της διαίρεσης modulo, επομένως δεν μπορείτε να χρησιμοποιήσετε το S ως πλήρη ψευδοτυχαίο αριθμό 256 bit (αυτός ο αριθμός μπορεί να θεωρηθεί ως ένας ψευδοτυχαίος αριθμός 252 bit).
  • Η απλούστερη επιλογή είναι να χρησιμοποιήσετε τον κατακερματισμό του S-code ως ψευδοτυχαίο αριθμό.

Παράδειγμα λήψης S-code:

Από τεχνική άποψη, το μαντείο είναι εντελώς έτοιμο για εργασία, μπορείτε να το χρησιμοποιήσετε με ασφάλεια. Από την άποψη της χρήσης από τον μέσο χρήστη, υπάρχει έλλειψη μιας βολικής γραφικής διεπαφής· αυτό θα πρέπει να περιμένει.

Θα χαρώ να απαντήσω σε ερωτήσεις και να δεχτώ σχόλια, ευχαριστώ.

Πηγή: www.habr.com

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