Limitations
Le développement de programmes sur la blockchain Solana présente 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, tout en devant rester 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 devrait être évité car il est également coûteux en ressources 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. Consultez budget de calcul pour plus d'informations.
Budget de calcul
Pour prévenir l'abus des ressources computationnelles de la blockchain, chaque transaction se voit allouer un budget de calcul. Dépasser ce budget de calcul entraînera l'échec de la transaction.
Consultez la documentation sur les contraintes computationnelles pour des détails plus spécifiques.
Profondeur de pile d'appels - erreur CallDepthExceeded
Les programmes Solana sont contraints de 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 de pile d'appels autorisée,
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
Support des types Rust à virgule flottante
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 à virgule flottante de LLVM. En raison de l'émulation logicielle, elles consomment plus d'unités de calcul que les opérations sur entiers. En général, les opérations à point fixe sont recommandées dans la mesure du possible.
Les tests de mathématiques de la Solana Program Library rapporteront les performances de certaines opérations mathématiques. Pour exécuter le test, synchronisez le dépôt et exécutez :
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 partagés 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?