Dokumentasi SolanaMengembangkan Program

Batasan

Pengembangan program pada blockchain Solana memiliki beberapa batasan yang melekat. Berikut adalah daftar batasan umum yang mungkin Anda temui.

Pustaka Rust

Karena program onchain berbasis Rust harus berjalan secara deterministik dalam lingkungan yang memiliki sumber daya terbatas dan single-threaded, program-program tersebut memiliki beberapa batasan pada berbagai pustaka.

Program Rust on-chain mendukung sebagian besar libstd, libcore, dan liballoc milik Rust, serta banyak crate pihak ketiga.

Ada beberapa batasan karena program-program ini berjalan di lingkungan yang memiliki sumber daya terbatas dan single-threaded, serta harus bersifat deterministik:

  • Tidak ada akses ke
    • rand
    • std::fs
    • std::net
    • std::future
    • std::process
    • std::sync
    • std::task
    • std::thread
    • std::time
  • Akses terbatas ke:
    • std::hash
    • std::os
  • Bincode sangat mahal secara komputasi baik dalam siklus maupun kedalaman panggilan dan sebaiknya dihindari
  • Pemformatan string sebaiknya dihindari karena juga mahal secara komputasi
  • Tidak ada dukungan untuk println!, print!, gunakan makro msg! sebagai gantinya.
  • Runtime memberlakukan batasan jumlah instruksi yang dapat dieksekusi program selama pemrosesan satu instruksi. Lihat anggaran komputasi untuk informasi lebih lanjut.

Anggaran komputasi

Untuk mencegah penyalahgunaan sumber daya komputasi blockchain, setiap transaksi dialokasikan anggaran komputasi. Melebihi anggaran komputasi ini akan menyebabkan transaksi gagal.

Lihat dokumentasi batasan komputasi untuk detail yang lebih spesifik.

Kedalaman call stack - error CallDepthExceeded

Program Solana dibatasi untuk berjalan dengan cepat, dan untuk memfasilitasi ini, call stack program dibatasi hingga kedalaman maksimum 64 frame.

Ketika program melebihi batas kedalaman call stack yang diizinkan, program tersebut akan menerima error CallDepthExceeded.

Kedalaman panggilan CPI - error CallDepth

Cross-program invocations memungkinkan program untuk memanggil program lain secara langsung, tetapi kedalaman saat ini dibatasi hingga 4.

Ketika program melebihi kedalaman panggilan cross-program invocation yang diizinkan, program tersebut akan menerima error CallDepth

Dukungan tipe Float Rust

Program mendukung subset terbatas dari operasi float Rust. Jika program mencoba menggunakan operasi float yang tidak didukung, runtime akan melaporkan error simbol yang tidak terselesaikan.

Operasi float dilakukan melalui library perangkat lunak, khususnya float built-ins dari LLVM. Karena diemulasikan oleh perangkat lunak, operasi ini mengkonsumsi lebih banyak unit komputasi daripada operasi integer. Secara umum, operasi fixed point direkomendasikan jika memungkinkan.

Tes Solana Program Library math akan melaporkan kinerja beberapa operasi matematika. Untuk menjalankan tes, sinkronkan repo dan jalankan:

cargo test-sbf -- --nocapture --test-threads=1

Hasil terbaru menunjukkan operasi float membutuhkan lebih banyak instruksi dibandingkan dengan operasi integer yang setara. Implementasi fixed point mungkin bervariasi tetapi juga akan lebih sedikit dibandingkan dengan operasi float yang setara:

u64 f32
Multiply 8 176
Divide 9 219

Data statis yang dapat ditulis

Objek bersama program tidak mendukung data bersama yang dapat ditulis. Program dibagikan antara beberapa eksekusi paralel menggunakan kode dan data read-only yang sama. Ini berarti bahwa pengembang tidak boleh menyertakan variabel statis yang dapat ditulis atau variabel global dalam program. Di masa depan, mekanisme copy-on-write dapat ditambahkan untuk mendukung data yang dapat ditulis.

Pembagian bertanda

Set instruksi SBF tidak mendukung pembagian bertanda.

Is this page helpful?

Daftar Isi

Edit Halaman