Documentazione SolanaSviluppo di programmi

Limitazioni

Lo sviluppo di programmi sulla blockchain Solana presenta alcune limitazioni intrinseche. Di seguito è riportato un elenco delle limitazioni comuni in cui potresti imbatterti.

Librerie Rust

Poiché i programmi onchain basati su Rust devono essere deterministici mentre vengono eseguiti in un ambiente a thread singolo con risorse limitate, presentano alcune limitazioni relative a varie librerie.

I programmi Rust onchain supportano la maggior parte di libstd, libcore e liballoc di Rust, così come molti crate di terze parti.

Ci sono alcune limitazioni poiché questi programmi vengono eseguiti in un ambiente a thread singolo con risorse limitate, oltre a dover essere deterministici:

  • Nessun accesso a
    • rand
    • std::fs
    • std::net
    • std::future
    • std::process
    • std::sync
    • std::task
    • std::thread
    • std::time
  • Accesso limitato a:
    • std::hash
    • std::os
  • Bincode è estremamente costoso dal punto di vista computazionale sia in termini di cicli che di profondità di chiamata e dovrebbe essere evitato
  • La formattazione delle stringhe dovrebbe essere evitata poiché è anch'essa computazionalmente costosa
  • Nessun supporto per println!, print!, usa invece la macro msg!
  • Il runtime impone un limite al numero di istruzioni che un programma può eseguire durante l'elaborazione di un'istruzione. Vedi budget di calcolo per maggiori informazioni.

Budget di calcolo

Per prevenire l'abuso delle risorse computazionali della blockchain, a ogni transazione viene allocato un budget di calcolo. Il superamento di questo budget di calcolo comporterà il fallimento della transazione.

Consulta la documentazione sui vincoli computazionali per dettagli più specifici.

Profondità dello stack di chiamate - errore CallDepthExceeded

I programmi Solana sono vincolati a essere eseguiti rapidamente e, per facilitare questo, lo stack di chiamate del programma è limitato a una profondità massima di 64 frame.

Quando un programma supera il limite consentito di profondità dello stack di chiamate, riceverà l'errore CallDepthExceeded.

Profondità di chiamata CPI - errore CallDepth

Le Cross Program Invocation permettono ai programmi di invocare direttamente altri programmi, ma la profondità è attualmente limitata a 4.

Quando un programma supera la profondità consentita di chiamate cross-program, riceverà un errore CallDepth

Supporto per i tipi float di Rust

I programmi supportano un sottoinsieme limitato di operazioni float di Rust. Se un programma tenta di utilizzare un'operazione float non supportata, il runtime segnalerà un errore di simbolo non risolto.

Le operazioni float vengono eseguite tramite librerie software, in particolare le funzioni integrate di LLVM per i float. Essendo emulate via software, consumano più unità di calcolo rispetto alle operazioni con numeri interi. In generale, si consiglia di utilizzare operazioni a punto fisso dove possibile.

I test della libreria matematica di Solana Program Library riporteranno le prestazioni di alcune operazioni matematiche. Per eseguire il test, sincronizza il repository ed esegui:

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

I risultati recenti mostrano che le operazioni float richiedono più istruzioni rispetto agli equivalenti con numeri interi. Le implementazioni a punto fisso possono variare ma saranno comunque meno dispendiose rispetto agli equivalenti float:

u64 f32
Multiply 8 176
Divide 9 219

Dati statici scrivibili

Gli oggetti condivisi dei programmi non supportano dati condivisi scrivibili. I programmi sono condivisi tra più esecuzioni parallele utilizzando lo stesso codice e dati condivisi in sola lettura. Questo significa che gli sviluppatori non dovrebbero includere variabili statiche scrivibili o globali nei programmi. In futuro potrebbe essere aggiunto un meccanismo di copy-on-write per supportare dati scrivibili.

Divisione con segno

Il set di istruzioni SBF non supporta la divisione con segno.

Is this page helpful?

Indice

Modifica Pagina