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żyjmsg!
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 f32Multiply 8 176Divide 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?