Einschränkungen
Die Entwicklung von Programmen auf der Solana-Blockchain hat einige inhärente Einschränkungen. Nachfolgend finden Sie eine Liste häufiger Einschränkungen, auf die Sie stoßen könnten.
Rust-Bibliotheken
Da Rust-basierte Onchain-Programme deterministisch in einer ressourcenbeschränkten, single-threaded Umgebung ausgeführt werden müssen, gibt es einige Einschränkungen bei verschiedenen Bibliotheken.
Onchain-Rust-Programme unterstützen den größten Teil von Rusts libstd, libcore und liballoc sowie viele Bibliotheken von Drittanbietern.
Es gibt einige Einschränkungen, da diese Programme in einer ressourcenbeschränkten, single-threaded Umgebung ausgeführt werden und deterministisch sein müssen:
- Kein Zugriff auf
rand
std::fs
std::net
std::future
std::process
std::sync
std::task
std::thread
std::time
- Eingeschränkter Zugriff auf:
std::hash
std::os
- Bincode ist sowohl in Bezug auf Zyklen als auch auf Aufruftiefe extrem rechenintensiv und sollte vermieden werden
- String-Formatierung sollte vermieden werden, da sie ebenfalls rechenintensiv ist
- Keine Unterstützung für
println!
,print!
, verwenden Sie stattdessen dasmsg!
Makro. - Die Laufzeitumgebung erzwingt eine Begrenzung der Anzahl von Anweisungen, die ein Programm während der Verarbeitung einer Anweisung ausführen kann. Weitere Informationen finden Sie unter Rechenbudget.
Rechenbudget
Um Missbrauch der Rechenressourcen der Blockchain zu verhindern, wird jeder Transaktion ein Rechenbudget zugewiesen. Wenn dieses Rechenbudget überschritten wird, schlägt die Transaktion fehl.
Weitere spezifische Details finden Sie in der Dokumentation zu Recheneinschränkungen.
Aufrufstacktiefe - CallDepthExceeded
Fehler
Solana-Programme sind darauf ausgelegt, schnell zu laufen, und um dies zu erleichtern, ist der Aufrufstack des Programms auf eine maximale Tiefe von 64 Frames begrenzt.
Wenn ein Programm die zulässige Grenze der Aufrufstacktiefe überschreitet,
erhält es den CallDepthExceeded
Fehler.
CPI-Aufruftiefe - CallDepth
Fehler
Cross Program Invocation ermöglicht Programmen, andere Programme direkt
aufzurufen, aber die Tiefe ist derzeit auf 4
begrenzt.
Wenn ein Programm die zulässige
Cross Program Invocation-Aufruftiefe überschreitet, erhält es
einen CallDepth
Fehler
Unterstützung für Float-Rust-Typen
Programme unterstützen eine begrenzte Teilmenge von Rusts Float-Operationen. Wenn ein Programm versucht, eine Float-Operation zu verwenden, die nicht unterstützt wird, meldet die Laufzeit einen Fehler wegen eines nicht aufgelösten Symbols.
Float-Operationen werden über Software-Bibliotheken ausgeführt, insbesondere über LLVMs Float Built-ins. Aufgrund der Software-Emulation verbrauchen sie mehr Recheneinheiten als Integer-Operationen. Im Allgemeinen werden Festkomma-Operationen empfohlen, wo möglich.
Die Solana Program Library Math Tests berichten über die Leistung einiger mathematischer Operationen. Um den Test auszuführen, synchronisiere das Repo und führe aus:
cargo test-sbf -- --nocapture --test-threads=1
Aktuelle Ergebnisse zeigen, dass Float-Operationen im Vergleich zu Integer-Äquivalenten mehr Anweisungen benötigen. Festkomma-Implementierungen können variieren, werden aber auch weniger als die Float-Äquivalente sein:
u64 f32Multiply 8 176Divide 9 219
Statische beschreibbare Daten
Programm-Shared-Objects unterstützen keine beschreibbaren gemeinsamen Daten. Programme werden zwischen mehreren parallelen Ausführungen mit demselben gemeinsam genutzten schreibgeschützten Code und Daten geteilt. Dies bedeutet, dass Entwickler keine statischen beschreibbaren oder globalen Variablen in Programmen einschließen sollten. In Zukunft könnte ein Copy-on-Write-Mechanismus hinzugefügt werden, um beschreibbare Daten zu unterstützen.
Vorzeichenbehaftete Division
Der SBF-Befehlssatz unterstützt keine vorzeichenbehaftete Division.
Is this page helpful?