Limitations
Le développement de programmes sur la blockchain Solana comporte certaines limitations inhérentes. Voici une liste des limitations courantes que vous pourriez rencontrer.
Bibliothèques Rust
Étant donné que les programmes onchain basés sur Rust doivent être déterministes tout en s'exécutant dans un environnement mono-thread aux ressources limitées, ils présentent certaines restrictions concernant diverses bibliothèques.
Les programmes Rust onchain prennent en charge la plupart des fonctionnalités de libstd, libcore et liballoc de Rust, ainsi que de nombreux crates tiers.
Il existe certaines limitations car ces programmes s'exécutent dans un environnement mono-thread aux ressources limitées, et doivent être déterministes :
- Pas d'accès à
rand
std::fs
std::net
std::future
std::process
std::sync
std::task
std::thread
std::time
- Accès limité à :
std::hash
std::os
- Bincode est extrêmement coûteux en termes de cycles de calcul et de profondeur d'appel et devrait être évité
- Le formatage de chaînes de caractères devrait être évité car il est également coûteux en termes de calcul
- Pas de support pour
println!
,print!
, utilisez plutôt la macromsg!
- Le runtime impose une limite sur le nombre d'instructions qu'un programme peut exécuter lors du traitement d'une instruction. Voir budget de calcul pour plus d'informations.
Budget de calcul
Pour prévenir l'abus des ressources de calcul de la blockchain, chaque transaction se voit attribuer un budget de calcul. Dépasser ce budget de calcul entraînera l'échec de la transaction.
Consultez la documentation sur les contraintes de calcul pour des détails plus spécifiques.
Profondeur de pile d'appels - erreur CallDepthExceeded
Les programmes Solana sont conçus pour s'exécuter rapidement, et pour faciliter cela, la pile d'appels du programme est limitée à une profondeur maximale de 64 frames.
Lorsqu'un programme dépasse la limite de profondeur autorisée pour la pile
d'appels, il recevra l'erreur CallDepthExceeded
.
Profondeur d'appel CPI - erreur CallDepth
Les invocations inter-programmes permettent aux programmes d'invoquer
directement d'autres programmes, mais la profondeur est actuellement limitée à
4
.
Lorsqu'un programme dépasse la profondeur d'appel autorisée pour
l'invocation inter-programmes, il recevra une erreur
CallDepth
Prise en charge des types float en Rust
Les programmes prennent en charge un sous-ensemble limité des opérations à virgule flottante de Rust. Si un programme tente d'utiliser une opération à virgule flottante non prise en charge, l'environnement d'exécution signalera une erreur de symbole non résolu.
Les opérations à virgule flottante sont effectuées via des bibliothèques logicielles, spécifiquement les fonctions intégrées de LLVM pour les flottants. En raison de l'émulation logicielle, elles consomment plus d'unités de calcul que les opérations sur les entiers. En général, il est recommandé d'utiliser des opérations à point fixe lorsque c'est possible.
Les tests de mathématiques de la Solana Program Library indiquent les performances de certaines opérations mathématiques. Pour exécuter le test, synchronisez le dépôt et lancez :
cargo test-sbf -- --nocapture --test-threads=1
Les résultats récents montrent que les opérations à virgule flottante nécessitent plus d'instructions par rapport aux équivalents entiers. Les implémentations à point fixe peuvent varier mais seront également moins coûteuses que les équivalents à virgule flottante :
u64 f32Multiply 8 176Divide 9 219
Données statiques modifiables
Les objets partagés des programmes ne prennent pas en charge les données partagées modifiables. Les programmes sont partagés entre plusieurs exécutions parallèles utilisant le même code et les mêmes données en lecture seule. Cela signifie que les développeurs ne doivent pas inclure de variables statiques modifiables ou globales dans les programmes. À l'avenir, un mécanisme de copie à l'écriture pourrait être ajouté pour prendre en charge les données modifiables.
Division signée
Le jeu d'instructions SBF ne prend pas en charge la division signée.
Is this page helpful?