Dokumentacja SolanaTworzenie programów

Ograniczenia

Tworzenie programów na blockchainie Solana wiąże się z pewnymi wrodzonymi ograniczeniami. Poniżej znajduje się lista typowych ograniczeń, na które możesz natrafić.

Biblioteki Rust

Ponieważ programy on-chain oparte na Rust muszą działać deterministycznie w środowisku z ograniczonymi zasobami i jednowątkowym, mają pewne ograniczenia dotyczące różnych bibliotek.

Programy Rust działające on-chain obsługują większość bibliotek Rust, takich jak libstd, libcore i liballoc, a także wiele zewnętrznych bibliotek (crates).

Istnieją jednak pewne ograniczenia, ponieważ te programy działają w środowisku z ograniczonymi zasobami, jednowątkowym i muszą być deterministyczne:

  • Brak dostępu do:
    • rand
    • std::fs
    • std::net
    • std::future
    • std::process
    • std::sync
    • std::task
    • std::thread
    • std::time
  • Ograniczony dostęp do:
    • std::hash
    • std::os
  • Bincode jest niezwykle kosztowny obliczeniowo zarówno pod względem cykli, jak i głębokości wywołań, dlatego należy go unikać.
  • Formatowanie ciągów znaków również należy unikać, ponieważ jest kosztowne obliczeniowo.
  • Brak wsparcia dla println!, print!, zamiast tego użyj msg! makra.
  • Środowisko wykonawcze narzuca limit liczby instrukcji, które program może wykonać podczas przetwarzania jednej instrukcji. Zobacz budżet obliczeniowy po więcej informacji.

Budżet obliczeniowy

Aby zapobiec nadużywaniu zasobów obliczeniowych blockchaina, każda transakcja ma przydzielony budżet obliczeniowy. Przekroczenie tego budżetu spowoduje niepowodzenie transakcji.

Zobacz dokumentację ograniczeń obliczeniowych po bardziej szczegółowe informacje.

Głębokość stosu wywołań - błąd CallDepthExceeded

Programy Solana są ograniczone do szybkiego działania, a aby to umożliwić, głębokość stosu wywołań programu jest ograniczona do maksymalnie 64 ramek.

Gdy program przekroczy dozwolony limit głębokości stosu wywołań, otrzyma błąd CallDepthExceeded.

Głębokość wywołań CPI - błąd CallDepth

Wywołania międzyprogramowe pozwalają programom bezpośrednio wywoływać inne programy, ale głębokość jest obecnie ograniczona do 4.

Gdy program przekroczy dozwoloną głębokość wywołań międzyprogramowych, otrzyma błąd CallDepth.

Obsługa typów zmiennoprzecinkowych w Rust

Programy obsługują ograniczony podzbiór operacji zmiennoprzecinkowych w Rust. Jeśli program spróbuje użyć operacji zmiennoprzecinkowej, która nie jest obsługiwana, środowisko wykonawcze zgłosi błąd nierozwiązanego symbolu.

Operacje zmiennoprzecinkowe są wykonywane za pomocą bibliotek programowych, konkretnie wbudowanych funkcji zmiennoprzecinkowych LLVM. Ze względu na emulację programową zużywają one więcej jednostek obliczeniowych niż operacje na liczbach całkowitych. Ogólnie zaleca się stosowanie operacji na liczbach stałoprzecinkowych, jeśli to możliwe.

Testy Solana Program Library math raportują wydajność niektórych operacji matematycznych. Aby uruchomić test, zsynchronizuj repozytorium i uruchom:

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

Najnowsze wyniki pokazują, że operacje zmiennoprzecinkowe wymagają więcej instrukcji w porównaniu do ich odpowiedników na liczbach całkowitych. Implementacje stałoprzecinkowe mogą się różnić, ale również będą mniej wymagające niż odpowiedniki zmiennoprzecinkowe:

u64 f32
Multiply 8 176
Divide 9 219

Statyczne dane zapisywalne

Udostępnione obiekty programów nie obsługują zapisywalnych danych współdzielonych. Programy są współdzielone między wieloma równoległymi wykonaniami, korzystając z tych samych współdzielonych danych i kodu tylko do odczytu. Oznacza to, że deweloperzy nie powinni uwzględniać żadnych statycznych zmiennych zapisywalnych ani globalnych w programach. W przyszłości może zostać dodany mechanizm kopiowania przy zapisie, aby obsługiwać zapisywalne dane.

Dzielenie ze znakiem

Zestaw instrukcji SBF nie obsługuje dzielenia ze znakiem.

Is this page helpful?

Spis treści

Edytuj stronę