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

Περιορισμοί

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

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

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

Τα προγράμματα Rust που εκτελούνται στην αλυσίδα υποστηρίζουν τα περισσότερα από τα 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

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

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

Υποστήριξη τύπων κινητής υποδιαστολής της Rust

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

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

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

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

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

u64 f32
Multiply 8 176
Divide 9 219

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

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

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

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

Is this page helpful?