Μετάβαση στο κύριο περιεχόμενο
Change page

Δοκιμές Smart Contract

Τελευταία επεξεργασία: @mr_giorgos(opens in a new tab), 15 Ιουνίου 2024

Οι δημόσιες κρυπτοαλυσίδες, όπως το Ethereum, είναι αμετάβλητες, γεγονός που καθιστά δύσκολη την αλλαγή του κώδικα ενός έξυπνου συμβολαίου μετά την ανάπτυξη. Πρότυπα αναβάθμισης συμβολαίων για την εκτέλεση «εικονικών αναβαθμίσεων» υπάρχουν, αλλά εφαρμόζονται δύσκολα και απαιτούν κοινωνική συναίνεση. Επιπλέον, μια αναβάθμιση μπορεί να διορθώσει ένα σφάλμα μόνο αφού εντοπιστεί — εάν ένας επιτιθέμενος ανακαλύψει πρώτος την ευπάθεια, το έξυπνο συμβόλαιό σας διατρέχει κίνδυνο εκμετάλλευσης.

Για τους λόγους αυτούς, η δοκιμή έξυπνων συμβολαίων πριν από την ανάπτυξη στο κεντρικό δίκτυο είναι μια ελάχιστη απαίτηση για λόγους ασφάλειας. Υπάρχουν πολλές τεχνικές για τη δοκιμή συμβάσεων και την αξιολόγηση της ορθότητας του κώδικα. Ωστόσο, μια σουίτα δοκιμών που αποτελείται από διαφορετικά εργαλεία και προσεγγίσεις είναι ιδανική για τον εντοπισμό τόσο μικρών όσο και μεγάλων ατελειών του κώδικα συμβολαίου σε θέματα ασφάλειας.

Προαπαιτούμενα

Αυτή η σελίδα εξηγεί πώς να δοκιμάσετε τα έξυπνα συμβόλαια πριν από την ανάπτυξη στο δίκτυο Ethereum. Θεωρεί ότι είστε εξοικειωμένοι με τα έξυπνα συμβόλαια.

Τι είναι η δοκιμή έξυπνου συμβολαίου;

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

Αν και οι προσεγγίσεις ποικίλλουν, οι περισσότερες μέθοδοι δοκιμής απαιτούν την εκτέλεση έξυπνου συμβολαίου με ένα μικρό δείγμα των δεδομένων που αναμένεται να χειρίζεται. Εάν το συμβόλαιο παράγει σωστά αποτελέσματα για τα δειγματοληπτικά δεδομένα, υποτίθεται ότι λειτουργεί σωστά. Τα περισσότερα εργαλεία δοκιμής παρέχουν πόρους για τη συγγραφή και εκτέλεση δοκιμαστικών περιπτώσεων(opens in a new tab) για να ελέγξουν εάν η εκτέλεση ενός συμβολαίου ταιριάζει με τα αναμενόμενα αποτελέσματα.

Γιατί είναι σημαντικό να δοκιμάζονται τα έξυπνα συμβόλαια;

Καθώς τα έξυπνα συμβόλαια συχνά διαχειρίζονται περιουσιακά στοιχεία υψηλής αξίας, μικρά προγραμματιστικά σφάλματα μπορούν και συχνά οδηγούν σε τεράστιες απώλειες για τους χρήστες(opens in a new tab). Ωστόσο, οι αυστηρές δοκιμές μπορούν να σας βοηθήσουν να ανακαλύψετε ελαττώματα και προβλήματα στον κώδικα ενός έξυπνου συμβολαίου νωρίς και να τα διορθώσετε πριν από τη δημοσίευση στο κεντρικό δίκτυο.

Αν και ένα έξυπνο συμβόλαιο μπορεί να αναβαθμιστεί, εάν εντοπιστεί σφάλμα, οι αναβαθμίσεις είναι περίπλοκες και μπορούν να οδηγήσουν σε σφάλματα(opens in a new tab) αν δεν υπάρξει κατάλληλος χειρισμός. Η αναβάθμιση ενός έξυπνου συμβολαίου αναιρεί ακόμη περισσότερο την αρχή της μη μεταβλητότητας και επιβαρύνει τους χρήστες με πρόσθετες υποθέσεις εμπιστοσύνης. Αντίθετα, ένα ολοκληρωμένο σχέδιο για τη δοκιμή του έξυπνου συμβολαίου σας μετριάζει τους κινδύνους ασφάλειας των έξυπνων συμβολαίων και μειώνει την ανάγκη για εκτέλεση περίπλοκων αναβαθμίσεων λογικής μετά την ανάπτυξη.

