Solana DokümantasyonuProgram Geliştirme

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

İçindekiler

Sayfayı Düzenle