Kısıtlamalar
Solana blok zincirinde program geliştirmenin bazı doğal kısıtlamaları vardır. Aşağıda, karşılaşabileceğiniz yaygın kısıtlamaların bir listesi bulunmaktadır.
Rust kütüphaneleri
Rust tabanlı zincir üstü programlar, kaynak kısıtlı, tek iş parçacıklı bir ortamda çalışırken deterministik olması gerektiğinden, çeşitli kütüphaneler konusunda bazı kısıtlamalara sahiptir.
Zincir üstü Rust programları, Rust'ın libstd, libcore ve liballoc kütüphanelerinin çoğunu ve ayrıca birçok 3. taraf paketi destekler.
Bu programlar kaynak kısıtlı, tek iş parçacıklı bir ortamda çalıştığından ve aynı zamanda deterministik olması gerektiğinden bazı kısıtlamalar vardır:
- Erişim yok:
rand
std::fs
std::net
std::future
std::process
std::sync
std::task
std::thread
std::time
- Sınırlı erişim:
std::hash
std::os
- Bincode hem döngüler hem de çağrı derinliği açısından son derece hesaplama yoğundur ve kaçınılmalıdır
- String biçimlendirmesi de hesaplama açısından maliyetli olduğundan kaçınılmalıdır.
println!
,print!
için destek yoktur, bunun yerinemsg!
makrosunu kullanın.- Çalışma zamanı, bir talimatın işlenmesi sırasında bir programın yürütebileceği talimat sayısına bir sınır uygular. Daha fazla bilgi için hesaplama bütçesi bölümüne bakın.
Hesaplama bütçesi
Blok zincirinin hesaplama kaynaklarının kötüye kullanılmasını önlemek için, her işleme bir hesaplama bütçesi tahsis edilir. Bu hesaplama bütçesinin aşılması, işlemin başarısız olmasına neden olacaktır.
Daha spesifik ayrıntılar için hesaplama kısıtlamaları dokümantasyonuna bakın.
Çağrı yığını derinliği - CallDepthExceeded
hatası
Solana programları hızlı çalışacak şekilde kısıtlanmıştır ve bunu kolaylaştırmak için programın çağrı yığını maksimum 64 çerçeve derinliğiyle sınırlıdır.
Bir program izin verilen çağrı yığını derinlik limitini aştığında,
CallDepthExceeded
hatası alacaktır.
CPI çağrı derinliği - CallDepth
hatası
Cross Program Invocation, programların diğer programları doğrudan çağırmasına
olanak tanır, ancak derinlik şu anda 4
ile sınırlıdır.
Bir program izin verilen
cross-program invocation çağrı derinliğini aştığında, bir
CallDepth
hatası alacaktır
Float Rust türleri desteği
Programlar, Rust'ın float işlemlerinin sınırlı bir alt kümesini destekler. Eğer bir program desteklenmeyen bir float işlemi kullanmaya çalışırsa, çalışma zamanı çözümlenmemiş sembol hatası bildirecektir.
Float işlemleri, özellikle LLVM'nin float built-in'leri aracılığıyla yazılım kütüphaneleri tarafından gerçekleştirilir. Yazılım emülasyonu nedeniyle, tamsayı işlemlerinden daha fazla hesaplama birimi tüketirler. Genel olarak, mümkün olduğunda sabit noktalı işlemler önerilir.
Solana Program Library math testleri, bazı matematik işlemlerinin performansını raporlayacaktır. Testi çalıştırmak için, repo'yu senkronize edin ve şunu çalıştırın:
cargo test-sbf -- --nocapture --test-threads=1
Son sonuçlar, float işlemlerinin tamsayı eşdeğerlerine kıyasla daha fazla talimat gerektirdiğini göstermektedir. Sabit noktalı uygulamalar değişebilir ancak yine de float eşdeğerlerinden daha az olacaktır:
u64 f32Multiply 8 176Divide 9 219
Statik yazılabilir veri
Program paylaşılan nesneleri, yazılabilir paylaşılan verileri desteklemez. Programlar, aynı paylaşılan salt okunur kod ve veriyi kullanarak birden fazla paralel yürütme arasında paylaşılır. Bu, geliştiricilerin programlara herhangi bir statik yazılabilir veya küresel değişken dahil etmemesi gerektiği anlamına gelir. Gelecekte, yazılabilir verileri desteklemek için bir kopyalama-yazma mekanizması eklenebilir.
İşaretli bölme
SBF komut seti, işaretli bölmeyi desteklemez.
Is this page helpful?