![](/img/bg-single.png)
Έξυπνα συμβόλαια αυτοελέγχου με ChatGPT
![](https://lotusmarket.io/storage/files/self-auditing-smart-contracts-with-chat-gpt/cover.png)
Κατά τον έλεγχο έξυπνων συμβολαίων, πρέπει να καλυφθεί ένα ευρύ φάσμα θεμάτων για να διασφαλιστεί ότι ο κώδικας είναι ασφαλής. Τα ζητήματα αυτά καλύπτουν διάφορες πτυχές, όπως ο έλεγχος πρόσβασης, η διαχείριση περιουσιακών στοιχείων, η διαχείριση δεδομένων, οι παραδοχές, οι εξαρτήσεις και οι λίστες ελέγχου ασφαλείας. Παρακάτω σας παρέχουμε μια λεπτομερή λίστα ελέγχου και οδηγίες για ερωτήματα ChatGPT που θα σας καθοδηγήσουν στη διαδικασία ελέγχου έξυπνων συμβολαίων.
Αν θέλετε να ερευνήσετε μόνοι σας ένα έξυπνο συμβόλαιο για ευπάθειες και κρυφές τεχνικές απάτης, το πρώτο βήμα είναι μια σωστά διαμορφωμένη προτροπή ChatGPT.
Ένα χρήσιμο ερώτημα για το ChatGPT θα ήταν η ακόλουθη εντολή:
Προσφέρετε μια πλήρη λίστα όλων των προβλημάτων και ευπαθειών στο ακόλουθο έξυπνο συμβόλαιο. Περιγράψτε λεπτομερώς τα προβλήματα και τις πιθανές ευπάθειες. Παρέχετε ένα σενάριο εκμετάλλευσης για κάθε ευπάθεια. Εξαγωγή ως έγκυρος πίνακας σε μορφή markdown με έναν κατάλογο αντικειμένων, το καθένα με στήλες 'description', 'action', 'severity', 'actors', 'scenario', 'type' και 'line'. 'type' όπου μπορεί να είναι 'usability', 'vulnerability', 'optimization' ή 'suggestion'. 'actors' είναι ένας κατάλογος των εμπλεκόμενων φορέων. 'severity' μπορεί να είναι 'low', 'medium' ή 'high'. 'row' είναι ο αριθμός γραμμής του προβλήματος. Βεβαιωθείτε ότι όλα τα πεδία του πίνακα είναι συμπληρωμένα.
Τότε χρησιμοποιήστε τις παρακάτω ερωτήσεις για να εξερευνήσετε το έξυπνο συμβόλαιο σε μεγαλύτερο βάθος.
Σενάρια χρήσης:
- Ποιοι είναι οι φορείς του συστήματος;
- Ποιες ενέργειες έχει το σύστημα;
- Ποιους περιορισμούς έχει το σύστημα;
- Ποιους πιθανούς τρόπους μπορεί να παραβιάσει το σύστημα;
- Ποιες άμυνες χρησιμοποιούνται για την αντιμετώπιση των επιθέσεων;
- Περιγράψτε, με βάση τους περιορισμούς, τις αλλαγές κατάστασης κάθε λειτουργίας.
- Παροχή πληροφοριών σχετικά με τα πρότυπα Solidity και DeFi που χρησιμοποιούνται.
- Γράψτε θετικά και αρνητικά αξιώματα με βάση τις πληροφορίες για το σύστημα.
- Αναφέρετε τρόπους βελτιστοποίησης και τροποποίησης του κώδικα ώστε να γίνει πιο αξιόπιστος (με αποσπάσματα κώδικα).
- Καταγράψτε τις μεθόδους κρυφής απάτης που χρησιμοποιούνται στον κώδικα (με αποσπάσματα κώδικα).
Tip: Η οπτική αναπαράσταση των δεδομένων συχνά παρέχει μια σαφέστερη κατανόηση της λειτουργίας του συστήματος. Όταν εργάζεστε με το ChatGPT, συνιστάται να ζητάτε οπτικοποίηση των δεδομένων εξόδου, όπως οι τροποποιήσεις κατάστασης με τη μορφή διαγραμμάτων χαρακτήρων ASCII. Παρόλο που δεν έχουν νόημα όλες οι οπτικοποιήσεις, ορισμένες μπορεί να παρέχουν πολύ πολύτιμη εικόνα της λειτουργίας ενός έξυπνου συμβολαίου.
Στην πραγματικότητα, ενώ το ChatGPT δεν μπορεί να αντικαταστήσει έναν ανθρώπινο ελεγκτή, συμπληρώνει σημαντικά τη διαδικασία ελέγχου παρέχοντας μια σαφέστερη κατανόηση των μεταβάσεων κατάστασης του πρωτοκόλλου, των περιορισμών, των αναβλητικών και της συμβατότητας. Αυτό το εργαλείο είναι ιδιαίτερα αποτελεσματικό για την κατανόηση των μεταβάσεων κατάστασης πρωτοκόλλου και των περιορισμών.
Tip: Πριν από την έναρξη ενός ελέγχου, η παροχή τεκμηρίωσης στο chatbot σχετικά με το υπό έλεγχο πρωτόκολλο μπορεί να βελτιώσει σημαντικά την ακρίβεια και τη συνάφεια των απαντήσεων. Απλά αναφέρετε: "Αυτή είναι η τεκμηρίωση που παρέχει το καλύτερο πλαίσιο για το 'όνομα_πρωτοκόλλου' που ελέγχω" και εισάγετε το έγγραφο.
Μπορούμε να πούμε ότι το ChatGPT είναι ένας ισχυρός βοηθός για τους ελεγκτές, παρέχοντας μια δομημένη και σε βάθος προσέγγιση για τον έλεγχο των έξυπνων συμβολαίων. Ωστόσο, θα πρέπει να ληφθεί υπόψη ότι το ChatGTP (και παρόμοιες υπηρεσίες) είναι απλώς πολύπλοκες ερμηνείες της μηχανικής ανάλυσης που εργάζονται με πιθανότητες, οπότε συχνά παράγει σφάλματα και ανακρίβειες. Κατά συνέπεια, το αποτέλεσμα του ChatGPT δεν μπορεί να στηριχθεί πλήρως - είναι μόνο ένα καλό εργαλείο στα σωστά χέρια και ένα "σημείο εκκίνησης" στην έρευνα έξυπνων συμβολαίων.
Επομένως, προκειμένου να προστατευτείτε από πιθανούς κινδύνους, τα έξυπνα συμβόλαια θα πρέπει να εξετάζονται πιο προσεκτικά για πιθανά τρωτά σημεία και δόλια σχήματα.
Πώς να εκτελέσετε έναν εις βάθος έλεγχο έξυπνων συμβολαίων; Τα 100 κορυφαία αιτήματα προς το ChatGPT
Παραπάνω έχουμε εξετάσει ένα γενικό ερώτημα (prompt) προς το ChatGPT, από το οποίο μπορείτε να ξεκινήσετε την ανάλυση ενός έξυπνου συμβολαίου. Αλλά, φυσικά, η λεπτομερής ανάλυση δεν περιορίζεται στην εισαγωγική προτροπή.
Οι απατεώνες βελτιώνουν συνεχώς τις τακτικές τους, οπότε πρέπει να είστε ενημερωμένοι και προσεκτικοί σε πολλές πτυχές - αυτές είναι βασικές στρατηγικές για να προστατεύσετε την επένδυση των token σας.
Ας δούμε μια λίστα με τα 100 κορυφαία ερωτήματα που θα σας δώσουν μια επαγγελματική προσέγγιση για τον έλεγχο ενός έξυπνου συμβολαίου:
- Μπορεί ο κώδικας να μεταγλωττιστεί επιτυχώς;
- Ποια έκδοση του Solidity χρησιμοποιείται στον κώδικα; Είναι η τρέχουσα σταθερή έκδοση;
- Υπάρχουν σαφή σχόλια που εξηγούν τον σκοπό των συναρτήσεων και των μεταβλητών;
- Χρησιμοποιεί το συμβόλαιο ένα σχήμα "Ownable"; Αν ναι, για ποιες συναρτήσεις;;
- Είναι σωστά κατανεμημένες οι μεταβλητές κατάστασης με χρήση τροποποιητών ορατότητας;;
- Χρησιμοποιούνται συμβάντα για σωστή καταγραφή;;
- Παρέχονται φιλικά προς το χρήστη μηνύματα σφάλματος;;
- Ελέγχεται η τιμή επιστροφής των κλήσεων χαμηλού επιπέδου;;
- Υπάρχουν σενάρια όπου ο ιδιοκτήτης μπορεί να εξουσιοδοτηθεί που θα μπορούσαν να οδηγήσουν σε χαλίνο;
- Ποιος έχει τον έλεγχο των προνομιούχων λογαριασμών και ποιοι είναι οι μηχανισμοί ελέγχου;
- Ποιους μηχανισμούς διακυβέρνησης υπάρχουν στο συμβόλαιο και είναι η διακυβέρνηση πλήρως ανοικτή ή περιορισμένη;
- Χρησιμοποιούνται άλλα συμβόλαια στο σύστημα και ποιους ρόλους εκπληρώνουν (π.χ. συμβόλαιο πληρεξουσίου);
- Υπάρχει μηχανισμός χρονικού κλειδώματος και μπορεί να παρακαμφθεί;
- Υπάρχει επαρκής τεκμηρίωση;
- Υπάρχουν πιθανές ευπάθειες σε επιθέσεις DoS ή επαναφορά στον κώδικα;
- Είναι όλες οι λειτουργίες εσωτερικές εκτός από εκείνες που απαιτείται ρητά να είναι δημόσιες/εξωτερικές;
- Δεν υπάρχουν αριθμητικές υπερχειλίσεις/υποχειλίσεις στις μαθηματικές πράξεις;
- Χρησιμοποιείται η ασφαλής βιβλιοθήκη OpenZeppelin;
- Δεν μπορούν να σταλούν κατά λάθος αιθέρες ή tokens σε μηδενική διεύθυνση (0x0)?
- Οι συνθήκες ελέγχονται με require πριν από τις λειτουργίες και τις αλλαγές κατάστασης?
- Ορίζεται η κατάσταση πριν και κατά την εκτέλεση των ενεργειών?
- Χρησιμοποιείται προστασία από επιθέσεις επανεισόδου (reentry) (το A καλεί το B καλεί το A)?
- Εφαρμόζεται σωστά η διασύνδεση ERC20;
- Χρησιμοποιείται ο τροποποιητής σε πολλαπλά σημεία μόνο εάν είναι πραγματικά απαραίτητο;
- Ορίζονται ρητά όλοι οι τύποι (π.χ. χρησιμοποιείται uint256 αντί για uint);
- Είναι όλες οι μέθοδοι και οι κύκλοι εντός του μέγιστου επιτρεπόμενου ορίου αερίου;
- Δεν υπάρχουν περιττές αρχικοποιήσεις στον κατασκευαστή (να θυμάστε ότι έχουν οριστεί προεπιλεγμένες τιμές);
- Υπάρχει πλήρης κάλυψη δοκιμών: κάθε μέθοδος έξυπνου συμβολαίου και όλοι οι δυνατοί τύποι δεδομένων εισόδου έχουν δοκιμαστεί;
- Έχει γίνει δοκιμή fuzz χρησιμοποιώντας τυχαίες εισόδους;
- Έχουν δοκιμαστεί όλες οι πιθανές καταστάσεις στις οποίες μπορεί να βρίσκεται ένα συμβόλαιο;
- Οι προεπιλεγμένες ποσότητες αιθέρα και tokens καθορίζονται σε μονάδες wei?
- Το μπλοκ/ώρα λήξης του crowdsale έρχεται μετά το μπλοκ/ώρα έναρξης (έναρξη/ενεργοποίηση συναλλαγών)?
- Ορίζεται σωστά η ισοτιμία ανταλλαγής/μετατροπής των crowdsale tokens?
- Υπάρχει ένα μαλακό/σκληρό όριο crowdsale που έχει οριστεί;
- Έχει οριστεί και δοκιμαστεί η ελάχιστη/μέγιστη επιτρεπόμενη συνεισφορά στο crowdsale;
- Έχει δοκιμαστεί η λειτουργικότητα της λευκής λίστας crowdsale;
- Έχει επαληθευτεί η λογική επιστροφής χρημάτων crowdsale;
- Οι συμμετέχοντες στο crowdsale λαμβάνουν αναλογικό αριθμό tokens ή μπορούν να διεκδικήσουν τη συνεισφορά τους;
- Είναι η διάρκεια κάθε σταδίου του crowdsale (πχ, προπώληση, δημόσια πώληση) έχει ρυθμιστεί κατάλληλα;
- Ορίζει ποιες λειτουργίες πρέπει να ελέγχονται μόνο από τον ιδιοκτήτη (π.χ, παύση του crowdsale, μετάβαση σε άλλο στάδιο του crowdsale, ενεργοποίηση της διανομής κουπονιών, κ.λπ.);?
- Έχει ελεγχθεί η λογική του crowdsale για την κατοχύρωση (vesting);?
- Το crowdsale διαθέτει μια λειτουργία ασφαλείας που, όταν ενεργοποιείται από τον ιδιοκτήτη, περιορίζει τις κλήσεις της λειτουργίας και περιλαμβάνει μια λειτουργία επιστροφής χρημάτων;
- Το Crowdsale διαθέτει μια λειτουργία επαναφοράς, αν αυτό έχει λογικό νόημα.
- Έχουν προ-ελεγχθεί οι εισαγόμενες βιβλιοθήκες και δεν περιέχουν ανεπιθύμητα μέρη που μπορεί να αντικατασταθούν σε μελλοντικές εκδόσεις και να χρησιμοποιηθούν για κακόβουλους σκοπούς?
- Οι μέθοδοι μεταφοράς συμβολαίων (transfer) είναι τυλιγμένες σε require?
- Χρησιμοποιούνται σωστά τα require και assert; Η μέθοδος assert χρησιμοποιείται μόνο για πράγματα που δεν πρέπει να συμβαίνουν ποτέ, συνήθως χρησιμοποιείται για τον έλεγχο της κατάστασης μετά από αλλαγές που έχουν γίνει.
- Υπάρχει άμυνα κατά των επιθέσεων αναδρομικών κλήσεων?
- Είναι περιορισμένα τα μήκη των αυθαίρετων συμβολοσειρών στην είσοδο?
- Όπου είναι δυνατόν αποφύγετε τη χρήση πινάκων και χρησιμοποιήστε αντ' αυτού αντιστοιχίσεις;
- Δεν χρησιμοποιούνται block hashes για το χειρισμό τυχαίων τιμών (οι miners μπορούν να το επηρεάσουν αυτό)?
- Δεν χρησιμοποιείται πουθενά το tx.origin?
- Τα στοιχεία του πίνακα μετατοπίζονται προς τα κάτω όταν διαγράφεται ένα στοιχείο ώστε να μην αφήνονται κενά?
- Χρησιμοποιείται το revert αντί του throw?
- Οι συναρτήσεις τερματίζονται αμέσως αν δεν πληρούνται οι συνθήκες;
- Έχουν επιλυθεί οι προειδοποιήσεις του μεταγλωττιστή;
- Χρησιμοποιείται η βιβλιοθήκη SafeMath στους υπολογισμούς;
- Διαβάζονται περισσότερες από μία φορές οποιεσδήποτε υποδοχές μνήμης (υποδοχές αποθήκευσης);
- Χρησιμοποιούνται απεριόριστοι βρόχοι/συστοιχίες που θα μπορούσαν να προκαλέσουν DoS;
- Χρησιμοποιείται το block.timestamp μόνο για μεγάλα χρονικά διαστήματα;
- Δεν χρησιμοποιείται το block. number για τον υπολογισμό του χρόνου που έχει παρέλθει;
- Αποφεύγεται η κλήση delegatecall, ειδικά για εξωτερικές (ακόμα και αν είναι αξιόπιστες) συμβάσεις;
- Δεν ενημερώνεται το μήκος του πίνακα κατά την επανάληψη πάνω σε αυτόν;
- Προστατεύονται οι υπογραφές από την αναπαραγωγή με nonce και block.chainid;
- Βεβαιωθείτε ότι όλες οι υπογραφές χρησιμοποιούν το EIP-712;
- Η έξοδος της abi.encodePacked() δεν πρέπει να κατακερματιστεί αν χρησιμοποιούνται περισσότεροι από 2 δυναμικοί τύποι. Γενικά είναι προτιμότερο να χρησιμοποιείτε την abi.encode().
- Ελέγξτε προσεκτικά τις εισαγωγές κώδικα συναρμολόγησης.
- Αποφύγετε την ανεπαρκή κατανάλωση αερίου (gas griefing).
- Είναι όλα τα ιδιωτικά δεδομένα πραγματικά ιδιωτικά;
- Η ενημέρωση μιας δομής/συστοιχίας στη μνήμη (memory) δεν θα την αλλάξει στην αποθήκευση (stage);
- Είναι οι μεταβλητές stage επισκιασμένες;
- Είναι ο υπολογισμός της τιμής μιας μεταβλητής on the fly φθηνότερος από την αποθήκευσή της;
- Διαβάζονται όλες οι μεταβλητές κατάστασης από τη σωστή σύμβαση (master vs. clone)?
- Χρησιμοποιούνται σωστά οι τελεστές σύγκρισης (>, <, >=, <=), ειδικά για την αποφυγή σφαλμάτων off-by-one?
- Είναι οι λογικοί τελεστές (==, ! =, &&, ||, !) χρησιμοποιούνται σωστά, ειδικά για την αποφυγή σφαλμάτων εκτός του ενός προς ένα;;
- Ο πολλαπλασιασμός εκτελείται πάντα πριν από τη διαίρεση (εκτός αν ο πολλαπλασιασμός μπορεί να υπερχειλίσει);;
- Οι μαγικοί αριθμοί αντικαθίστανται από μια σταθερά με διαισθητικό όνομα;
- Αν ένας παραλήπτης ETH έχει μια συνάρτηση υποχώρησης (fallback ) που μπορεί να αναστραφεί, θα μπορούσε αυτό να οδηγήσει σε DoS;
- Χρησιμοποιείται το πρότυπο SafeERC20 και οι τιμές επιστροφής ελέγχονται με ασφαλή τρόπο;
- Υποτίθεται ότι η msg. αποστολέας είναι πάντα ένας σχετικός χρήστης;
- Δεν χρησιμοποιείται το tx.origin για εξουσιοδότηση;
- Δεν χρησιμοποιείται το address.transfer() ή το address.send() αντί του .call.value();
- Όταν χρησιμοποιείτε κλήσεις χαμηλού επιπέδου, βεβαιωθείτε ότι υπάρχει σύμβαση πριν από την κλήση.
- Χρησιμοποιείται κώδικας συναρμολόγησης για την πρόσβαση στο chainid ή στον κωδικό συμβολαίου/μέγεθος/hash αντί της σύνταξης Solidity;
- Χρησιμοποιείται η λέξη-κλειδί delete όταν ορίζεται μια μεταβλητή σε μηδενική τιμή (0, false, "", κ.λπ..);
- Οι εκφράσεις που περνάνε σε λογικούς τελεστές/συγκρίσεις (&&/|||/>=/==/κ.λπ.) δεν πρέπει να έχουν παρενέργειες.
- Όταν έχετε να κάνετε με πολλαπλές διευθύνσεις, αναρωτηθείτε τι συμβαίνει αν είναι ίδιες;
- Πόσο καλά τεκμηριωμένος είναι ο κώδικας; Παρέχονται σχόλια και παραδείγματα οπουδήποτε χρησιμοποιείται μη τυποποιημένος κώδικας;
- Αν χρησιμοποιείται Εξωτερική Κλήση, βεβαιωθείτε ότι η κλήση εξωτερικής σύμβασης είναι πραγματικά απαραίτητη;
- Ελέγχεται το αποτέλεσμα της Εξωτερικής Κλήσης και αντιμετωπίζονται τα σφάλματα;
- Τι συμβαίνει αν η Εξωτερική Κλήση χρησιμοποιεί όλο το αέριο που παρέχεται;
- Αν η Εξωτερική Κλήση καλεί μια συγκεκριμένη συνάρτηση, βεβαιωθείτε ότι η συνάρτηση υπάρχει πραγματικά (συναρτήσεις φαντάσματα).
- Φροντίστε να μην χρησιμοποιούνται εξωτερικές κλήσεις στους τροποποιητές (modifiers)
- Εκδίδονται συμβάντα για κάθε συνάρτηση που τροποποιεί την αποθήκευση;
- Ελέγξτε τις υποθέσεις σας σχετικά με το τι κάνουν και τι επιστρέφουν οι εξωτερικές συμβάσεις που χρησιμοποιούνται στην κύρια.
- Προσοχή στα σημεία που χρησιμοποιούν πάρα πολλά ή πολύ λίγα δεκαδικά ψηφία. Βεβαιωθείτε ότι οι μέγιστες και ελάχιστες υποστηριζόμενες τιμές είναι τεκμηριωμένες.
- Είναι τεκμηριωμένη η εξουσία που σχετίζεται με τους ρόλους;
- Ποιοι είναι οι κίνδυνοι όταν παραβιάζονται τα δικαιώματα πρόσβασης και πώς μπορεί αυτό να επηρεάσει τα διάφορα στοιχεία του συστήματος;
- Μπορεί ο ιδιοκτήτης να χειρίζεται τα tokens και τα ETH εντός του συμβολαίου;
- Πώς ορίζεται η διεύθυνση του Oracle (Oracle) και ποια είναι η διαδικασία που κρύβεται πίσω από αυτό; Υπάρχουν εφεδρικά oracles για δημιουργία αντιγράφων ασφαλείας;
- Πώς εφαρμόζονται παρόμοιες λειτουργίες σε άλλα έργα, έχουν ληφθεί υπόψη οι βέλτιστες πρακτικές;
Αυτός ο κατάλογος ελέγχου θα σας βοηθήσει να διασφαλίσετε ότι θα πραγματοποιήσετε έναν ενδελεχή έλεγχο ασφαλείας των έξυπνων συμβολαίων Solidity. Καλύπτει ένα ευρύ φάσμα κρίσιμων πτυχών για τον εντοπισμό και τον μετριασμό πιθανών ευπαθειών και κινδύνων στον κώδικα και τα σχετικά συστήματα.
Ελπίζουμε ότι αυτά τα παραδείγματα σας βοήθησαν να κατανοήσετε καλύτερα τη μεθοδολογία ελέγχου των έξυπνων συμβολαίων.
Με δεδομένο ότι όλες οι πληροφορίες στην αλυσίδα μπλοκ είναι ανοικτές (με την προϋπόθεση, φυσικά, ότι ο πηγαίος κώδικας του συμβολαίου είναι επαληθευμένος), οπλισμένοι με αυτή τη γνώση μπορείτε να μελετήσετε ανεξάρτητα τα έξυπνα συμβόλαια και να εντοπίσετε διάφορα συστήματα απάτης.
Όμως, τα έχουμε ήδη κάνει όλα αυτά για εσάς! Εγγραφείτε για μια συνδρομή premium και αποκτήστε πρόσβαση σε αποκλειστικά φίλτρα σχετικά με τα χαρακτηριστικά των έξυπνων συμβολαίων και φρέσκα αναλυτικά στοιχεία. Αυξήστε τις πιθανότητες να επενδύσετε με επιτυχία σε κερδοφόρα token.
Χαιρετισμούς, ομάδα της Lotus Market.