Solana documentatieProgramma's ontwikkelen

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 de msg! 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 f32
Multiply 8 176
Divide 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?

Inhoudsopgave

Pagina Bewerken