Communitygithub.com

solana-program-upgrade

Claude Code 技能:安全地升级 Solana 程序和执行链上账户迁移——版本控制、realloc/调整大小、分叉模拟、多签权限、回滚。

solana-program-upgrade 是什么?

该技能专注于 Solana 程序升级与链上账户数据迁移的**安全**执行。它涵盖版本控制、延迟 `realloc` 迁移、分叉模拟、升级权限安全以及回滚策略,是处理 Solana 开发中最具风险的环节——程序升级的必备工具。技能详细描述了完整的升级工作流:从模式对比、策略选择(主动/惰性迁移)、实现版本化结构体与迁移指令,到使用分叉模拟验证、确保多签权限、部署二进制文件以及制定回滚计划。它提供了清晰的决策路由表,按症状或任务引导用户阅读对应的深入文件。支持 Anchor 和原生/Pinocchio 程序,并强调在开发网/本地网/分叉上模拟,永远不要直接针对主网。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add mitgajera/solana-program-upgrade-skill

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

solana-program-upgrade 是做什么的?

安全地升级一个已部署的 Solana 程序并迁移其链上账户数据—— 版本控制、惰性 realloc 迁移、分叉模拟、升级权限卫生以及回滚。这是 Solana 开发中最具灾难性的生命周期步骤,让这一步变得可生存。

补充于 solana-dev-skill。 该技能负责全新的 Anchor/Pinocchio/测试基础。这个技能只负责 升级 + 迁移生命周期——一旦程序已部署并需要更改,才使用它。


黄金法则(安全脊柱)

  1. 没有版本标签和迁移路径,绝不要更改活动账户的布局。 旧账户是原始字节;使用更改后的结构体读取它们的新代码会导致 AccountDidNotDeserialize 或静默损坏。8 字节鉴别器控制的是 类型,而不是版本。
  2. **在上主网之前,针对真实的克隆主网状态进行模拟。**始终先在一个分叉上运行 精确的升级 + 迁移,并对比账户字节。没有例外。
  3. **升级权限使用多签。**一个可以替换所有 程序逻辑的热密钥是 rug/妥协向量。将其移至 Squads v4。
  4. **链上数据迁移通常是只向前的。**设计为增量的和可恢复的;不要假设你可以 还原数据。
  5. **保留之前的 .so。**即使数据无法还原,你总能快速回滚代码。
  6. **默认使用 devnet/localnet/fork。**在任何示例中,绝不要自动针对主网。

升级工作流

按顺序执行。每一步都引导到一个专注的文件以获取深度。

  1. 对比模式 - 比较旧 #[account] 结构体与新 #[account] 结构体。识别 增量更改 vs 破坏性更改(重新排序/移除/修改类型 = 破坏性)。
  2. 选择策略 - 主动任务 vs 惰性按需迁移 vs 复制到新账户 -> migration-strategies.md。
  3. 编写版本化结构体 - 添加版本标签,根据存储的版本分支 -> account-versioning.md。
  4. 实现迁移 - 手动 realloc(可移植基线) -> realloc-migration.md;或者 Anchor Migration 类型(如果你的版本支持它) -> anchor-migration-type.md。
  5. 在分叉上模拟 - 克隆真实账户,运行升级,对比字节, 验证幂等性 -> fork-simulation.md。
  6. 保护权限 - 在接触主网之前验证/移至 Squads 多签 -> upgrade-authority.md。
  7. 部署二进制文件 - buffer 流程,如果更大则 extend,IDL,--final -> program-deploy-upgrade.md。
  8. 验证并保留回滚计划 - 确认账户可以反序列化;保留先前的 .so 和半迁移恢复路径 -> rollback-recovery.md。

路由表

找到与情况匹配的行并阅读该文件。

症状/任务阅读
AccountDidNotDeserialize / 大小不匹配 / 升级后值错误account-versioning.md,然后是 realloc-migration.md
在 #[account] 结构体上添加/移除/重新排序/修改了字段类型account-versioning.md
“如何对账户进行版本化,以便以后可以更改它?”account-versioning.md
需要原地增大/缩小现有账户realloc-migration.md
惰性“按需迁移” vs 主动一次性迁移realloc-migration.md, migration-strategies.md
realloc::zero 陈旧字节陷阱 / 租金充值方向realloc-migration.md
每次指令 10 KB realloc 增长限制,大增长realloc-migration.md
想要新的 Anchor Migration<'info, From, To> 类型anchor-migration-type.md
AccountAlreadyMigrated / AccountNotMigrated 错误anchor-migration-type.md
选择主动 vs 惰性 vs 复制到新账户migration-strategies.md
迁移大量账户集(例如数万个)且成本低migration-strategies.md
批量/任务/看门人迁移,分页,进度跟踪migration-strategies.md
原地 realloc 不可能(缩小超过数据,类型更改)migration-strategies.md
重新部署/升级程序二进制文件program-deploy-upgrade.md
solana program write-buffer / deploy --buffer 流程program-deploy-upgrade.md
新的 .so 比已部署的更大(solana program extend)program-deploy-upgrade.md
升级 IDL(anchor idl upgrade)program-deploy-upgrade.md
原地部署 vs 新程序 ID(对 PDA/账户的影响)program-deploy-upgrade.md
谁控制程序?单密钥 vs 多签upgrade-authority.md
将升级权限移至 Squads v4 多签upgrade-authority.md
set-upgrade-authority,时间锁,密钥管理upgrade-authority.md
使程序不可变(--final)及其代价upgrade-authority.md
在上主网前测试升级 / 克隆真实状态fork-simulation.md
Surfpool 主网分叉;对比升级前后的账户字节fork-simulation.md
迁移指令的 LiteSVM / Mollusk 单元测试fork-simulation.md
证明迁移是幂等的(运行两次 = 无操作)fork-simulation.md
升级出错了 - 快速恢复旧代码rollback-recovery.md
半迁移的账户集;安全地恢复rollback-recovery.md
暂停 / 迁移守卫 / 紧急功能标志rollback-recovery.md
原生 / Pinocchio 程序(无 Anchor 语法糖)realloc-migration.md, account-versioning.md
权威链接和文档(验证当前版本)resources.md

配套工具

  • 命令: /plan-upgrade(模式对比 -> 迁移计划 + 风险评估), /simulate-upgrade(分叉,克隆,运行,对比),/check-upgrade-authority (审计单密钥 vs 多签)。
  • 智能体: program-migration-architect(根据模式对比设计迁移),migration-qa-engineer (编写分叉/LiteSVM 测试,验证无损坏)。
  • 规则: account-layout-guard 在编辑 #[account] 结构体 / state.rs 时自动触发,并要求版本提升 + 迁移路径。

准确性契约

路由文件中提到的每个 CLI 标志、Anchor 约束、crate 和账户类型 必须是真实且可验证的。当不确定时,根据已安装的 版本(anchor --version,solana --version,Anchor 变更日志)进行验证 - 绝不要 编造。将 Migration 类型视为可能尚未发布;手动 realloc 模式是默认的可移植方案。

相关技能