Giới hạn
Việc phát triển chương trình trên blockchain Solana có một số giới hạn vốn có liên quan đến chúng. Dưới đây là danh sách các giới hạn phổ biến mà bạn có thể gặp phải.
Thư viện Rust
Vì các chương trình onchain dựa trên Rust phải chạy một cách xác định trong môi trường đơn luồng với tài nguyên hạn chế, chúng có một số giới hạn về các thư viện khác nhau.
Các chương trình Rust trên chuỗi hỗ trợ hầu hết libstd, libcore và liballoc của Rust, cũng như nhiều crate của bên thứ 3.
Có một số giới hạn vì các chương trình này chạy trong môi trường đơn luồng với tài nguyên hạn chế, đồng thời phải mang tính xác định:
- Không có quyền truy cập vào
rand
std::fs
std::net
std::future
std::process
std::sync
std::task
std::thread
std::time
- Truy cập hạn chế vào:
std::hash
std::os
- Bincode cực kỳ tốn kém về mặt tính toán cả về chu kỳ và độ sâu cuộc gọi và nên tránh sử dụng
- Định dạng chuỗi nên được tránh vì nó cũng tốn kém về mặt tính toán.
- Không hỗ trợ
println!
,print!
, hãy sử dụng macromsg!
thay thế. - Môi trường runtime áp đặt giới hạn về số lượng chỉ thị mà một chương trình có thể thực thi trong quá trình xử lý một chỉ thị. Xem ngân sách tính toán để biết thêm thông tin.
Ngân sách tính toán
Để ngăn chặn việc lạm dụng tài nguyên tính toán của blockchain, mỗi giao dịch được phân bổ một ngân sách tính toán. Vượt quá ngân sách tính toán này sẽ dẫn đến giao dịch thất bại.
Xem tài liệu về ràng buộc tính toán để biết thêm chi tiết cụ thể.
Độ sâu ngăn xếp cuộc gọi - lỗi CallDepthExceeded
Các chương trình Solana bị ràng buộc phải chạy nhanh, và để tạo điều kiện cho điều này, ngăn xếp cuộc gọi của chương trình bị giới hạn ở độ sâu tối đa là 64 khung.
Khi một chương trình vượt quá giới hạn độ sâu ngăn xếp cuộc gọi cho phép, nó sẽ
nhận được lỗi CallDepthExceeded
.
Độ sâu cuộc gọi CPI - lỗi CallDepth
Cross Program Invocation cho phép các chương trình gọi trực tiếp các chương
trình khác, nhưng độ sâu hiện tại bị giới hạn ở mức 4
.
Khi một chương trình vượt quá độ sâu cuộc gọi
cross-program invocation cho phép, nó sẽ nhận được lỗi
CallDepth
Hỗ trợ kiểu dữ liệu Float trong Rust
Các chương trình hỗ trợ một tập con giới hạn các phép toán float của Rust. Nếu một chương trình cố gắng sử dụng phép toán float không được hỗ trợ, runtime sẽ báo cáo lỗi ký hiệu không được giải quyết.
Các phép toán float được thực hiện thông qua các thư viện phần mềm, cụ thể là các hàm built-in float của LLVM. Do được mô phỏng bằng phần mềm, chúng tiêu thụ nhiều đơn vị tính toán hơn các phép toán số nguyên. Nhìn chung, nên sử dụng các phép toán điểm cố định (fixed point) khi có thể.
Các bài kiểm tra Solana Program Library math sẽ báo cáo hiệu suất của một số phép toán. Để chạy bài kiểm tra, đồng bộ repo và chạy:
cargo test-sbf -- --nocapture --test-threads=1
Kết quả gần đây cho thấy các phép toán float tốn nhiều lệnh hơn so với các phép toán tương đương trên số nguyên. Các triển khai điểm cố định có thể khác nhau nhưng cũng sẽ ít hơn so với các phép toán tương đương trên số float:
u64 f32Multiply 8 176Divide 9 219
Dữ liệu tĩnh có thể ghi
Các đối tượng chia sẻ của chương trình không hỗ trợ dữ liệu chia sẻ có thể ghi. Các chương trình được chia sẻ giữa nhiều lần thực thi song song sử dụng cùng mã và dữ liệu chỉ đọc được chia sẻ. Điều này có nghĩa là các nhà phát triển không nên bao gồm bất kỳ biến tĩnh có thể ghi hoặc biến toàn cục nào trong chương trình. Trong tương lai, cơ chế copy-on-write có thể được thêm vào để hỗ trợ dữ liệu có thể ghi.
Phép chia có dấu
Bộ lệnh SBF không hỗ trợ phép chia có dấu.
Is this page helpful?