Μέθοδοι δοκιμής έξυπνων συμβολαίων

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

Αυτόματος έλεγχος

Οι αυτοματοποιημένες δοκιμές χρησιμοποιούν εργαλεία που ελέγχουν αυτόματα τον κώδικα ενός έξυπνου συμβολαίου για σφάλματα κατά την εκτέλεση. Το όφελος των αυτοματοποιημένων δοκιμών προέρχεται από τη χρήση σεναρίων(opens in a new tab) βάσει των οποίων αξιολογούνται οι λειτουργίες του συμβολαίου. Τα τεστ σεναρίων μπορούν να προγραμματιστούν να εκτελούνται επανειλημμένα με ελάχιστη ανθρώπινη παρέμβαση, καθιστώντας τις αυτοματοποιημένες δοκιμές πιο αποτελεσματικές από τις χειροκίνητες προσεγγίσεις στις δοκιμές.

Η αυτοματοποιημένη δοκιμή είναι ιδιαίτερα χρήσιμη όταν οι δοκιμές είναι επαναλαμβανόμενες και χρονοβόρες, δύσκολο να εκτελεστούν χειροκίνητα, επιρρεπείς σε ανθρώπινο λάθος ή συνεπάγονται αξιολόγηση κρίσιμων λειτουργιών του έξυπνου συμβολαίου. Αλλά τα εργαλεία αυτοματοποιημένης δοκιμής μπορεί να έχουν μειονεκτήματα αλλά μπορεί να χάσουν ορισμένα σφάλματα και να παράγουν πολλά ψευδώς θετικά(opens in a new tab). Ως εκ τούτου, ο συνδυασμός αυτοματοποιημένης δοκιμής με χειροκίνητη δοκιμή στα έξυπνα συμβόλαια είναι ιδανικός.

Χειροκίνητη δοκιμή

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

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

Η αποτελεσματική χειροκίνητη δοκιμή απαιτεί σημαντικούς πόρους (δεξιότητα, χρόνο, χρήματα και προσπάθεια) και υπάρχει πιθανότητα παράλειψης ορισμένων σφαλμάτων κατά την εκτέλεση δοκιμών, λόγω ανθρώπινου λάθους. Αλλά η χειροκίνητη δοκιμή μπορεί επίσης να είναι επωφελής — για παράδειγμα, ένας ανθρώπινος δοκιμαστής (π.χ. ένας ελεγκτής) μπορεί να χρησιμοποιήσει τη διαίσθηση για να εντοπίσει περιπτώσεις άκρων που ένα εργαλείο αυτοματοποιημένης δοκιμής θα παρέλειπε.

Αυτοματοποιημένες δοκιμές για έξυπνα συμβόλαια

Δοκιμή μονάδας

Η δοκιμή μονάδας αξιολογεί τις συναρτήσεις του έξυπνου συμβολαίου ξεχωριστά και ελέγχει ότι κάθε στοιχείο λειτουργεί σωστά. Οι καλές δοκιμές μονάδας θα πρέπει να είναι απλές, γρήγορες στην εκτέλεση και να παρέχουν μια σαφή εικόνα για το τι πήγε στραβά εάν οι δοκιμές αποτύχουν.

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

Οδηγίες για δοκιμή μονάδας έξυπνων συμβολαίων

1. Κατανοήστε τη λογική και τη ροή εργασιών του έξυπνου συμβολαίου σας

Πριν γράψετε δοκιμές μονάδας, είναι χρήσιμο να γνωρίζετε ποιες λειτουργίες προσφέρει ένα έξυπνο συμβόλαιο και πώς οι χρήστες αποκτούν πρόσβαση και χρησιμοποιούν αυτές τις συναρτήσεις. Αυτό είναι ιδιαίτερα χρήσιμο για την εκτέλεση δοκιμών ευτυχούς διαδρομής(opens in a new tab) που καθορίζουν εάν οι συναρτήσεις σε ένα έξυπνο συμβόλαιο επιστρέφουν τη σωστή έξοδο για έγκυρα στοιχεία εισαγωγής από τον χρήστη. Θα εξηγήσουμε αυτήν την έννοια χρησιμοποιώντας αυτό το (συντομευμένο) παράδειγμα ενός συμβολαίου δημοπρασίας(opens in a new tab)

