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 ü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 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ç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 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 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?

İçindekiler

Sayfayı Düzenle