Η μερική υπογραφή επιτρέπει σε πολλά μέρη να υπογράψουν την ίδια συναλλαγή σε διαφορετικές χρονικές στιγμές ή σε διαφορετικές συσκευές. Ένας συντονιστής δημιουργεί το μήνυμα, κάθε απαιτούμενος υπογράφων υπογράφει τα ακριβή σειριοποιημένα byte του μηνύματος και ο συντονιστής επαληθεύει και συγχωνεύει τις υπογραφές πριν από την υποβολή.
Οι υπογραφές εξουσιοδοτούν byte, όχι προθέσεις
Η αλλαγή του πληρωτή των τελών, του blockhash, της σειράς των εντολών, της λίστας λογαριασμών ή οποιωνδήποτε instruction data δημιουργεί διαφορετικό μήνυμα και ακυρώνει όλες τις υπογραφές που έχουν ήδη συλλεχθεί.
Ροή μερικής υπογραφής
- Συμφωνήστε για τις εντολές της συναλλαγής και για το ποιος θα πληρώσει τα τέλη.
- Ορίστε τη διάρκεια ζωής της συναλλαγής και τον πληρωτή των τελών.
- Σειριοποιήστε το μήνυμα μία φορά. Αντιμετωπίστε αυτά τα byte ως αμετάβλητα.
- Διανείμετε τα byte του μηνύματος και μια περίληψη σε αναγνώσιμη μορφή σε κάθε υπογράφοντα.
- Συλλέξτε και επαληθεύστε κάθε υπογραφή Ed25519 με βάση τα ίδια byte μηνύματος.
- Συνδέστε τις υπογραφές με τις διευθύνσεις των απαιτούμενων υπογραφόντων τους.
- Βεβαιωθείτε ότι υπάρχει και είναι έγκυρη κάθε απαιτούμενη υπογραφή και, στη συνέχεια, υποβάλετε τη συναλλαγή.
Πλήρες παράδειγμα
Ο πληρωτής των τελών και ο αποστολέας των SOL παρακάτω υπογράφουν ανεξάρτητα. Ο συντονιστής επαληθεύει και τις δύο υπογραφές, τις συγχωνεύει και υποβάλλει την ολοκληρωμένη συναλλαγή.
Το παράδειγμα χρησιμοποιεί ωμή υπογραφή Ed25519, ώστε να είναι σαφές το όριο μεταξύ του συντονιστή και κάθε υπογράφοντα. Ένα πορτοφόλι, μια συσκευή υλικού, μια υπηρεσία φύλαξης ή ένας υπογράφων εκτός σύνδεσης μπορεί να αντικαταστήσει οποιοδήποτε τοπικό keypair, εφόσον υπογράφει τα ακριβώς ίδια byte μηνύματος.
Παγώστε το μήνυμα πριν από την υπογραφή
Κάθε υπογραφή καλύπτει το σειριοποιημένο μήνυμα της συναλλαγής. Το μήνυμα περιλαμβάνει όλα τα παρακάτω:
- τον πληρωτή των τελών
- το πρόσφατο blockhash ή το durable nonce
- τη διεύθυνση κάθε προγράμματος και λογαριασμού
- τα δικαιώματα υπογραφής και εγγραφής των λογαριασμών
- τη σειρά των εντολών και τα instruction data
Δημιουργήστε πρώτα αυτά τα πεδία, σειριοποιήστε το μήνυμα μία φορά και διανείμετε αυτόν τον πίνακα byte σε κάθε υπογράφοντα. Είναι χρήσιμο να αποθηκεύετε ένα digest του μηνύματος μαζί με κάθε αίτημα υπογραφής, ώστε ο συντονιστής να μπορεί να απορρίψει μια υπογραφή που επιστρέφεται για διαφορετικό μήνυμα.
Μην αποσειριοποιείτε ένα μήνυμα, μην το τροποποιείτε και μην περιμένετε ότι οι υπογραφές που έχουν συλλεχθεί να παραμείνουν έγκυρες. Ακόμη και μια αλλαγή που φαίνεται λειτουργική, όπως η αντικατάσταση ενός ληγμένου blockhash ή η αλλαγή του πληρωτή των τελών, απαιτεί από κάθε υπογράφοντα να υπογράψει ξανά.
Συντονισμός του πληρωτή των τελών
Ο πληρωτής των τελών είναι πάντα απαιτούμενος υπογράφων και πρέπει να επιλεγεί πριν παγώσει το μήνυμα. Βεβαιωθείτε ότι ο λογαριασμός διαθέτει αρκετά SOL για τα βασικά τέλη και τυχόν τέλη προτεραιότητας. Αν τα τέλη θα καλυφθούν από χορηγό ή από backend, τοποθετήστε αυτή τη διεύθυνση στο μήνυμα πριν συλλέξετε την υπογραφή του χρήστη· η προσθήκη του χορηγού αργότερα αλλάζει τα υπογεγραμμένα byte.
Ο συντονιστής πρέπει να επαληθεύει ότι μια εισερχόμενη υπογραφή ανήκει σε διεύθυνση που περιλαμβάνεται στους απαιτούμενους υπογράφοντες. Ποτέ μην αποδέχεστε ένα τυχαίο δημόσιο κλειδί και μην το προσαρτάτε στη συναλλαγή.
Διαχείριση της διάρκειας ζωής της συναλλαγής
Μια συναλλαγή με πρόσφατο blockhash είναι έγκυρη μόνο όσο το blockhash της παραμένει στην ουρά πρόσφατων blockhash
του validator. Πριν ξεκινήσετε μια ροή υπογραφής με πολλά μέρη,
εκτιμήστε αν όλοι οι υπογράφοντες μπορούν να ανταποκριθούν πριν από το lastValidBlockHeight.
Αν το blockhash λήξει, δημιουργήστε νέο μήνυμα με νέο blockhash και συλλέξτε ξανά όλες τις υπογραφές. Για ροές εργασίας που μπορεί να διαρκέσουν περισσότερο ή να περιλαμβάνουν υπογράφοντες εκτός σύνδεσης, χρησιμοποιήστε ένα durable nonce. Ένα durable nonce αποφεύγει το παράθυρο του πρόσφατου blockhash, αλλά η προώθηση ή η με άλλο τρόπο κατανάλωση αυτού του nonce εξακολουθεί να ακυρώνει την εκκρεμή συναλλαγή.
Επαλήθευση πριν από την υποβολή
Για κάθε υπογραφή που επιστρέφεται:
- Επαληθεύστε την υπογραφή με βάση τα παγωμένα byte του μηνύματος και το δημόσιο κλειδί του αναμενόμενου υπογράφοντα.
- Συνδέστε την με τη θέση αυτού του υπογράφοντα στον πίνακα υπογραφών της συναλλαγής.
- Επαληθεύστε ότι η συναλλαγή που συναρμολογήθηκε διαθέτει έγκυρες υπογραφές για κάθε απαιτούμενο υπογράφοντα.
- Υποβάλετε τη σειριοποιημένη συναλλαγή χωρίς να ξαναδημιουργήσετε το μήνυμά της.
Μετά την υποβολή, επιβεβαιώστε τη συναλλαγή χρησιμοποιώντας τις ίδιες πληροφορίες διάρκειας ζωής που περιλαμβάνονταν στο υπογεγραμμένο μήνυμα. Αν η επιβεβαίωση αναφέρει ληγμένο blockhash ή καταναλωμένο nonce, μην επαναλάβετε την προσπάθεια με τροποποιημένη συναλλαγή· ξεκινήστε από την αρχή τη ροή υπογραφής.
Is this page helpful?