Solana 文档开发程序

限制

在 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 f32
Multiply 8 176
Divide 9 219

静态可写数据

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

有符号除法

SBF 指令集不支持有符号除法。

Is this page helpful?

Table of Contents

Edit Page