Solana DokumentationProgramme entwickeln

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

Inhaltsverzeichnis

Seite bearbeiten