Solana为何将Program Account与Program Executable Data Account分设?
为什么Solana程序要拆分Program Account和Program Executable Data Account
你对两类账户的基础功能理解是正确的:Program Account仅存储元数据(包括指向Program Executable Data Account的地址、执行标记、升级权限相关标记等),实际的程序字节码全部存在后者中。你此前推翻的两个猜测属于对该设计的常见误解,拆分的核心价值并不在切换代码地址或者所有者分离上,而是以下几个维度:
- 升级操作的原子性保障
程序二进制体积通常在数百KB到数MB不等,如果直接存储在Program Account中,升级时覆盖大体积数据的过程如果出现中断(如节点故障、交易执行异常),会直接损坏Program Account本身,导致程序完全不可用。拆分设计下,升级时仅修改Program Executable Data Account的代码段,全部写入完成后才会更新状态标记为可用,全程不触碰Program Account的核心元数据,就算升级失败也不影响现有程序的正常运行,且用户调用程序的地址始终保持不变,完全无感知。 - 运行时加载与缓存优化
Solana运行时调度程序执行时,首先只需要读取体积极小(仅数十字节)的Program Account拿到代码存储地址,再去拉取对应的二进制文件。如果多个Program Account指向同一份程序字节码(比如同一程序的多链部署复用、或者测试网的镜像程序),运行时可以直接复用已经加载到内存中的代码缓存,不需要重复读取存储和验证字节码,大幅提升执行效率。 - 存储成本与生命周期管理灵活性
Solana链上账户按占用空间大小收取租金,Program Account体积极小,租金成本可以忽略不计,创建后基本不需要修改。而Program Executable Data Account的体积随代码大小动态调整,升级时如果代码体积变大,仅需要为后者补充租金即可,不需要调整Program Account的任何属性。如果后续程序要下线,还可以转出Program Executable Data Account的余额回收存储成本,仅保留极小的Program Account作为占位符,避免地址被他人复用引发安全风险。 - 权限边界隔离
两类账户的所有者虽然都是BPF Loader,但权限控制逻辑完全分离:Program Account的权限仅用于调整指向的代码账户地址(仅在需要彻底迁移程序到全新代码时才会使用),Program Executable Data Account的权限仅用于控制代码写入。你可以独立将代码的升级权限转移给多签或者直接销毁,完全不会影响Program Account本身的所有权,避免误操作导致核心程序地址失效。
内容的提问来源于stack exchange,提问作者Carles Mitjans
相关产品推荐
相关产品推荐

