Επαλήθευση έξυπνων συμβολαίων
Τελευταία επεξεργασία: @0xmike7(opens in a new tab), 23 Νοεμβρίου 2023
Τα έξυπνα συμβόλαια έχουν σχεδιαστεί για να μην απαιτούν παροχή εμπιστοσύνης, που σημαίνει ότι οι χρήστες δεν χρειάζεται να εμπιστεύονται τρίτα μέρη (π.χ. προγραμματιστές και εταιρείες) πριν αλληλεπιδράσουν με ένα συμβόλαιο. Ως προϋπόθεση για την έλλειψη απαίτησης παροχής εμπιστοσύνης, οι χρήστες και άλλοι προγραμματιστές πρέπει να μπορούν να επαληθεύουν τον πηγαίο κώδικα ενός έξυπνου συμβολαίου. Η επαλήθευση πηγαίου κώδικα διαβεβαιώνει τους χρήστες και τους προγραμματιστές ότι ο δημοσιευμένος κώδικας συμβολαίου είναι ο ίδιος κώδικας που εκτελείται στη διεύθυνση του συμβολαίου στην κρυπτοαλυσίδα Ethereum.
Είναι σημαντικό να γίνει η διάκριση μεταξύ «επαλήθευσης πηγαίου κώδικα» και «τυπικής επαλήθευσης». Η επαλήθευση πηγαίου κώδικα, η οποία θα εξηγηθεί λεπτομερώς παρακάτω, αναφέρεται στην επαλήθευση ότι ο δεδομένος πηγαίος κώδικας ενός έξυπνου συμβολαίου σε μια γλώσσα υψηλού επιπέδου (π.χ. Solidity) μεταγλωττίζεται στον ίδιο bytecode που θα εκτελεστεί στη διεύθυνση του συμβολαίου. Ωστόσο, η τυπική επαλήθευση περιγράφει την επαλήθευση της ορθότητας ενός έξυπνου συμβολαίου, που σημαίνει ότι το συμβόλαιο συμπεριφέρεται κατά τα αναμενόμενα. Αν και εξαρτάται από το πλαίσιο, η επαλήθευση συμβολαίου συνήθως αναφέρεται στην επαλήθευση του πηγαίου κώδικα.
Τι είναι η επαλήθευση πηγαίου κώδικα;
Πριν την ανάπτυξη έξυπνου συμβολαίου στο εικονικό μηχάνημα του Ethereum (EVM), οι προγραμματιστές μεταγλωττίζουν τον πηγαίο κώδικα, δηλαδή τις-οδηγίες του συμβολαίου γραμμένες σε Solidity ή σε άλλη υψηλού επιπέδου γλώσσα προγραμματισμού — σε bytecode. Καθώς το EVM δεν μπορεί να ερμηνεύσει εντολές υψηλού επιπέδου, η μεταγλώττιση του πηγαίου κώδικα σε bytecode (δηλαδή, χαμηλού επιπέδου, οδηγίες μηχανήματος) είναι απαραίτητη για την εκτέλεση του συμβολαίου λογικής στο EVM.
Η επαλήθευση πηγαίου κώδικα συγκρίνει τον πηγαίο κώδικα ενός έξυπνου συμβολαίου και το μεταγλωττισμένο bytecode που χρησιμοποιείται κατά τη δημιουργία του συμβολαίου για τον εντοπισμό τυχόν διαφορών. Η επαλήθευση των έξυπνων συμβολαίων είναι σημαντική, επειδή ο διαφημιζόμενος κώδικας συμβολαίου μπορεί να είναι διαφορετικός από αυτόν που εκτελείται στην κρυπτοαλυσίδα.
Η επαλήθευση έξυπνου συμβολαίου επιτρέπει να διερευνηθεί τι κάνει ένα συμβόλαιο μέσω της γλώσσας ανώτερου επιπέδου στην οποία είναι γραμμένο, χωρίς να χρειάζεται να διαβάσετε τον κώδικα του μηχανήματος. Οι συναρτήσεις, οι αξίες και συνήθως τα ονόματα και τα σχόλια των μεταβλητών παραμένουν ίδια με τον αρχικό πηγαίο κώδικα που μεταγλωττίζεται και αναπτύσσεται. Αυτό κάνει την ανάγνωση κώδικα πολύ πιο εύκολη. Η επαλήθευση πηγής προβλέπει επίσης τεκμηρίωση κώδικα, έτσι ώστε οι τελικοί χρήστες να γνωρίζουν τι έχει σχεδιαστεί για ένα έξυπνο συμβόλαιο.
Τι είναι η πλήρης επαλήθευση;
Υπάρχουν ορισμένα τμήματα του πηγαίου κώδικα που δεν επηρεάζουν τον μεταγλωττισμένο bytecode, όπως σχόλια ή ονόματα μεταβλητών. Αυτό σημαίνει ότι δύο πηγαίοι κώδικες με διαφορετικά ονόματα μεταβλητών και διαφορετικά σχόλια θα μπορούν και οι δύο να επαληθεύουν το ίδιο συμβόλαιο. Με αυτό, ένα κακόβουλο άτομο μπορεί να προσθέσει παραπλανητικά σχόλια ή να δώσει παραπλανητικά ονόματα μεταβλητών μέσα στον πηγαίο κώδικα και να επαληθεύσει το συμβόλαιο με έναν πηγαίο κώδικα διαφορετικό από τον αρχικό πηγαίο κώδικα.
Αυτό είναι δυνατό να αποφευχθεί με την προσθήκη επιπλέον δεδομένων στο bytecode για να χρησιμεύσει ως κρυπτογραφική εγγύηση για την ακρίβεια του πηγαίου κώδικα και ως δαχτυλικό αποτύπωμα των πληροφοριών μεταγλώττισης. Οι απαραίτητες πληροφορίες βρίσκονται στα μεταδεδομένα του συμβολαίου Solidity(opens in a new tab) και ο κατακερματισμός (hash) αυτού του αρχείου προσαρτάται στον bytecode του συμβολαίου. Μπορείτε να το δείτε σε δράση στον χώρο δοκιμών μεταδεδομένων(opens in a new tab)
Το αρχείο μεταδεδομένων περιέχει πληροφορίες σχετικά με τη σύνταξη της συμβολαίου, συμπεριλαμβανομένων των αρχείων προέλευσης και των hash τους. Αυτό σημαίνει ότι εάν αλλάξει κάποια από τις ρυθμίσεις μεταγλώττισης ή ακόμα και ένα byte σε ένα από τα αρχεία προέλευσης, αλλάζει το αρχείο μεταδεδομένων. Κατά συνέπεια, αλλάζει και το hash του αρχείου μεταδεδομένων, το οποίο προσαρτάται στο bytecode. Αυτό σημαίνει ότι εάν το bytecode ενός συμβολαίου και το συνημμένο hash μεταδεδομένων ταιριάζουν με τον δεδομένο πηγαίο κώδικα και τις ρυθμίσεις μεταγλώττισης, μπορούμε να είμαστε σίγουροι ότι πρόκειται ακριβώς για τον ίδιο πηγαίο κώδικα που χρησιμοποιήθηκε στην αρχική συλλογή, ούτε καν ένα byte δεν είναι διαφορετικό.
Αυτός ο τύπος επαλήθευσης που αξιοποιεί το hash μεταδεδομένων αναφέρεται ως "πλήρης επαλήθευση(opens in a new tab) (επίσης «τέλεια επαλήθευση»). Εάν τα hash μεταδεδομένων δεν ταιριάζουν ή δεν λαμβάνονται υπόψη κατά την επαλήθευση, θα είναι μια «μερική αντιστοίχιση», που επί του παρόντος είναι ο πιο συνηθισμένος τρόπος επαλήθευσης των συμβολαίων. Είναι δυνατό να εισαχθεί κακόβουλος κώδικας(opens in a new tab) που δεν θα αντικατοπτρίζεται στον επαληθευμένο πηγαίο κώδικα χωρίς πλήρη επαλήθευση. Οι περισσότεροι προγραμματιστές δεν γνωρίζουν για την πλήρη επαλήθευση και δεν διατηρούν το αρχείο μεταδεδομένων της μεταγλώττισής τους, επομένως η μερική επαλήθευση ήταν η πραγματική μέθοδος επαλήθευσης των συμβολαίων μέχρι στιγμής.
Γιατί είναι σημαντική η επαλήθευση του πηγαίου κώδικα;
Εμπιστοσύνη
Η έλλειψη απαίτησης παροχής εμπιστοσύνης είναι αναμφισβήτητα η μεγαλύτερη προϋπόθεση για τα έξυπνα συμβόλαια και τις αποκεντρωμένες εφαρμογές (dapp). Τα έξυπνα συμβόλαια είναι «αμετάβλητα» και δεν μπορούν να τροποποιηθούν. Ένα συμβόλαιο θα εκτελεί μόνο την επιχειρηματική λογική που ορίζεται στον κώδικα κατά τη στιγμή της ανάπτυξης. Αυτό σημαίνει ότι οι προγραμματιστές και οι επιχειρήσεις δεν μπορούν να παραβιάσουν τον κώδικα ενός συμβολαίου μετά την ανάπτυξη στο Ethereum.
Για να είναι ένα αξιόπιστο έξυπνο συμβόλαιο, ο κώδικας συμβολαίου θα πρέπει να είναι διαθέσιμος για ανεξάρτητη επαλήθευση. Ενώ ο μεταγλωττισμένος bytecode για κάθε έξυπνο συμβόλαιο είναι δημόσια διαθέσιμος στην κρυπτοαλυσίδα, η γλώσσα χαμηλού επιπέδου είναι δύσκολο να κατανοηθεί τόσο για τους προγραμματιστές όσο και για τους χρήστες.
Τα έργα μειώνουν τις υποθέσεις εμπιστοσύνης δημοσιεύοντας τον πηγαίο κώδικα των συμβολαίων τους. Αυτό όμως οδηγεί σε ένα άλλο πρόβλημα: είναι δύσκολο να επαληθευτεί ότι ο δημοσιευμένος πηγαίος κώδικας ταιριάζει με τον bytecode της συμβολαίου. Σε αυτό το σενάριο, η αξία της έλλειψης απαίτησης παροχής εμπιστοσύνης χάνεται επειδή οι χρήστες πρέπει να έχουν εμπιστοσύνη ότι οι προγραμματιστές δεν θα αλλάξουν την επιχειρηματική λογική ενός συμβολαίου (δηλαδή αλλάζοντας το bytecode) πριν το αναπτύξουν στην κρυπτοαλυσίδα.
Τα εργαλεία επαλήθευσης πηγαίου κώδικα παρέχουν εγγυήσεις ότι τα αρχεία πηγαίου κώδικα ενός έξυπνου συμβολαίου ταιριάζουν με τον κώδικα συναρμολόγησης. Το αποτέλεσμα είναι ένα οικοσύστημα χωρίς απαίτηση παροχής εμπιστοσύνης, όπου οι χρήστες δεν εμπιστεύονται τυφλά τρίτα μέρη και αντί αυτού επαληθεύουν τον κώδικά πριν καταθέσουν χρήματα σε ένα συμβόλαιο.
Ασφάλεια χρήστη
Με τα έξυπνα συμβόλαια, διακινδυνεύονται συνήθως πολλά χρήματα. Αυτό απαιτεί υψηλότερες εγγυήσεις ασφάλειας και επαλήθευση της λογικής ενός έξυπνου συμβολαίου πριν το χρησιμοποιήσετε. Το πρόβλημα είναι ότι ασυνείδητοι προγραμματιστές μπορούν να εξαπατήσουν τους χρήστες εισάγοντας κακόβουλο κώδικα σε ένα έξυπνο συμβόλαιο. Χωρίς επαλήθευση, τα κακόβουλα έξυπνα συμβόλαια μπορεί να έχουν «παραθυράκια»(opens in a new tab), αμφιλεγόμενους ελέγχους πρόσβασης μηχανισμού, εκμεταλλεύσιμα τρωτά σημεία και άλλα πράγματα που θέτουν σε κίνδυνο την ασφάλεια των χρηστών, που θα περνούσαν απαρατήρητα.
Η δημοσίευση των αρχείων πηγαίου κώδικα ενός έξυπνου συμβολαίου διευκολύνει τους ενδιαφερόμενους, όπως οι ελεγκτές, να αξιολογήσουν τη σύμβαση για πιθανούς φορείς επίθεσης. Με πολλά μέλη να επαληθεύουν ανεξάρτητα ένα έξυπνο συμβόλαιο, οι χρήστες έχουν ισχυρότερες εγγυήσεις για την ασφάλειά του.
Πώς να επαληθεύσετε πηγαίο κώδικα για τα έξυπνα συμβόλαια του Ethereum
Η ανάπτυξη ενός έξυπνου συμβολαίου στο Ethereum απαιτεί την αποστολή μιας συναλλαγής με «payload δεδομένων» (μεταγλωττισμένο bytecode) σε μια ειδική διεύθυνση. Το ωφέλιμο φορτίο δεδομένων παράγεται με τη μεταγλώττιση του πηγαίου κώδικα, συν τα επιχειρήματα του κατασκευαστή(opens in a new tab) της περίπτωσης συμβολαίου που προσαρτάται στο payload δεδομένων της συναλλαγής. Η μεταγλώττιση είναι ντετερμινιστική, που σημαίνει ότι παράγει πάντα τα ίδια στοιχεία εξαγωγής (δηλαδή, bytecode συμβολαίου) εάν χρησιμοποιούνται τα ίδια αρχεία προέλευσης και ρυθμίσεις μεταγλώττισης (π.χ. έκδοση μεταγλωττιστή, βελτιστοποίησης).
Η επαλήθευση ενός έξυπνου συμβολαίου βασικά περιλαμβάνει τα ακόλουθα βήματα:
Εισάγετε τα αρχεία προέλευσης και τις ρυθμίσεις μεταγλώττισης σε έναν μεταγλωττιστή.
Ο μεταγλωττιστής εξάγει το bytecode του συμβολαίου
Λαμβάνετε τον bytecode του αναπτυγμένου συμβολαίου σε μια δεδομένη διεύθυνση
Συγκρίνετε τον αναπτυγμένο bytecode με τον εκ νέου μεταγλωττισμένο bytecode. Εάν οι κώδικες ταιριάζουν, το συμβόλαιο επαληθεύεται με τον δεδομένο πηγαίο κώδικα και τις ρυθμίσεις μεταγλώττισης.
Επιπλέον, εάν οι κατακερματισμοί μεταδεδομένων στο τέλος του bytecode ταιριάζουν, θα πρόκειται για πλήρη ταύτιση.
Λάβετε υπόψη ότι αυτή είναι μια απλουστευμένη περιγραφή της επαλήθευσης και υπάρχουν πολλές εξαιρέσεις που δεν λειτουργούν με αυτή, όπως η ύπαρξη αμετάβλητων μεταβλητών(opens in a new tab).
Εργαλεία επαλήθευσης πηγαίου κώδικα
Η παραδοσιακή διαδικασία επαλήθευσης των συμβολαίων μπορεί να είναι πολύπλοκη. Αυτός είναι ο λόγος για τον οποίο διαθέτουμε εργαλεία για την επαλήθευση του πηγαίου κώδικα για έξυπνα συμβόλαια που αναπτύσσονται στο Ethereum. Αυτά τα εργαλεία αυτοματοποιούν μεγάλα κομμάτια της επαλήθευσης του πηγαίου κώδικα και επιμελούνται επίσης επαληθευμένα συμβόλαια προς όφελος των χρηστών.
Etherscan
Αν και είναι κυρίως γνωστό ως εξερευνητής κρυπτοαλυσίδας Ethereum, το Etherscan προσφέρει επίσης μια υπηρεσία επαλήθευσης πηγαίου κώδικα(opens in a new tab) για προγραμματιστές και χρήστες έξυπνων συμβολαίων.
Το Etherscan σάς επιτρέπει να μεταγλωττίσετε εκ νέου bytecode συμβολαίου από το αρχικό φορτίο δεδομένων (πηγαίος κώδικας, διεύθυνση βιβλιοθήκης, ρυθμίσεις μεταγλωττιστή, διεύθυνση συμβολαίου, κ.λπ.) Εάν το εκ νέου μεταγλωττισμένο bytecode συσχετίζεται με το bytecode (και τις παραμέτρους του κατασκευαστή) του συμβολαίου εντός αλυσίδας, τότε το συμβόλαιο επαληθεύεται(opens in a new tab).
Αφού επαληθευτεί, ο πηγαίος κώδικας του συμβολαίου σας λαμβάνει μια ετικέτα «Επαληθευμένο» και δημοσιεύεται στο Etherscan για έλεγχο από άλλους. Προστίθεται επίσης στην ενότητα Επαληθευμένα συμβόλαια(opens in a new tab) — έναν κατάλογο έξυπνων συμβολαίων με επαληθευμένους πηγαίους κώδικες.
Το Etherscan είναι το ευρύτερα χρησιμοποιούμενο εργαλείο για την επαλήθευση συμβολαίων. Ωστόσο, η επαλήθευση συμβολαίου της Etherscan έχει ένα μειονέκτημα: δεν καταφέρνει να συγκρίνει τον hash μεταδεδομένων του bytecode εντός αλυσίδας και του εκ νέου μεταγλωττισμένου bytecode. Επομένως, οι αντιστοιχίσεις στο Etherscan είναι μερικές αντιστοιχίσεις.
Περισσότερα σχετικά με την επαλήθευση συμβολαίων στο Etherscan(opens in a new tab).
Sourcify
Το Sourcify(opens in a new tab) είναι άλλο ένα εργαλείο για την επαλήθευση συμβολαίων που είναι ανοιχτού κώδικα και είναι αποκεντρωμένο. Δεν είναι εξερευνητής μπλοκ και επαληθεύει μόνο συμβόλαια σε διάφορα δίκτυα που βασίζονται στο EVM(opens in a new tab). Λειτουργεί ως δημόσια υποδομή για άλλα εργαλεία που μπορούν να χτιστούν πάνω από αυτό και στοχεύει να επιτρέψει πιο φιλικές προς τον άνθρωπο αλληλεπιδράσεις συμβολαίων χρησιμοποιώντας τα σχόλια ABI και NatSpec(opens in a new tab) που βρίσκονται στο αρχείο μεταδεδομένων.
Σε αντίθεση με το Etherscan, το Sourcify υποστηρίζει πλήρεις αντιστοιχίσεις με το hash μεταδεδομένων. Τα επαληθευμένα συμβόλαια προβάλλονται στο δημόσιο κατάλογο(opens in a new tab) σε HTTP και IPFS(opens in a new tab), το οποίο είναι ένας αποκεντρωμένος χώρος αποθήκευσης με διεύθυνση περιεχομένου(opens in a new tab). Αυτό επιτρέπει την ανάκτηση του αρχείου μεταδεδομένων ενός συμβολαίου μέσω IPFS, καθώς το hash μεταδεδομένων που έχει προσαρτηθεί είναι hash IPFS.
Επιπλέον, μπορεί κανείς να ανακτήσει τα αρχεία πηγαίου κώδικα μέσω IPFS, καθώς τα hash IPFS αυτών των αρχείων βρίσκονται επίσης στα μεταδεδομένα. Ένα συμβόλαιο μπορεί να επαληθευτεί παρέχοντας το αρχείο μεταδεδομένων και τα αρχεία προέλευσης μέσω του API ή του UI(opens in a new tab) ή χρησιμοποιώντας τα πρόσθετα εργαλεία (plugin). Το εργαλείο παρακολούθησης Sourcify ακούει επίσης τις δημιουργίες συμβολαίων σε νέα μπλοκ και προσπαθεί να επαληθεύσει τα συμβόλαια εάν τα μεταδεδομένα και τα αρχεία προέλευσης δημοσιεύονται στο IPFS.
Περισσότερα σχετικά με την επαλήθευση συμβολαίων στο Sourcify(opens in a new tab).
Tenderly
Η πλατφόρμα Tenderly(opens in a new tab) επιτρέπει στους προγραμματιστές Web3 να δημιουργούν, να δοκιμάζουν, να παρακολουθούν και να λειτουργούν έξυπνα συμβόλαια. Συνδυάζοντας εργαλεία εντοπισμού σφαλμάτων με τη δυνατότητα παρατήρησης και τα δομικά στοιχεία υποδομής, το Tenderly βοηθά τους προγραμματιστές να επιταχύνουν την ανάπτυξη έξυπνων συμβολαίων. Για να ενεργοποιηθούν πλήρως οι λειτουργίες Tenderly, οι προγραμματιστές πρέπει να πραγματοποιήσουν επαλήθευση πηγαίου κώδικα(opens in a new tab) χρησιμοποιώντας διάφορες μεθόδους.
Ένα συμβόλαιο μπορεί να επαληθεύεται ιδιωτικά ή δημόσια. Εάν επαληθευτεί ιδιωτικά, το έξυπνο συμβόλαιο είναι ορατό μόνο σε εσάς (και σε άλλα μέλη του έργου σας). Η επαλήθευση ενός συμβολαίου δημόσια το καθιστά ορατό σε όλους τους χρήστες της πλατφόρμας Tenderly.
Μπορείτε να επαληθεύσετε τα συμβόλαιά σας χρησιμοποιώντας τον Πίνακα ελέγχου(opens in a new tab), το πρόσθετο εργαλείο Tenderly Hardhat(opens in a new tab) ή το CLI(opens in a new tab).
Κατά την επαλήθευση συμβολαίων μέσω του Πίνακα ελέγχου, πρέπει να εισαγάγετε το αρχείο προέλευσης ή το αρχείο μεταδεδομένων που δημιουργείται από τον μεταγλωττιστή Solidity, τη διεύθυνση/δίκτυο και τις ρυθμίσεις του μεταγλωττιστή.
Η χρήση του πρόσθετου εργαλείου Tenderly Hardhat επιτρέπει περισσότερο έλεγχο στη διαδικασία επαλήθευσης με λιγότερη προσπάθεια, δίνοντάς σας τη δυνατότητα να επιλέξετε μεταξύ αυτόματης (χωρίς κώδικα) και μη αυτόματης επαλήθευσης (βάσει κώδικα).