Ένας από τους κύριους στόχους που στοχεύουν να επιτύχουν τα έργα που βασίζονται σε blockchain είναι η επαλήθευση των δεδομένων. Για ζωντανά παραδείγματα, μπορείτε να δείτε την ψηφιακή ταυτότητα και την ηλεκτρονική αποθήκευση εγγράφων και τους ελέγχους. Πράγματι, οποιαδήποτε από αυτές τις περιπτώσεις απαιτεί την επαλήθευση του εκκινητή της ενέργειας/συναλλαγής για την επιβεβαίωση του προσώπου ή της οντότητας. Για παράδειγμα, εάν το άτομο έχει την ψηφιακή μορφή του εγγράφου ταυτότητας, είναι σημαντικό να διασφαλιστεί η ιδιοκτησία. Επομένως, είναι ένα εξαιρετικό παράδειγμα ενός προβλήματος επαληθευσιμότητας δεδομένων. Ας εξετάσουμε την απλούστερη μορφή της λύσης - μια ψηφιακή υπογραφή, η δοκιμή της οποίας είναι ένα από τα κρίσιμα σημεία κατά την ανάπτυξη του έξυπνου συμβολαίου.
Η προσέγγιση είναι απλή:
1) το σύστημα δημιουργεί ένα μήνυμα με γνωστούς για όλους κανόνες
2) ο υπογράφων λαμβάνει το μήνυμα και προσθέτει ένα συγκεκριμένο σύνολο συμβόλων — ψηφιακή υπογραφή, κωδικός που κατασκευάζεται από το μήνυμα με ιδιωτικό κλειδί
3) η υπογραφή που δημιουργήθηκε αποστέλλεται τώρα στη σύμβαση, όπου αποσυντίθεται για να ανακτηθεί η διεύθυνση του υπογράφοντος.
Το Solidity σας προσφέρει τον αλγόριθμο ECDSA για δημιουργία υπογραφών και περαιτέρω αποσύνθεση. Δεν χρειάζεται να εμβαθύνουμε στον ίδιο τον αλγόριθμο (μπορείτε να βρείτε τις απαραίτητες πληροφορίες στις κατάλληλες πηγές). Το μόνο που χρειάζεται να γνωρίζουμε είναι ότι το ECDSA είναι ένα παράδειγμα ασύμμετρης κρυπτογραφίας, όπου ο πρώτος χρήστης δημιουργεί μια υπογραφή με το ιδιωτικό του κλειδί και ο δεύτερος χρήστης εφαρμόζει έναν τυπικό αλγόριθμο για να ανακτήσει το δημόσιο κλειδί του υπογράφοντος. Έτσι, μπορεί να επαληθεύσει την πηγή της υπογραφής. Αντίθετα, ας εστιάσουμε στο πρακτικό μέρος - χρήση υπογραφής και δοκιμή.
Πρώτα απ 'όλα, πρέπει να αναγνωρίσουμε ένα πρόβλημα. Για παράδειγμα, η σύμβαση πρέπει να εκτελέσει κάποια ενέργεια, ας πούμε, να αποθηκεύσει τη διεύθυνση του καλούντος. Αν και η σύμβαση θα πρέπει να αποθηκευτεί μόνο εάν ο καλών έχει επαληθευτεί, πρέπει να είμαστε σίγουροι ότι κανείς δεν μπορεί να χρησιμοποιήσει τη διεύθυνσή του χωρίς άδεια. Για να ανακτήσουμε τον αυθεντικό καλούντα, πρέπει να δημιουργήσουμε κάποιο μήνυμα, να το υπογράψουμε και να το αποσυνθέσουμε εντός της σύμβασης.
Μπορείτε να βρείτε το τυπική λύση στην τεκμηρίωση Solidity (για παράδειγμα, στο 0.8.4 — την πιο πρόσφατη σταθερή έκδοση τη στιγμή του άρθρου). Τα έγγραφα μάς προσφέρουν τη σύμβαση, η οποία χρειαζόταν την ακόλουθη ενσωματωμένη λειτουργικότητα: δημιουργία μηνύματος, διαχωρισμός υπογραφής και κώδικας συναρμολόγησης για την ανάκτηση του υπογράφοντος. Το παράδειγμα δείχνει όλες τις απαραίτητες μεθόδους και είναι αρκετά απλό, αν και έχει δύο μειονεκτήματα: στερείται καθολικότητας και δεν υπάρχει καλό παράδειγμα δοκιμής λύσεων. Γι' αυτό παρέχω την έκδοση του κώδικα και (τον πραγματικό στόχο) — τη στρατηγική δοκιμής του συμβολαίου.
Σίγουρα, μπορείτε να χρησιμοποιήσετε την τυπική βιβλιοθήκη OpenZeppelin για τις επιχειρήσεις ECDSA, αλλά θα αντιμετωπίσετε ξανά τα ίδια προβλήματα — έλλειψη ευελιξίας και προσεγγίσεις δοκιμών. Λοιπόν, ας βουτήξουμε στο παράδειγμά μου της λογικής που βασίζεται στην υπογραφή. Μπορείτε να βρείτε το πλήρες παράδειγμα εργασίας στο GitHub μου, αλλά υπάρχουν λίγα μέρη που θέλω να δείξω πλήρως.
Πρώτα απ 'όλα, θα προετοιμάσουμε το μήνυμα . Όπως μπορείτε να δείτε, σχηματίζεται από δύο συσκευασμένες και κατακερματισμένες διευθύνσεις πορτοφολιού:
Το δεύτερο σημαντικό κομμάτι κώδικα είναι ο κατακερματισμός του μηνύματος μαζί με το τυπικό μήνυμα Ethereum:
Δείχνει ότι το μήνυμα στάλθηκε εντός του δικτύου Ethereum και έχει μήκος 32 byte, που δεν είναι τυχαίος αριθμός. Μετά από προηγούμενες λειτουργίες, έχουμε τον κατακερματισμό, ο οποίος έχει μήκος 32 byte. Είναι σημαντικό να έχουμε την πρόσθετη λειτουργία κατακερματισμού σε τέτοια μορφή, και θα συζητήσουμε το σκεπτικό λίγο αργότερα.
Άλλα κομμάτια κώδικα είναι αρκετά τυπικά. Η λειτουργία για τον διαχωρισμό της υπογραφής είναι η εξής:
και εδώ είναι η συνάρτηση για την ανάκτηση του υπογράφοντος:
Για την εξωτερική διεπαφή, θα χρησιμοποιήσουμε την προσαρμοσμένη συνάρτηση, η οποία λαμβάνει την υπογραφή και τα απαραίτητα ορίσματα, ελέγχει εάν ο χρήστης είναι ήδη εγγεγραμμένος, σχηματίζει το μήνυμα και επαληθεύει την υπογραφή:
Αρχικά, θα μιμηθούμε το μήνυμα που πρέπει να υπογραφεί. Θα το χρησιμοποιησουμε αιθέρες.js βιβλιοθήκη, η οποία είναι (μαζί με web3) η πιο χρησιμοποιούμενη και βολική βιβλιοθήκη. Δεδομένου ότι είναι μια βιβλιοθήκη ανοιχτού κώδικα, είστε ελεύθεροι να την εξερευνήσετε τον κώδικα και τα έγγραφά του. Επίσης, αυτή η βιβλιοθήκη μας δίνει την τέλεια διεπαφή για την κατασκευή του παρακάτω μηνύματος:
Ένα από τα μειονεκτήματα και των δύο web3 και αιθέρες Οι βιβλιοθήκες είναι ότι δεν έχουν όλες τις λειτουργίες για το τοπικό περιβάλλον Ganache, καθώς και οι δύο βιβλιοθήκες έχουν ως στόχο να λειτουργούν με πλήρεις κόμβους Ethererum. Ωστόσο, υπάρχει μια προσέγγιση για τοπική δοκιμή με χρήση λειτουργικότητα λογαριασμού web3. Αν και πρέπει να δημιουργήσετε έναν επιπλέον λογαριασμό, ο οποίος θα υλοποιεί τη λειτουργία τραγουδιστή και θα παρέχει σύνδεση με τον τρέχοντα πάροχο web3:
Έτσι, τώρα έχουμε το μήνυμα που δημιουργήθηκε και υπογράφηκε. Αλλά, αυτό δεν είναι το παν. απομένουν μερικά πράγματα για να μιλήσουμε. Και οι δύο βιβλιοθήκες (web3 και αιθέρες) κάτω από την κουκούλα παρέχουν επιπλέον κατακερματισμό του μηνύματος πριν από τη δημιουργία της υπογραφής. Επίσης, το μήνυμα δεν είναι απλώς κατακερματισμένο, αλλά συνδυάζεται με το τυπικό μήνυμα Ethereum που είδαμε νωρίτερα:
Και γι' αυτό προσθέσαμε την πρόσθετη μέθοδο στο συμβόλαιο. Επομένως, εάν θέλετε να χρησιμοποιήσετε προσαρμοσμένα μηνύματα, να παραλείψετε πρόσθετο κατακερματισμό κ.λπ., πρέπει να δημιουργήσετε μια προσαρμοσμένη έκδοση της λειτουργίας υπογραφής. Συζητήσαμε τον λόγο παραπάνω — και οι δύο τυπικές βιβλιοθήκες εφαρμόζουν την τυπική προσέγγιση για την υπογραφή του μηνύματος, η οποία μπορεί να αλλάξει μόνο με παράκαμψη της λειτουργικότητας.
Ως τελευταίο βήμα, ας εκτελέσουμε τη δοκιμή και ας ελέγξουμε αν λειτουργεί σωστά:
Δοκιμάσαμε τη δημιουργία υπογραφής, το μήνυμα που δημιουργήθηκε, την έγκριση υπογραφής και την απόρριψη. Επομένως, είναι ένα αρκετά πλήρες σύνολο δοκιμών για τη λειτουργία επαλήθευσης.
- Λογαριασμός
- Ενέργειες
- Πρόσθετος
- αλγόριθμος
- Όλα
- επιχειρήματα
- άρθρο
- Αυθεντικός
- Κομμάτι
- περιπτώσεις
- έλεγχοι
- κωδικός
- σύμβαση
- κρυπτογράφηση
- Ρεύμα
- ημερομηνία
- Ανάπτυξη
- ψηφιακό
- ψηφιακή ταυτότητα
- έγγραφα
- Περιβάλλον
- ethereum
- δίκτυο ethereum
- Πρόσωπο
- Όνομα
- Ευελιξία
- Συγκέντρωση
- μορφή
- Δωρεάν
- πλήρη
- λειτουργία
- καλός
- χασίσι
- κατακερματισμός
- HTTPS
- ia
- Ταυτότητα
- πληροφορίες
- IP
- IT
- Κλειδί
- αργότερο
- Βιβλιοθήκη
- τοπικός
- medium
- δίκτυο
- κόμβων
- προσφορά
- προσφορές
- διαδικτυακά (online)
- ανοίξτε
- ανοικτού κώδικα
- λειτουργίες
- ιδιωτικός
- ιδιωτικού κλειδιού
- έργα
- δημόσιο
- δημόσιο κλειδί
- ανασκόπηση
- τρέξιμο
- σειρά
- Απλούς
- So
- στερεότητα
- διαίρεση
- χώρος στο δίσκο
- κατάστημα
- Στρατηγική
- σύστημα
- δοκιμή
- Δοκιμές
- δοκιμές
- Η Πηγη
- us
- Επαλήθευση
- Πορτοφόλι
- Wikipedia
- εντός
- Εργασία
- λειτουργεί