1constructor(
2 uint biddingTime,
3 address payable beneficiaryAddress
4 ) {
5 beneficiary = beneficiaryAddress;
6 auctionEndTime = block.timestamp + biddingTime;
7 }
8
9function bid() external payable {
10
11 if (block.timestamp > auctionEndTime)
12 revert AuctionAlreadyEnded();
13
14 if (msg.value <= highestBid)
15 revert BidNotHighEnough(highestBid);
16
17 if (highestBid != 0) {
18 pendingReturns[highestBidder] += highestBid;
19 }
20 highestBidder = msg.sender;
21 highestBid = msg.value;
22 emit HighestBidIncreased(msg.sender, msg.value);
23 }
24
25 function withdraw() external returns (bool) {
26 uint amount = pendingReturns[msg.sender];
27 if (amount > 0) {
28 pendingReturns[msg.sender] = 0;
29
30 if (!payable(msg.sender).send(amount)) {
31 pendingReturns[msg.sender] = amount;
32 return false;
33 }
34 }
35 return true;
36 }
37
38function auctionEnd() external {
39 if (block.timestamp < auctionEndTime)
40 revert AuctionNotYetEnded();
41 if (ended)
42 revert AuctionEndAlreadyCalled();
43
44 ended = true;
45 emit AuctionEnded(highestBidder, highestBid);
46
47 beneficiary.transfer(highestBid);
48 }
49}
Εμφάνιση όλων

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

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

Η κατανόηση της ροής εργασιών ενός έξυπνου συμβολαίου βοηθά επίσης στη συγγραφή δοκιμών μονάδας που ελέγχουν εάν η εκτέλεση πληροί τις απαιτήσεις. Για παράδειγμα, το έξυπνο συμβόλαιο δημοπρασίας καθορίζει ότι οι χρήστες δεν μπορούν να υποβάλουν προσφορές όταν η δημοπρασία έχει τελειώσει (δηλαδή όταν το ΧρόνοςΛήξηςΔημοπρασίας είναι χαμηλότερο από το ΧρονικήΣήμανση.μπλοκ). Έτσι, ένας προγραμματιστής μπορεί να εκτελέσει μια δοκιμή μονάδας που ελέγχει εάν οι κλήσεις στη συνάρτηση προσφορά() πετυχαίνουν ή αποτυγχάνουν όταν τελειώσει η δημοπρασία (δηλαδή όταν ΧρόνοςΛήξηςΔημοπρασίας > ΧρονικήΣήμανση.μπλοκ).

2. Αξιολογήστε όλες τις υποθέσεις σχετικά με την εκτέλεση του έξυπνου συμβολαίου

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

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

  • Οι χρήστες δεν μπορούν να υποβάλουν προσφορές όταν ο πλειστηριασμός έχει τελειώσει ή δεν έχει ξεκινήσει.

  • Το έξυπνο συμβόλαιο πλειστηριασμού ανατρέπεται εάν μια προσφορά είναι κάτω από το αποδεκτό όριο.

  • Στους χρήστες που δεν κερδίζουν την προσφορά πιστώνονται τα κεφάλαιά τους

Σημείωση: Ένας άλλος τρόπος για να ελέγξετε τις υποθέσεις είναι να γράψετε δοκιμές που ενεργοποιούν τροποποιητές συναρτήσεων(opens in a new tab)ενός συμβολαίου, ειδικά δηλώσεις require, assert και if…else.

3. Μέτρηση κάλυψης κώδικα

Η κάλυψη κώδικα(opens in a new tab) είναι μια δοκιμή μετρικού συστήματος που παρακολουθεί τον αριθμό των κλάδων, των γραμμών και των δηλώσεων στον κώδικα σας που εκτελέστηκε κατά τη διάρκεια των δοκιμών. Οι δοκιμές πρέπει να έχουν καλή κάλυψη κώδικα, διαφορετικά μπορεί να έχετε «ψευδώς αρνητικά», τα οποία συμβαίνουν όταν ένα έξυπνο συμβόλαιο περνάει όλες τις δοκιμές, αλλά εξακολουθούν να υπάρχουν ευπάθειες στον κώδικα. Η καταγραφή υψηλής κάλυψης κώδικα, ωστόσο, δίνει τη διαβεβαίωση ότι ελέγχθηκε επαρκώς η ορθότητα όλων των δηλώσεων/συναρτήσεων ενός έξυπνου συμβολαίου.

