Communitygithub.com

mitgajera/solana-program-upgrade-skill

Claude Code 技能,用於安全升級 Solana 程式與執行鏈上帳戶遷移:版本控制、realloc/resize、分支模擬、多重簽章權限與回滾。

solana-program-upgrade-skill 是什麼?

此技能專為 Solana 開發者設計,處理最關鍵且高風險的生命週期階段:「線上程式升級」與「鏈上帳戶資料遷移」。它提供一套完整的安全性框架,涵蓋版本控制、惰性 realloc 遷移、分支模擬、升級權限衛生與回滾策略。支援 Anchor 與原生(Pinocchio)程式,並與 solana-dev-skill 互補。開發者可利用此技能避免因帳戶佈局變更導致的 AccountDidNotDeserialize 錯誤、確保多重簽章權限(如 Squads v4)、並在正式環境部署前透過真實克隆狀態的分支模擬驗證升級。技能內含詳細的路由表,能針對特定問題(如大小不符、欄位增減、遷移策略選擇)引導至對應文件,並提供 `plan-upgrade`、`simulate-upgrade` 等指令自動化流程。

相容平台✓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. 升級權限使用多重簽章。 單一熱鍵可以替換所有程式邏輯,是詐騙/攻擊向量。將其移至 Squads v4。
  4. 鏈上資料遷移通常只能是前向的。 設計為增量且可恢復的;不要假設你可以還原資料。
  5. 保留先前的 .so 檔案。 即使資料無法還原,你總是可以快速回滾程式碼。
  6. 預設使用 devnet/localnet/分支。 在任何範例中都不要自動以主網為目標。

升級工作流程

依序進行。每個步驟會導向特定的深度文件。

  1. 比對 schema - 比較新舊 #[account] 結構體。識別增量變更與破壞性變更(重新排序/移除/變更類型 = 破壞性)。
  2. 選擇策略 - 積極 crank 與惰性遷移(使用時觸發)與複製到新帳戶 -> 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
惰性「使用時遷移」與積極的一次性遷移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
批次/crank/keeper 遷移、分頁、進度追蹤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(schema 差異分析 -> 遷移計劃 + 風險報告),/simulate-upgrade(分支、克隆、執行、差異分析),/check-upgrade-authority(審計單一金鑰 vs 多重簽章)。
  • 代理: program-migration-architect(根據 schema 差異設計遷移),migration-qa-engineer(編寫分支/LiteSVM 測試,驗證無資料損毀)。
  • 規則: account-layout-guard 會自動在編輯 #[account] 結構體 / state.rs 時觸發,並要求版本提升加上遷移路徑。

準確性合約

路由文件中的每個 CLI 標誌、Anchor 約束、crate 和帳戶類型都必須是真實且可驗證的。如果不確定,請根據已安裝的版本(anchor --version,solana --version,Anchor 變更日誌)進行驗證 - 絕不虛構。將 Migration 類型視為可能尚未釋出;手動 realloc 模式是可移植的預設方式。

相關技能