Beperkingen
Het ontwikkelen van programma's op de Solana blockchain heeft enkele inherente beperkingen. Hieronder staat een lijst met veelvoorkomende beperkingen waar je tegenaan kunt lopen.
Rust bibliotheken
Aangezien Rust-gebaseerde onchain programma's deterministisch moeten zijn terwijl ze in een omgeving met beperkte middelen en single-threaded draaien, hebben ze enkele beperkingen wat betreft verschillende bibliotheken.
Onchain Rust-programma's ondersteunen het grootste deel van Rust's libstd, libcore en liballoc, evenals veel externe crates.
Er zijn enkele beperkingen omdat deze programma's draaien in een omgeving met beperkte middelen en single-threaded, en omdat ze deterministisch moeten zijn:
- Geen toegang tot:
rand
std::fs
std::net
std::future
std::process
std::sync
std::task
std::thread
std::time
- Beperkte toegang tot:
std::hash
std::os
- Bincode is extreem rekenintensief, zowel in cycli als in aanroepdiepte, en moet worden vermeden
- String-formattering moet worden vermeden omdat het ook rekenintensief is
- Geen ondersteuning voor
println!
,print!
, gebruik in plaats daarvan demsg!
macro. - De runtime legt een limiet op aan het aantal instructies dat een programma kan uitvoeren tijdens de verwerking van één instructie. Zie rekenbudget voor meer informatie.
Rekenbudget
Om misbruik van de rekenbronnen van de blockchain te voorkomen, krijgt elke transactie een rekenbudget toegewezen. Het overschrijden van dit rekenbudget zal resulteren in het mislukken van de transactie.
Zie de documentatie over rekenkundige beperkingen voor meer specifieke details.
Aanroepstapeldiepte - CallDepthExceeded
fout
Solana-programma's zijn beperkt om snel te draaien, en om dit te faciliteren is de aanroepstapel van het programma beperkt tot een maximale diepte van 64 frames.
Wanneer een programma de toegestane limiet voor de aanroepstackdiepte
overschrijdt, ontvangt het de CallDepthExceeded
fout.
CPI aanroepdiepte - CallDepth
fout
Cross-program invocaties stellen programma's in staat om andere programma's
direct aan te roepen, maar de diepte is momenteel beperkt tot 4
.
Wanneer een programma de toegestane
cross-program invocation aanroepdiepte overschrijdt, ontvangt
het een CallDepth
fout
Float Rust types ondersteuning
Programma's ondersteunen een beperkte subset van Rust's float-operaties. Als een programma probeert een float-operatie te gebruiken die niet wordt ondersteund, zal de runtime een onopgeloste symbool fout rapporteren.
Float-operaties worden uitgevoerd via softwarebibliotheken, specifiek LLVM's float built-ins. Vanwege de software-emulatie verbruiken ze meer compute-eenheden dan integer-operaties. In het algemeen worden fixed point-operaties aanbevolen waar mogelijk.
De Solana Program Library math tests rapporteren de prestaties van sommige rekenkundige operaties. Om de test uit te voeren, synchroniseer de repo en voer uit:
cargo test-sbf -- --nocapture --test-threads=1
Recente resultaten tonen aan dat float-operaties meer instructies vereisen in vergelijking met integer-equivalenten. Fixed point-implementaties kunnen variëren maar zullen ook minder zijn dan de float-equivalenten:
u64 f32Multiply 8 176Divide 9 219
Statische schrijfbare gegevens
Programma shared objects ondersteunen geen schrijfbare gedeelde gegevens. Programma's worden gedeeld tussen meerdere parallelle uitvoeringen met dezelfde gedeelde alleen-lezen code en gegevens. Dit betekent dat ontwikkelaars geen statische schrijfbare of globale variabelen in programma's moeten opnemen. In de toekomst zou een copy-on-write mechanisme kunnen worden toegevoegd om schrijfbare gegevens te ondersteunen.
Signed division
De SBF instructieset ondersteunt geen signed division.
Is this page helpful?