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 makromsg!
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 f32Multiply 8 176Divide 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?