Συνεχίζουμε τη σειρά μας σχετικά με την αλυσίδα μπλοκ Monero και το σημερινό άρθρο θα επικεντρωθεί στο πρωτόκολλο RingCT (Ring Confidential Transactions), το οποίο εισάγει εμπιστευτικές συναλλαγές και νέες υπογραφές δακτυλίου. Δυστυχώς, υπάρχουν λίγες πληροφορίες στο Διαδίκτυο για το πώς λειτουργεί και προσπαθήσαμε να καλύψουμε αυτό το κενό.
Θα μιλήσουμε για το πώς το δίκτυο κρύβει τα ποσά μεταφοράς χρησιμοποιώντας αυτό το πρωτόκολλο, γιατί εγκατέλειψαν τις κλασικές υπογραφές δακτυλίου κρυπτονόμων και πώς αυτή η τεχνολογία θα αναπτυχθεί περαιτέρω.
Δεδομένου ότι αυτό το πρωτόκολλο είναι μια από τις πιο περίπλοκες τεχνολογίες στο Monero, ο αναγνώστης θα χρειαστεί βασικές γνώσεις για το σχεδιασμό αυτού του blockchain και μια παροδική γνώση της κρυπτογραφίας ελλειπτικών καμπυλών (για να κατανοήσει αυτή τη γνώση, μπορείτε να διαβάσετε τα πρώτα κεφάλαια μας προηγούμενο άρθρο για
Πρωτόκολλο RingCT
Μία από τις πιθανές επιθέσεις σε νομίσματα κρυπτονομισμάτων είναι η ανάλυση blockchain που βασίζεται στη γνώση του ποσού και του χρόνου της απεσταλμένης συναλλαγής. Αυτό επιτρέπει
Αξίζει να σημειωθεί ότι η ιδέα της απόκρυψης ποσών δεν είναι νέα. Ο προγραμματιστής του Bitcoin Core Greg Maxwell ήταν ένας από τους πρώτους που το περιέγραψε στα δικά του
Μεταξύ άλλων, το πρωτόκολλο βοηθά να απαλλαγούμε από προβλήματα με την ανάμειξη εξόδων σκόνης - εξόδους μικρού ποσού (συνήθως λαμβάνονται με τη μορφή αλλαγής από συναλλαγές), που δημιούργησαν περισσότερα προβλήματα από όσα άξιζαν.
Τον Ιανουάριο του 2017, πραγματοποιήθηκε ένα hard fork του δικτύου Monero, επιτρέποντας την προαιρετική χρήση εμπιστευτικών συναλλαγών. Και ήδη τον Σεπτέμβριο του ίδιου έτους, με την έκδοση 6 hard fork, τέτοιες συναλλαγές έγιναν οι μόνες επιτρεπόμενες στο δίκτυο.
Το RingCT χρησιμοποιεί πολλούς μηχανισμούς ταυτόχρονα: πολυεπίπεδες συνδεδεμένες αυθόρμητες ανώνυμες υπογραφές ομάδας (Πολυεπίπεδη συνδεόμενη αυθόρμητη ανώνυμη υπογραφή ομάδας, εφεξής καλούμενη ως MLSAG), ένα σχήμα δεσμεύσεων (δεσμεύσεις Pedersen) και αποδείξεις εύρους (αυτός ο όρος δεν έχει καθιερωμένη μετάφραση στα ρωσικά) .
Το πρωτόκολλο RingCT εισάγει δύο τύπους ανώνυμων συναλλαγών: απλές και πλήρεις. Το πορτοφόλι δημιουργεί το πρώτο όταν μια συναλλαγή χρησιμοποιεί περισσότερες από μία εισόδους, το δεύτερο - στην αντίθετη κατάσταση. Διαφέρουν ως προς την επικύρωση των ποσών των συναλλαγών και τα δεδομένα που υπογράφονται με υπογραφή MLSAG (θα μιλήσουμε περισσότερα για αυτό παρακάτω). Επιπλέον, συναλλαγές τύπου πλήρους μπορούν να δημιουργηθούν με οποιοδήποτε αριθμό εισόδων, δεν υπάρχει θεμελιώδης διαφορά. Στο βιβλίο
Υπογραφή MLSAG
Ας θυμηθούμε τι είναι οι εισροές υπογεγραμμένων συναλλαγών. Κάθε συναλλαγή ξοδεύει και δημιουργεί κάποια κεφάλαια. Η δημιουργία κεφαλαίων γίνεται με τη δημιουργία εκροών συναλλαγών (μια άμεση αναλογία είναι οι λογαριασμοί) και η έξοδος που ξοδεύει η συναλλαγή (εξάλλου, στην πραγματική ζωή ξοδεύουμε τραπεζογραμμάτια) γίνεται η είσοδος (προσέξτε, είναι πολύ εύκολο να μπερδευτείτε εδώ).
Μια είσοδος παραπέμπει σε πολλαπλές εξόδους, αλλά ξοδεύει μόνο μία, δημιουργώντας έτσι ένα "smokescreen" που καθιστά δύσκολη την ανάλυση του ιστορικού μετάφρασης. Εάν μια συναλλαγή έχει περισσότερες από μία εισόδους, τότε μια τέτοια δομή μπορεί να αναπαρασταθεί ως μήτρα, όπου οι σειρές είναι οι είσοδοι και οι στήλες οι μικτές έξοδοι. Για να αποδειχθεί στο δίκτυο ότι η συναλλαγή ξοδεύει ακριβώς τις εξόδους της (γνωρίζει τα μυστικά τους κλειδιά), οι είσοδοι υπογράφονται με μια ring signature. Μια τέτοια υπογραφή εγγυάται ότι ο υπογράφων γνώριζε τα μυστικά κλειδιά για όλα τα στοιχεία οποιασδήποτε από τις στήλες.
Οι εμπιστευτικές συναλλαγές δεν χρησιμοποιούν πλέον τις κλασικές
Ονομάζονται πολυστρωματικά επειδή υπογράφουν πολλές εισόδους ταυτόχρονα, καθεμία από τις οποίες αναμειγνύεται με πολλές άλλες, δηλαδή υπογράφεται μια μήτρα και όχι μια σειρά. Όπως θα δούμε αργότερα, αυτό βοηθά στην εξοικονόμηση μεγέθους υπογραφής.
Ας δούμε πώς σχηματίζεται μια υπογραφή δακτυλίου, χρησιμοποιώντας το παράδειγμα μιας συναλλαγής που ξοδεύει 2 πραγματικές εξόδους και χρησιμοποιεί m - 1 τυχαίες από το blockchain για μίξη. Ας υποδηλώσουμε τα δημόσια κλειδιά των εξόδων που ξοδεύουμε ως
, και αναλόγως βασικές εικόνες για αυτούς: Έτσι, παίρνουμε μια μήτρα μεγέθους 2 x m. Αρχικά, πρέπει να υπολογίσουμε τις λεγόμενες προκλήσεις για κάθε ζεύγος εξόδων:
Ξεκινάμε τους υπολογισμούς με τις εξόδους, τις οποίες ξοδεύουμε χρησιμοποιώντας τα δημόσια κλειδιά τους:και τυχαίους αριθμούςΩς αποτέλεσμα, παίρνουμε τις ακόλουθες τιμές:
, το οποίο χρησιμοποιούμε για να υπολογίσουμε την πρόκληση
το επόμενο ζεύγος εξόδων (για να καταλάβουμε πιο εύκολα τι αντικαθιστούμε, έχουμε επισημάνει αυτές τις τιμές σε διαφορετικά χρώματα). Όλες οι ακόλουθες τιμές υπολογίζονται σε κύκλο χρησιμοποιώντας τους τύπους που δίνονται στην πρώτη εικόνα. Το τελευταίο πράγμα που πρέπει να υπολογιστεί είναι η πρόκληση για ένα ζεύγος πραγματικών εξόδων.
Όπως μπορούμε να δούμε, όλες οι στήλες εκτός από αυτή που περιέχει πραγματικές εξόδους χρησιμοποιούν αριθμούς που δημιουργούνται τυχαία. Για π- στήλη θα τα χρειαστούμε επίσης. Ας μεταμορφωθούμεσε s:
Η ίδια η υπογραφή είναι μια πλειάδα όλων αυτών των τιμών:
Αυτά τα δεδομένα στη συνέχεια εγγράφονται σε μια συναλλαγή.
Όπως μπορούμε να δούμε, το MLSAG περιέχει μόνο μία πρόκληση c0, το οποίο σας επιτρέπει να εξοικονομήσετε μέγεθος υπογραφής (το οποίο απαιτεί ήδη πολύ χώρο). Περαιτέρω, οποιοσδήποτε επιθεωρητής, χρησιμοποιώντας τα δεδομένα, επαναφέρει τις τιμές c1,…, cm και το ελέγχει. Έτσι, το δαχτυλίδι μας έχει κλείσει και η υπογραφή έχει επαληθευτεί.
Για συναλλαγές RingCT πλήρους τύπου, προστίθεται μια ακόμη γραμμή στον πίνακα με μικτές εξόδους, αλλά θα μιλήσουμε για αυτό παρακάτω.
Δεσμεύσεις Pedersen
Οι δεσμεύσεις Monero χρησιμοποιούνται για την απόκρυψη των ποσών των μεταφορών και τη χρήση της πιο κοινής επιλογής - δεσμεύσεων Pedersen. Παρεμπιπτόντως, ένα ενδιαφέρον γεγονός - στην αρχή οι προγραμματιστές πρότειναν την απόκρυψη των ποσών με συνηθισμένη ανάμειξη, δηλαδή την προσθήκη εκροών για αυθαίρετα ποσά προκειμένου να εισαχθεί αβεβαιότητα, αλλά στη συνέχεια μεταπήδησαν σε δεσμεύσεις (δεν είναι γεγονός ότι εξοικονομούσαν το μέγεθος της συναλλαγής, όπως θα δούμε παρακάτω).
Γενικά, η δέσμευση μοιάζει με αυτό:
Πού C — η ίδια η έννοια της δέσμευσης, a - κρυφό ποσό, H είναι ένα σταθερό σημείο στην ελλειπτική καμπύλη (πρόσθετη γεννήτρια), και x — κάποιο είδος αυθαίρετης μάσκας, ένας παράγοντας απόκρυψης που δημιουργείται τυχαία. Η μάσκα χρειάζεται εδώ, ώστε ένα τρίτο μέρος να μην μπορεί απλώς να μαντέψει την αξία της δέσμευσης.
Όταν δημιουργείται μια νέα έξοδος, το πορτοφόλι υπολογίζει τη δέσμευση για αυτήν και όταν δαπανάται, παίρνει είτε την αξία που υπολογίστηκε κατά τη δημιουργία είτε την επανυπολογίζει, ανάλογα με τον τύπο της συναλλαγής.
RingCT απλό
Στην περίπτωση απλών συναλλαγών RingCT, προκειμένου να διασφαλιστεί ότι η συναλλαγή δημιούργησε εκροές σε ποσότητα ίση με το ποσό των εισροών (δεν παρήγαγε χρήματα από τον αέρα), είναι απαραίτητο το άθροισμα των δεσμεύσεων του πρώτου και του δεύτερου να είναι τα ίδια, δηλαδή:
Οι επιτροπές δέσμευσης το θεωρούν λίγο διαφορετικά - χωρίς μάσκα:
Όπου a — το ποσό της προμήθειας, είναι διαθέσιμο στο κοινό.
Αυτή η προσέγγιση μας επιτρέπει να αποδείξουμε στο στηριζόμενο μέρος ότι χρησιμοποιούμε τα ίδια ποσά χωρίς να τα αποκαλύπτουμε.
Για να ξεκαθαρίσουμε τα πράγματα, ας δούμε ένα παράδειγμα. Ας υποθέσουμε ότι μια συναλλαγή ξοδεύει δύο εξόδους (που σημαίνει ότι γίνονται είσοδοι) των 10 και 5 XMR και παράγει τρεις εξόδους αξίας 12 XMR: 3, 4 και 5 XMR. Ταυτόχρονα πληρώνει προμήθεια 3 XMR. Έτσι, το ποσό των χρημάτων που δαπανήθηκε συν το ποσό που δημιουργήθηκε και η προμήθεια είναι ίσο με 15 XMR. Ας προσπαθήσουμε να υπολογίσουμε τις δεσμεύσεις και να δούμε τη διαφορά στα ποσά τους (θυμηθείτε τα μαθηματικά):
Εδώ βλέπουμε ότι για να συγκλίνει η εξίσωση, χρειαζόμαστε τα αθροίσματα των μάσκας εισόδου και εξόδου να είναι ίδια. Για να γίνει αυτό, το πορτοφόλι δημιουργείται τυχαία x1, y1, y2 και y3, και τα υπόλοιπα x2 υπολογίζει ως εξής:
Χρησιμοποιώντας αυτές τις μάσκες, μπορούμε να αποδείξουμε σε οποιονδήποτε επαληθευτή ότι δεν παράγουμε περισσότερα χρήματα από όσα ξοδεύουμε, χωρίς να αποκαλύψουμε το ποσό. Πρωτότυπο, σωστά;
Το RingCT είναι γεμάτο
Στις πλήρεις συναλλαγές RingCT, ο έλεγχος των ποσών μεταφοράς είναι λίγο πιο περίπλοκος. Σε αυτές τις συναλλαγές, το πορτοφόλι δεν υπολογίζει εκ νέου τις δεσμεύσεις για εισροές, αλλά χρησιμοποιεί αυτές που υπολογίστηκαν όταν δημιουργήθηκαν. Σε αυτήν την περίπτωση, πρέπει να υποθέσουμε ότι δεν θα λαμβάνουμε πλέον τη διαφορά στα αθροίσματα ίση με το μηδέν, αλλά αντ' αυτού:
Εδώ z — διαφορά μεταξύ μάσκας εισόδου και εξόδου. Αν αναλογιστούμε zG ως δημόσιο κλειδί (που de facto είναι), λοιπόν z είναι το ιδιωτικό κλειδί. Έτσι, γνωρίζουμε το δημόσιο και το αντίστοιχο ιδιωτικό κλειδί. Με αυτά τα δεδομένα στα χέρια, μπορούμε να τα χρησιμοποιήσουμε στην υπογραφή κλήσης MLSAG μαζί με τα δημόσια κλειδιά των εξόδων που αναμιγνύονται:
Έτσι, μια έγκυρη υπογραφή κλήσης θα διασφαλίσει ότι γνωρίζουμε όλα τα ιδιωτικά κλειδιά μιας από τις στήλες και μπορούμε να γνωρίζουμε μόνο το ιδιωτικό κλειδί στην τελευταία σειρά εάν η συναλλαγή δεν παράγει περισσότερα χρήματα από όσα ξοδεύει. Παρεμπιπτόντως, εδώ είναι η απάντηση στο ερώτημα "γιατί η διαφορά στα ποσά των δεσμεύσεων δεν οδηγεί στο μηδέν" - εάν zG = 0, τότε θα επεκτείνουμε τη στήλη με πραγματικές εξόδους.
Πώς γνωρίζει ο αποδέκτης των κεφαλαίων πόσα χρήματα του στάλθηκαν; Όλα είναι απλά εδώ - ο αποστολέας της συναλλαγής και ο παραλήπτης ανταλλάσσουν κλειδιά χρησιμοποιώντας το πρωτόκολλο Diffie-Hellman, χρησιμοποιώντας το κλειδί συναλλαγής και το κλειδί προβολής του παραλήπτη και υπολογίζουν το κοινό μυστικό. Ο αποστολέας γράφει δεδομένα σχετικά με τα ποσά εξόδου, κρυπτογραφημένα με αυτό το κοινό κλειδί, σε ειδικά πεδία της συναλλαγής.
Αποδείξεις εύρους
Τι συμβαίνει εάν χρησιμοποιείτε αρνητικό αριθμό ως ποσό στις δεσμεύσεις; Αυτό μπορεί να οδηγήσει στη δημιουργία πρόσθετων νομισμάτων! Αυτό το αποτέλεσμα είναι απαράδεκτο, επομένως πρέπει να εγγυηθούμε ότι τα ποσά που χρησιμοποιούμε δεν είναι αρνητικά (χωρίς να αποκαλύπτουμε αυτά τα ποσά, φυσικά, διαφορετικά υπάρχει τόση δουλειά και όλα μάταια). Με άλλα λόγια, πρέπει να αποδείξουμε ότι το άθροισμα βρίσκεται στο διάστημα [0, 2n - 1].
Για να γίνει αυτό, το άθροισμα κάθε εξόδου χωρίζεται σε δυαδικά ψηφία και η δέσμευση υπολογίζεται για κάθε ψηφίο ξεχωριστά. Είναι καλύτερα να δούμε πώς συμβαίνει αυτό με ένα παράδειγμα.
Ας υποθέσουμε ότι τα ποσά μας είναι μικρά και χωρούν σε 4 bit (στην πράξη είναι 64 bit) και δημιουργούμε μια έξοδο αξίας 5 XMR. Υπολογίζουμε τις δεσμεύσεις για κάθε κατηγορία και τη συνολική δέσμευση για ολόκληρο το ποσό:
Στη συνέχεια, κάθε δέσμευση αναμιγνύεται με ένα υποκατάστατο (Ci-2iH) και είναι υπογεγραμμένο σε ζευγάρια με την υπογραφή δαχτυλίδι Borromeo (άλλη υπογραφή δακτυλίου), που προτάθηκε από τον Greg Maxwell το 2015 (μπορείτε να διαβάσετε περισσότερα σχετικά
Συνολικά, αυτό ονομάζεται απόδειξη εύρους και σας επιτρέπει να διασφαλίσετε ότι οι δεσμεύσεις χρησιμοποιούν ποσά εντός του εύρους [0, 2n - 1].
Ποιο είναι το επόμενο;
Στην τρέχουσα εφαρμογή, οι δοκιμές εύρους καταλαμβάνουν πολύ χώρο - 6176 byte ανά έξοδο. Αυτό οδηγεί σε μεγαλύτερες συναλλαγές και συνεπώς υψηλότερες χρεώσεις. Για να μειώσουν το μέγεθος μιας συναλλαγής Monero, οι προγραμματιστές εισάγουν αλεξίσφαιρα αντί για υπογραφές Borromeo - έναν μηχανισμό προστασίας εμβέλειας χωρίς δεσμεύσεις bitwise.
Κάντε τις ερωτήσεις σας, προτείνετε θέματα για νέα άρθρα σχετικά με τεχνολογίες στον τομέα των κρυπτονομισμάτων και επίσης εγγραφείτε στην ομάδα μας στο
Πηγή: www.habr.com