Solana 程序是一个账户,其中包含可执行的 sBPF 字节码,并且其
executable 标志被设置为
true。程序本身是无状态的,所有可变状态都存储在通过instructions
传递的独立数据账户中。
程序账户、其四个组成部分及其加载器程序的示意图。
程序执行
编译、编写程序(Anchor / 原生 Rust)、sBPF 虚拟机、计算单元模型、系统调用、程序缓存。
程序部署
程序的部署、升级与验证。Loader-v3 指令参考及加载器程序。
核心程序
System Program(含指令参考)、Vote、Stake、Config、Compute Budget、Address Lookup Table 及 ZK ElGamal Proof。
预编译程序
Ed25519、Secp256k1、Secp256r1 签名验证程序。偏移结构体与验证规则。
系统调用参考
全面收录约 30 个 sBPF 系统调用及其计算单元消耗。
关键要点
- 编译为 sBPF:程序通过 LLVM 编译为 Solana 字节码格式(sBPF),并存储在可执行账户中。
- 无状态:所有可变状态都存储在独立的数据账户中,而不是在 program account 中。
- 可升级:使用 loader-v3(BPF Loader Upgradeable)部署的程序,在设置升级权限时可进行升级;撤销该权限后,程序将变为不可变。
限制
| 限制项 | 数值 | 来源 |
|---|---|---|
| 默认堆大小 | 32 KiB | HEAP_LENGTH |
| 最大堆大小(可调整) | 256 KiB | MAX_HEAP_FRAME_BYTES |
| 栈帧大小 | 4,096 字节 | STACK_FRAME_SIZE |
| 最大 sBPF 调用深度 | 64 | MAX_CALL_DEPTH |
| 最大指令栈深度(顶层 + CPI) | 5(SIMD-0268 时为 9) | MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| 堆成本 | 每 32 KiB 页面 8 CU | DEFAULT_HEAP_COST |
| 最大缓存程序数 | 512 | MAX_LOADED_ENTRY_COUNT |
| 部署可见性延迟 | 1 slot | DELAY_VISIBILITY_SLOT_OFFSET |
Is this page helpful?