限制
在 Solana 区块链上开发程序存在一些固有的限制。以下是您可能会遇到的一些常见限制的列表。
Rust 库
由于基于 Rust 的链上程序必须在资源受限的单线程环境中运行,并且需要保持确定性,因此它们在使用某些库时存在一些限制。
链上 Rust 程序支持大部分 Rust 的 libstd、libcore 和 liballoc,以及许多第三方 crates。
由于这些程序运行在资源受限的单线程环境中,并且需要保持确定性,因此存在以下限制:
- 无法访问:
rand
std::fs
std::net
std::future
std::process
std::sync
std::task
std::thread
std::time
- 限制访问:
std::hash
std::os
- Bincode 在计算周期和调用深度上非常昂贵,应尽量避免使用
- 字符串格式化也应避免,因为它同样计算成本高。
- 不支持
println!
和print!
,请改用msg!
宏。 - 运行时对程序在处理一条指令时可以执行的指令数量施加了限制。更多信息请参阅 计算预算。
计算预算
为了防止滥用区块链的计算资源,每笔交易都会分配一个 计算预算。超出此计算预算将导致交易失败。
有关更具体的细节,请参阅 计算约束 文档。
调用栈深度 - CallDepthExceeded
错误
Solana 程序受限于快速运行,为了实现这一点,程序的调用栈深度被限制为最多 64 帧。
当程序超出允许的调用堆栈深度限制时,它将收到 CallDepthExceeded
错误。
CPI 调用深度 - CallDepth
错误
跨程序调用允许程序直接调用其他程序,但目前深度受到限制,为 4
。
当程序超出允许的 跨程序调用深度时,它将收到 CallDepth
错误。
支持的浮点 Rust 类型
程序支持 Rust 浮点操作的有限子集。如果程序尝试使用不支持的浮点操作,运行时将报告未解析的符号错误。
浮点操作通过软件库执行,特别是 LLVM 的浮点内置函数。由于是软件模拟,它们比整数操作消耗更多的计算单元。一般来说,建议尽可能使用定点操作。
Solana 程序库数学 测试将报告一些数学操作的性能。要运行测试,请同步代码库并运行:
cargo test-sbf -- --nocapture --test-threads=1
最近的结果显示,浮点操作比整数等效操作需要更多的指令。定点实现可能有所不同,但也会少于浮点等效操作:
u64 f32Multiply 8 176Divide 9 219
静态可写数据
程序共享对象不支持可写的共享数据。程序在多个并行执行之间共享相同的只读代码和数据。这意味着开发者不应在程序中包含任何静态可写或全局变量。未来可能会添加写时复制机制以支持可写数据。
有符号除法
SBF 指令集不支持有符号除法。
Is this page helpful?