4. Χρησιμοποιήστε καλά ανεπτυγμένα πλαίσια δοκιμών

Η ποιότητα των εργαλείων που χρησιμοποιούνται για την εκτέλεση δοκιμών μονάδας για το έξυπνο συμβόλαιό σας έχει καθοριστική σημασία. Ένα ιδανικό πλαίσιο δοκιμών είναι αυτό που συντηρείται τακτικά, παρέχει χρήσιμες λειτουργίες (π.χ., δυνατότητες καταγραφής και αναφοράς) και πρέπει να έχει χρησιμοποιηθεί εκτενώς και να έχει ελεγχθεί από άλλους προγραμματιστές.

Τα πλαίσια δοκιμών μονάδας για έξυπνα συμβόλαια Solidity διατίθενται σε διαφορετικές γλώσσες (κυρίως JavaScript, Python και Rust). Δείτε μερικούς από τους παρακάτω οδηγούς για πληροφορίες σχετικά με τον τρόπο εκκίνησης δοκιμών μονάδας με διαφορετικά πλαίσια δοκιμών:

Δοκιμές ολοκλήρωσης

Ενώ οι δοκιμές μονάδας εντοπίζουν σφάλματα στις συναρτήσεις συμβολαίου μεμονωμένα, οι δοκιμές ολοκλήρωσης αξιολογούν τα στοιχεία ενός έξυπνου συμβολαίου ως σύνολο. Οι δοκιμές ολοκλήρωσης μπορούν να εντοπίσουν προβλήματα που προκύπτουν από κλήσεις μεταξύ συμβολαίων ή αλληλεπιδράσεις μεταξύ διαφορετικών συναρτήσεων στο ίδιο έξυπνο συμβόλαιο. Για παράδειγμα, οι δοκιμές ολοκλήρωσης μπορούν να βοηθήσουν στον έλεγχο αν λειτουργούν σωστά πράγματα όπως η κληροδοσία(opens in a new tab) και η αύξηση εξαρτήσεων.

Οι δοκιμές ολοκλήρωσης είναι χρήσιμες εάν το συμβόλαιό σας διαθέτει αρθρωτή αρχιτεκτονική ή διασυνδέεται με άλλα συμβόλαια εντός αλυσίδας κατά την εκτέλεση. Ένας τρόπος εκτέλεσης δοκιμών ολοκλήρωσης είναι να προσθέσετε σε ένα συγκεκριμένο ύψος (χρησιμοποιώντας ένα εργαλείο όπως το Forge(opens in a new tab) ή το Hardhat(opens in a new tab)) και να προσομοιώσετε αλληλεπιδράσεις μεταξύ του συμβολαίου σας και των ανεπτυγμένων συμβολαίων.

Η διακλαδωμένη κρυπτοαλυσίδα θα συμπεριφέρεται παρόμοια με το κεντρικό δίκτυο και θα έχει λογαριασμούς με συσχετισμένες καταστάσεις και υπόλοιπα. Αλλά λειτουργεί μόνο ως ένα απομονωμένο τοπικό περιβάλλον ανάπτυξης, που σημαίνει ότι δε θα χρειαστείτε πραγματικό ETH για συναλλαγές, για παράδειγμα, ούτε οι αλλαγές σας θα επηρεάσουν το πραγματικό πρωτόκολλο Ethereum.

Δοκιμή βάσει ιδιοτήτων

Η δοκιμή βάσει ιδιοτήτων είναι η διαδικασία ελέγχου ότι ένα έξυπνο συμβόλαιο ικανοποιεί κάποια καθορισμένη ιδιότητα. Οι ιδιότητες υποστηρίζουν γεγονότα σχετικά με τη συμπεριφορά ενός έξυπνου συμβολαίου που αναμένεται να παραμείνουν αληθείς σε διαφορετικά σενάρια. Ένα παράδειγμα μιας ιδιότητας έξυπνου συμβολαίου θα μπορούσε να είναι «Οι αριθμητικές πράξεις στο έξυπνο συμβόλαιο ποτέ δεν υπερχειλίζουν ή υποχειλίζουν».

