Solana/程序开发入门/升级程序

在 solana 中, 我们可以替换已部署的程序的代码. 不过要注意, solana 程序的部署和更新存在几个不同的版本演进, 在早期的版本里, 程序是不可升级的.

如何升级程序

升级程序可使用 pxsol.wallet.Wallet.program_update() 接口完成. 您可以修改我们的链上数据存储器代码, 然后使用如下的命令来升级链上程序版本. 升级程序不会修改程序的地址.

import pathlib
import pxsol

ada = pxsol.wallet.Wallet(pxsol.core.PriKey.int_decode(0x01))
program_pubkey = pxsol.core.PubKey.base58_decode('DVapU9kvtjzFdH3sRd3VDCXjZVkwBR6Cxosx36A5sK5E')
program_data = pathlib.Path('target/deploy/pxsol_ss.so').read_bytes()
ada.program_update(program_pubkey, program_data)

Solana 程序最早是不可更改的

Solana 早期负责管理程序的程序叫做 bpf loader, 也叫做 v1. 使用它部署的程序, 您的程序会被标记为所有数据不可写, 所有代码不可修改, 同时程序账户的 executable 被设置为 true. 所以这种部署方式下, 程序不能更新! 如果您想升级, 就只能部署一个新的程序, 并更新所有依赖它的账户或前端逻辑, 这无疑非常麻烦.

演进史

Solana 的 bpf loader 是一个特殊的原生程序, 专门用来加载并执行您上传的 bpf 字节码. Solana 发展过程中经历了三个主要版本的 loader:

Loader 名称 地址 特点
BPFLoader (v1) BPFLoader1111111111111111111111111111111111 最早期版本, 部署后不可升级
BPFLoader2 (v2) BPFLoader2111111111111111111111111111111111 支持更高效的加载, 但依旧不可升级
BPFLoaderUpgradeable (v3) BPFLoaderUpgradeab1e11111111111111111111111 当前默认, 支持程序升级和权限控制

也就是从 v3 开始, solana 引入了可升级程序的概念, 并将其作为默认部署方式.

可升级程序的结构图

Pxsol 默认使用 v3 来部署程序. 这会自动创建两个账户:

账户类型 作用
Program account 主地址, 对外暴露的程序入口
Program data account 存储实际代码字节码, 可变
Program ID (e.g., MyProgram111...)
│
├──> Program Account
│     └── owner: BPFLoaderUpgradeable
│     └── executable: true
│     └── points to:
│
└──> ProgramData Account
      └── contains: .so 字节码
      └── contains: upgrade_authority pubkey

所谓的升级程序, 其实就是修改第二个账户的内容.