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 üzerinde 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ığı ve aynı zamanda deterministik olması gerektiği için 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
- Hesaplama açısından pahalı olduğu için dize biçimlendirmeden kaçınılmalıdır.
println!
,print!
için destek yok, 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çesini aşmak, 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 sınırını aştığında,
CallDepthExceeded
hatası alacaktır.
CPI çağrı derinliği - CallDepth
hatası
Programlar arası çağrılar, programların diğer programları doğrudan çağırmasına
izin verir, ancak derinlik şu anda 4
ile sınırlıdır.
Bir program izin verilen programlar arası ç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ş bir 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, depoyu 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 global 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?