Η στατική ανάλυση και η δυναμική ανάλυση είναι δύο κοινές τεχνικές για την εκτέλεση δοκιμών βάσει ιδιοτήτων και οι δύο μπορούν να επαληθεύσουν ότι ο κώδικας για ένα πρόγραμμα (ένα έξυπνο συμβόλαιο σε αυτήν την περίπτωση) ικανοποιεί κάποια προκαθορισμένη ιδιότητα. Ορισμένα εργαλεία δοκιμής βάσει ιδιοτήτων διαθέτουν προκαθορισμένους κανόνες σχετικά με τις αναμενόμενες ιδιότητες του έξυπνου συμβολαίου και ελέγχουν τον κώδικα σύμφωνα με αυτούς τους κανόνες, ενώ άλλα σας επιτρέπουν να δημιουργήσετε προσαρμοσμένες ιδιότητες για ένα έξυπνο συμβόλαιο.

Στατική ανάλυση

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

Το linting(opens in a new tab) και η στατική δοκιμή(opens in a new tab) είναι κοινές μέθοδοι για την εκτέλεση στατικής ανάλυσης σε συμβόλαια. Και οι δύο απαιτούν την ανάλυση αναπαραστάσεων χαμηλού επιπέδου της εκτέλεσης ενός συμβολαίου, όπως τα δέντρα αφηρημένης σύνταξης(opens in a new tab) και τα γραφήματα ροής ελέγχου(opens in a new tab) που παράγονται από τον μεταγλωττιστή.

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

Δυναμική ανάλυση

Η δυναμική ανάλυση παράγει συμβολικά στοιχεία εισαγωγής (π.χ. σε συμβολική εκτέλεση(opens in a new tab)) ή συγκεκριμένα στοιχεία εισαγωγής (π.χ. σε fuzzing(opens in a new tab)) σε συναρτήσεις έξυπνου συμβολαίου για να δει εάν ένα ή περισσότερα ίχνη εκτέλεσης παραβιάζουν συγκεκριμένες ιδιότητες. Αυτή η μορφή δοκιμής βάσει ιδιοτήτων διαφέρει από τις δοκιμές μονάδας ως προς ότι οι δοκιμαστικές περιπτώσεις καλύπτουν πολλαπλά σενάρια και ένα πρόγραμμα χειρίζεται τη δημιουργία δοκιμαστικών περιπτώσεων.

Το fuzzing(opens in a new tab) είναι ένα παράδειγμα μιας τεχνικής δυναμικής ανάλυσης για την επαλήθευση αυθαίρετων ιδιοτήτων σε έξυπνα συμβόλαια. Ένας fuzzer καλεί συναρτήσεις σε ένα συμβόλαιο προορισμού με τυχαίες ή κακοσχηματισμένες παραλλαγές μιας καθορισμένης τιμής εισόδου. Εάν το έξυπνο συμβόλαιο εισέλθει σε κατάσταση σφάλματος (π.χ. όπου ένας ισχυρισμός αποτυγχάνει), το πρόβλημα επισημαίνεται και τα στοιχεία εισαγωγής που οδηγούν την εκτέλεση προς την ευάλωτη διαδρομή καταγράφονται σε αναφορά.

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

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

  2. Η σουίτα δοκιμών σας ενδέχεται να μην καλύπτει επαρκώς όλες τις πιθανές διαδρομές μέσα στο πρόγραμμα. Ακόμη και με 100% κάλυψη, είναι πιθανό να παραλείψετε ακραίες περιπτώσεις.

  3. Οι δοκιμές μονάδας αποδεικνύουν ότι ένα έξυπνο συμβόλαιο εκτελείται σωστά για δεδομένα δείγματος, αλλά παραμένει άγνωστο κατά πόσο το έξυπνο συμβόλαιο εκτελείται σωστά για στοιχεία εισαγωγής εκτός του δείγματος. Οι δοκιμές ιδιότητας εκτελούν ένα έξυπνο συμβόλαιο στόχο με πολλές παραλλαγές μιας δεδομένης τιμής εισόδου για να βρουν ίχνη εκτέλεσης που προκαλούν αποτυχίες ισχυρισμών. Έτσι, μια δοκιμή ιδιότητας παρέχει περισσότερες εγγυήσεις ότι ένα έξυπνο συμβόλαιο εκτελείται σωστά για μια ευρεία κατηγορία δεδομένων εισόδου.

Οδηγίες για την εκτέλεση δοκιμών βάσει ιδιοτήτων για έξυπνα συμβόλαια

