Skip to content

局限性

在 Solana 区块链上开发程序时,存在一些固有的局限性。以下是您可能遇到的一些常见局限性。

Rust库

由于基于 Rust 的链上程序必须在资源受限的单线程环境中运行,且需要保持其确定性,因此在使用各种库时常有一些局限性。

有关这些局限性的详细信息,请参阅使用Rust开发 - 局限性

计算预算

为了防止滥用区块链的计算资源,每个交易都会分配一个计算预算。超出此计算预算将导致交易失败。

有关计算预算的具体细节,请参阅计算约束文档。

调用栈深度 - CallDepthExceeded错误

Solana程序被限制在快速运行,为了实现这一点,程序的调用栈深度被限制为最大64帧

当程序超出允许的调用栈深度限制时,它将收到CallDepthExceeded错误。

CPI调用深度 - CallDepth错误

跨程序调用允许程序直接调用其他程序,但深度目前限制为4

当程序超出允许的跨程序调用深度时,它将收到CallDepth错误。

浮点Rust类型支持

程序支持 Rust 浮点操作的有限子集。如果程序尝试使用不支持的浮点操作,运行时将报告未解决的符号错误。

浮点操作是通过软件库(特别是 LLVM 的浮点内建函数)执行的。由于是软件模拟,它们消耗的计算单元比整数操作更多。一般情况下,建议使用定点操作代替浮点操作。

Solana数学程序库测试将反映出一些数学操作的性能。要运行测试,请同步仓库并运行:

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

最近的结果显示,浮点操作相比于整数操作需要更多的指令。定点实现可能有所不同,但也会少于浮点操作:

text
          u64   f32
Multiply    8   176
Divide      9   219

静态可写数据

程序共享对象不支持可写共享数据。程序在多个并行执行中共享相同的只读代码和数据。这意味着开发者不应该在程序中包含任何静态可写或全局变量。未来可能会添加写时复制机制来支持可写数据。

有符号除法

SBF指令集不支持有符号除法。添加有符号除法指令是一个考虑因素。