Τεκμηρίωση SolanaΑνάπτυξη προγραμμάτων

Περιορισμοί

Η ανάπτυξη προγραμμάτων στο blockchain του Solana έχει ορισμένους εγγενείς περιορισμούς. Παρακάτω παρατίθεται μια λίστα με συνήθεις περιορισμούς που μπορεί να συναντήσετε.

Βιβλιοθήκες Rust

Επειδή τα προγράμματα onchain που βασίζονται σε Rust πρέπει να είναι ντετερμινιστικά ενώ εκτελούνται σε ένα περιβάλλον μονού νήματος με περιορισμένους πόρους, έχουν ορισμένους περιορισμούς σε διάφορες βιβλιοθήκες.

Τα προγράμματα Rust που εκτελούνται onchain υποστηρίζουν το μεγαλύτερο μέρος των libstd, libcore και liballoc της Rust, καθώς και πολλά πακέτα τρίτων.

Υπάρχουν ορισμένοι περιορισμοί καθώς αυτά τα προγράμματα εκτελούνται σε ένα περιβάλλον μονού νήματος με περιορισμένους πόρους, και πρέπει να είναι ντετερμινιστικά:

  • Δεν υπάρχει πρόσβαση σε:
    • rand
    • std::fs
    • std::net
    • std::future
    • std::process
    • std::sync
    • std::task
    • std::thread
    • std::time
  • Περιορισμένη πρόσβαση σε:
    • std::hash
    • std::os
  • Το Bincode είναι εξαιρετικά υπολογιστικά δαπανηρό τόσο σε κύκλους όσο και σε βάθος κλήσεων και θα πρέπει να αποφεύγεται
  • Η μορφοποίηση συμβολοσειρών θα πρέπει να αποφεύγεται καθώς είναι επίσης υπολογιστικά δαπανηρή.
  • Δεν υπάρχει υποστήριξη για println!, print!, χρησιμοποιήστε το msg! macro αντί αυτών.
  • Το περιβάλλον εκτέλεσης επιβάλλει ένα όριο στον αριθμό των εντολών που μπορεί να εκτελέσει ένα πρόγραμμα κατά την επεξεργασία μιας εντολής. Δείτε προϋπολογισμό υπολογισμού για περισσότερες πληροφορίες.

Προϋπολογισμός υπολογισμού

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

Δείτε την τεκμηρίωση υπολογιστικών περιορισμών για πιο συγκεκριμένες λεπτομέρειες.

Βάθος στοίβας κλήσεων - σφάλμα CallDepthExceeded

Τα προγράμματα Solana περιορίζονται ώστε να εκτελούνται γρήγορα, και για να διευκολυνθεί αυτό, η στοίβα κλήσεων του προγράμματος περιορίζεται σε μέγιστο βάθος 64 πλαισίων.

Όταν ένα πρόγραμμα υπερβαίνει το επιτρεπόμενο όριο βάθους στοίβας κλήσεων, θα λάβει το σφάλμα CallDepthExceeded.

Βάθος κλήσης CPI - σφάλμα CallDepth

Οι Cross Program Invocation επιτρέπουν στα προγράμματα να καλούν άλλα προγράμματα απευθείας, αλλά το βάθος περιορίζεται προς το παρόν σε 4.

Όταν ένα πρόγραμμα υπερβαίνει το επιτρεπόμενο βάθος κλήσης cross-program invocation, θα λάβει ένα σφάλμα CallDepth

Υποστήριξη τύπων δεδομένων Float της Rust

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

Οι λειτουργίες float εκτελούνται μέσω βιβλιοθηκών λογισμικού, συγκεκριμένα μέσω των ενσωματωμένων float του LLVM. Λόγω της προσομοίωσης μέσω λογισμικού, καταναλώνουν περισσότερες μονάδες υπολογισμού από τις λειτουργίες ακεραίων. Γενικά, συνιστώνται οι λειτουργίες σταθερής υποδιαστολής όπου είναι δυνατόν.

Οι δοκιμές της Solana Program Library math θα αναφέρουν την απόδοση ορισμένων μαθηματικών λειτουργιών. Για να εκτελέσετε τη δοκιμή, συγχρονίστε το αποθετήριο και εκτελέστε:

cargo test-sbf -- --nocapture --test-threads=1

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

u64 f32
Multiply 8 176
Divide 9 219

Στατικά εγγράψιμα δεδομένα

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

Διαίρεση προσημασμένων αριθμών

Το σύνολο εντολών SBF δεν υποστηρίζει διαίρεση προσημασμένων αριθμών.

Is this page helpful?