Η εκτέλεση δοκιμών βάσει ιδιοτήτων συνήθως ξεκινά με τον ορισμό μιας ιδιότητας (π.χ. απουσία υπερχειλίσεων ακεραίων(opens in a new tab)) ή μιας συλλογής ιδιοτήτων που θέλετε να επαληθεύσετε σε ένα έξυπνο συμβόλαιο. Μπορεί επίσης να χρειαστεί να ορίσετε ένα εύρος τιμών εντός του οποίου το πρόγραμμα μπορεί να δημιουργήσει δεδομένα για εισερχόμενα στοιχεία συναλλαγών κατά τη συγγραφή δοκιμών ιδιοτήτων.

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

Χειροκίνητη δοκιμή έξυπνων συμβολαίων

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

Δοκιμή συμβολαίων σε μια τοπική κρυπτοαλυσίδα

Ενώ οι αυτοματοποιημένες δοκιμές που εκτελούνται σε ένα τοπικό περιβάλλον ανάπτυξης μπορούν να παρέχουν χρήσιμες πληροφορίες εντοπισμού σφαλμάτων, θα θέλετε να γνωρίζετε πώς συμπεριφέρεται το έξυπνο συμβόλαιό σας σε ένα περιβάλλον παραγωγής. Ωστόσο, η ανάπτυξη στην κύρια αλυσίδα Ethereum συνεπάγεται κρατήσεις gas εκτός από το γεγονός ότι εσείς ή οι χρήστες σας μπορεί να χάσετε πραγματικά χρήματα εάν το έξυπνο συμβόλαιό σας εξακολουθεί να έχει σφάλματα.

Η δοκιμή του συμβολαίου σας σε μια τοπική κρυπτοαλυσίδα (γνωστή και ως δίκτυο ανάπτυξης) είναι μια συνιστώμενη εναλλακτική λύση στη δοκιμή στο κεντρικό δίκτυο. Μια τοπική κρυπτοαλυσίδα είναι ένα αντίγραφο της κρυπτοαλυσίδας Ethereum που εκτελείται τοπικά στον υπολογιστή σας, το οποίο προσομοιώνει τη συμπεριφορά του επιπέδου εκτέλεσης του Ethereum. Ως εκ τούτου, μπορείτε να προγραμματίσετε συναλλαγές για να αλληλεπιδράσετε με ένα συμβόλαιο χωρίς σημαντικό επιπλέον κόστος.

Η εκτέλεση συμβολαίων σε μια τοπική κρυπτοαλυσίδα θα μπορούσε να είναι χρήσιμη ως μια μορφή χειροκίνητης δοκιμής ολοκλήρωσης. Τα έξυπνα συμβόλαια είναι ιδιαίτερα συνθετικά, και αυτό σας επιτρέπει να ενσωματωθείτε με υπάρχοντα πρωτόκολλα - αλλά θα πρέπει ακόμα να διασφαλίσετε ότι τέτοιες σύνθετες αλληλεπιδράσεις εντός αλυσίδας παράγουν τα σωστά αποτελέσματα.

Περισσότερα για τα δίκτυα ανάπτυξης.

Δοκιμή έξυπνων συμβολαίων στα δοκιμαστικά δίκτυα

Ένα δίκτυο δοκιμών ή δοκιμαστικό δίκτυο λειτουργεί ακριβώς όπως το κεντρικό δίκτυο Ethereum, εκτός από το ότι χρησιμοποιεί Ether (ETH) χωρίς πραγματική αξία. Η ανάπτυξη του έξυπνου συμβολαίου σας σε ένα δοκιμαστικό δίκτυο σημαίνει ότι ο καθένας μπορεί να αλληλεπιδράσει με αυτό (π.χ. μέσω του μετωπικού άκρου της αποκεντρωμένης εφαρμογής) χωρίς να διακινδυνεύσει κεφάλαια.

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

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

Περισσότερα για τα δοκιμαστικά δίκτυα Ethereum.

Δοκιμή ή τυπική επαλήθευση

Ενώ η δοκιμή βοηθά να επιβεβαιωθεί ότι ένα έξυπνο συμβόλαιο επιστρέφει τα αναμενόμενα αποτελέσματα για ορισμένα εισερχόμενα δεδομένα, δεν μπορεί να αποδείξει οριστικά το ίδιο για στοιχεία εισαγωγής που δε χρησιμοποιήθηκαν κατά τη διάρκεια των δοκιμών. Η δοκιμή ενός έξυπνου συμβολαίου, επομένως, δεν μπορεί να εγγυηθεί τη «λειτουργική ορθότητα» (δηλαδή, δεν μπορεί να δείξει ότι ένα πρόγραμμα συμπεριφέρεται όπως απαιτείται για όλα τα σύνολα τιμών εισόδου).

