Περιορισμοί
Η ανάπτυξη προγραμμάτων στο 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 f32Multiply 8 176Divide 9 219
Στατικά εγγράψιμα δεδομένα
Τα κοινόχρηστα αντικείμενα προγραμμάτων δεν υποστηρίζουν εγγράψιμα κοινόχρηστα δεδομένα. Τα προγράμματα διαμοιράζονται μεταξύ πολλαπλών παράλληλων εκτελέσεων χρησιμοποιώντας τον ίδιο κοινόχρηστο κώδικα και δεδομένα μόνο για ανάγνωση. Αυτό σημαίνει ότι οι προγραμματιστές δεν πρέπει να συμπεριλαμβάνουν στατικές εγγράψιμες ή καθολικές μεταβλητές στα προγράμματα. Στο μέλλον θα μπορούσε να προστεθεί ένας μηχανισμός αντιγραφής κατά την εγγραφή για την υποστήριξη εγγράψιμων δεδομένων.
Διαίρεση προσημασμένων αριθμών
Το σύνολο εντολών SBF δεν υποστηρίζει διαίρεση προσημασμένων αριθμών.
Is this page helpful?