Η τυπική επαλήθευση είναι μια προσέγγιση για την αξιολόγηση της ορθότητας του λογισμικού ελέγχοντας εάν ένα τυπικό μοντέλο του προγράμματος ταιριάζει με την τυπική προδιαγραφή. Ένα τυπικό μοντέλο είναι μια αφηρημένη μαθηματική αναπαράσταση ενός προγράμματος, ενώ μια τυπική προδιαγραφή ορίζει τις ιδιότητες ενός προγράμματος (δηλαδή, λογικές επιβεβαιώσεις σχετικά με την εκτέλεση του προγράμματος).

Επειδή οι ιδιότητες είναι γραμμένες σε μαθηματικούς όρους, γίνεται δυνατή η επαλήθευση ότι ένα τυπικό (μαθηματικό) μοντέλο του συστήματος ικανοποιεί μια προδιαγραφή χρησιμοποιώντας λογικούς κανόνες συμπερασμού. Έτσι, τα εργαλεία τυπικής επαλήθευσης λέγεται ότι παράγουν «μαθηματική απόδειξη» της ορθότητας ενός συστήματος.

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

Περισσότερα για την τυπική επαλήθευση έξυπνων συμβολαίων.

Δοκιμές ή Έλεγχοι και προγράμματα ανταμοιβής για εντοπισμό σφαλμάτων

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

Ωστόσο, μπορείτε να αυξήσετε περαιτέρω την πιθανότητα εντοπισμού ευπαθειών συμβολαίου λαμβάνοντας μια ανεξάρτητη αναθεώρηση κώδικα. Οι έλεγχοι έξυπνων συμβολαίων(opens in a new tab) και τα προγράμματα ανταμοιβής για εντοπισμό σφαλμάτων(opens in a new tab) είναι δύο τρόποι για να ζητήσετε από άλλους να αναλύσουν τα συμβόλαιά σας.

Οι έλεγχοι πραγματοποιούνται από ελεγκτές με εμπειρία στην εύρεση κενών ασφαλείας και κακών πρακτικών ανάπτυξης σε έξυπνα συμβόλαια. Ένας έλεγχος θα περιλαμβάνει συνήθως δοκιμές (και ενδεχομένως τυπική επαλήθευση) καθώς και μια χειροκίνητη αναθεώρηση ολόκληρης της βάσης κώδικα.

Αντίθετα, ένα πρόγραμμα ανταμοιβής για εντοπισμό σφαλμάτων συνήθως περιλαμβάνει την προσφορά μιας χρηματικής ανταμοιβής σε ένα άτομο (συνήθως περιγράφεται ως whitehat hacker(opens in a new tab)) που ανακαλύπτει μια ευπάθεια σε ένα έξυπνο συμβόλαιο και την αποκαλύπτει στους προγραμματιστές. Τα προγράμματα ανταμοιβής για εντοπισμό σφαλμάτων είναι παρόμοια με τους ελέγχους καθώς περιλαμβάνουν το να ζητήσετε από άλλους να βοηθήσουν στον εντοπισμό ελαττωμάτων σε έξυπνα συμβόλαια.

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

Εργαλεία δοκιμών και βιβλιοθήκες

Εργαλεία δοκιμών μονάδας

Εργαλεία δοκιμών βάσει ιδιοτήτων

Εργαλεία στατικής ανάλυσης

Εργαλεία δυναμικής ανάλυσης

  • Μια επισκόπηση και σύγκριση διαφορετικών προϊόντων δοκιμών
  • Πώς να χρησιμοποιήσετε το Echidna για δοκιμή έξυπνων συμβολαίων
  • Πως να χρησιμοποιήσετε το Manticore για εύρεση σφαλμάτων των έξυπνων συμβολαίων
  • Πώς να χρησιμοποιήσετε το Slither για εύρεση σφαλμάτων των έξυπνων συμβολαίων
  • Πώς να κάνετε εικονικές δοκιμές συμβολαίων με Solidity
  • Πώς να εκτελέσετε δοκιμές μονάδων στο Solidity χρησιμοποιώντας το Foundry(opens in a new tab)

Περισσότερες πληροφορίες

Ήταν χρήσιμο αυτό το άρθρο;