Communitygithub.com

mitgajera/solana-program-upgrade-skill

Compétence Claude Code pour les mises à niveau sécurisées de programmes Solana et les migrations de comptes on-chain : versioning, réallocation/redimensionnement, simulation fork, autorité multisig, rollback.

Qu'est-ce que solana-program-upgrade-skill ?

Cette compétence fournit un workflow complet et sécurisé pour effectuer des mises à niveau de programmes Solana déjà déployés et migrer leurs données de comptes on-chain. Elle est conçue comme un complément à `solana-dev-skill` et se concentre exclusivement sur le cycle de vie critique de mise à niveau + migration. La compétence couvre le versioning de comptes avec des en-têtes de version explicites, la migration paresseuse via `realloc`, la simulation sur un fork de mainnet cloné, l'hygiène de l'autorité de mise à niveau (notamment le passage à un multisig Squads v4), et les stratégies de rollback. Elle intègre des commandes (`/plan-upgrade`, `/simulate-upgrade`), des agents spécialisés (`program-migration-architect`, `migration-qa-engineer`) et une règle de garde (`account-layout-guard`) pour détecter les modifications de structure de comptes. Les développeurs peuvent ainsi éviter les corruptions silencieuses de données, les échecs de désérialisation et les vulnérabilités de sécurité lors de l'évolution d'un programme Solana en production.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add mitgajera/solana-program-upgrade-skill

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

solana-program-upgrade

Mettez à niveau un programme Solana en production et migrez ses données de comptes on-chain en toute sécurité - versioning, migration paresseuse par realloc, simulation fork, hygiène d'autorité de mise à niveau et rollback. C'est l'étape la plus catastrophique du cycle de vie Solana, rendue viable.

Complément de solana-dev-skill. Cette compétence gère les bases Anchor/Pinocchio/test en environnement vierge. Celle-ci ne gère que le cycle de mise à niveau + migration - à utiliser une fois qu'un programme est déjà déployé et doit évoluer.


Règles d'or (l'épine dorsale de la sécurité)

  1. Ne jamais modifier la disposition d'un compte en production sans une balise de version + un chemin de migration. Les anciens comptes sont des octets bruts ; un nouveau code les lisant avec une structure modifiée -> AccountDidNotDeserialize ou corruption silencieuse. Le discriminateur de 8 octets verrouille le type, pas la version.
  2. Simulez contre l'état réel cloné du mainnet avant le mainnet. Exécutez toujours la mise à niveau et la migration exactes sur un fork d'abord et différenciez les octets des comptes. Aucune exception.
  3. Utilisez un multisig pour l'autorité de mise à niveau. Une seule clé à chaud capable de remplacer toute la logique du programme est un vecteur de rug/compréomission. Déplacez-la sur Squads v4.
  4. Les migrations de données on-chain sont généralement en avant uniquement. Concevez-les de manière additive et reprenable ; ne supposez pas que vous pouvez annuler les données.
  5. Conservez le .so précédent. Vous pouvez toujours revenir rapidement en arrière sur le code même si les données ne peuvent pas être annulées.
  6. Par défaut, utilisez devnet/localnet/fork. Ne ciblez jamais automatiquement le mainnet dans un exemple.

Le workflow de mise à niveau

Suivez dans l'ordre. Chaque étape renvoie vers un fichier ciblé pour approfondir.

  1. Comparez le schéma - comparez les structures #[account] anciennes et nouvelles. Identifiez les changements additifs vs cassants (réorganisation/suppression/changement de type = cassant).
  2. Choisissez une stratégie - crank impatient vs migration paresseuse au touché vs copie vers un nouveau compte -> migration-strategies.md.
  3. Écrivez des structures versionnées - ajoutez une balise de version, branchez sur la version stockée -> account-versioning.md.
  4. Implémentez la migration - realloc manuel (base portable) -> realloc-migration.md ; ou le type Migration d'Anchor si votre version le supporte -> anchor-migration-type.md.
  5. Simulez sur un fork - clonez les comptes réels, exécutez la mise à niveau, différenciez les octets, vérifiez l'idempotence -> fork-simulation.md.
  6. Sécurisez l'autorité - vérifiez/déplacez vers le multisig Squads avant de toucher le mainnet -> upgrade-authority.md.
  7. Déployez le binaire - flux buffer, extend si plus volumineux, IDL, --final -> program-deploy-upgrade.md.
  8. Vérifiez et conservez un plan de rollback - confirmez que les comptes se désérialisent ; conservez le .so précédent et un chemin de récupération de demi-migration -> rollback-recovery.md.

Table de routage

Trouvez la ligne correspondant à la situation et lisez ce fichier.

Symptôme / tâcheLire
AccountDidNotDeserialize / décalage de taille / mauvaises valeurs après une mise à niveauaccount-versioning.md, puis realloc-migration.md
Ajout/suppression/réorganisation/changement de type d'un champ sur une structure #[account]account-versioning.md
"Comment versionner mon compte pour pouvoir le modifier plus tard ?"account-versioning.md
Besoin d'agrandir/réduire un compte existant sur placerealloc-migration.md
Migration paresseuse "migre au touché" vs migration unique impatienterealloc-migration.md, migration-strategies.md
Piège des octets obsolètes realloc::zero / direction de reconstitution du loyerrealloc-migration.md
Limite de croissance par instruction de 10 Ko pour realloc, grandes croissancesrealloc-migration.md
Vous voulez le nouveau type Migration<'info, From, To> d'Anchoranchor-migration-type.md
Erreurs AccountAlreadyMigrated / AccountNotMigratedanchor-migration-type.md
Choix entre migration impatiente vs paresseuse vs copie vers nouveau comptemigration-strategies.md
Migration d'un grand ensemble de comptes (ex. dizaines de milliers) à moindre coûtmigration-strategies.md
Migration par lots/crank/gardien, pagination, suivi de progressionmigration-strategies.md
realloc sur place impossible (réduction au-delà des données, changement de type)migration-strategies.md
Redéploiement / mise à niveau du binaire du programmeprogram-deploy-upgrade.md
Flux solana program write-buffer / deploy --bufferprogram-deploy-upgrade.md
Le nouveau .so est plus grand que celui déployé (solana program extend)program-deploy-upgrade.md
Mise à niveau de l'IDL (anchor idl upgrade)program-deploy-upgrade.md
Déploiement sur place vs nouvel ID de programme (effet sur les PDA/comptes)program-deploy-upgrade.md
Qui contrôle le programme ? Clé unique vs multisigupgrade-authority.md
Déplacer l'autorité de mise à niveau vers un multisig Squads v4upgrade-authority.md
set-upgrade-authority, timelock, gestion de clésupgrade-authority.md
Rendre le programme immuable (--final) et ce que cela coûteupgrade-authority.md
Tester la mise à niveau avant le mainnet / cloner l'état réelfork-simulation.md
Fork du mainnet Surfpool ; différencier les octets des comptes avant/aprèsfork-simulation.md
Tests unitaires LiteSVM / Mollusk pour l'instruction de migrationfork-simulation.md
Prouver que la migration est idempotente (exécutée deux fois = sans effet)fork-simulation.md
La mise à niveau a mal tourné - récupérer rapidement l'ancien coderollback-recovery.md
Ensemble de comptes à moitié migrés ; reprendre en toute sécuritérollback-recovery.md
Pause / garde de migration / drapeau de fonctionnalité d'urgencerollback-recovery.md
Programme natif / Pinocchio (sans sucre Anchor)realloc-migration.md, account-versioning.md
Liens et docs de référence (vérifier la version actuelle)resources.md

Outils compagnons

  • Commandes : /plan-upgrade (différence de schéma -> plan de migration + rapport de risque), /simulate-upgrade (fork, clone, exécute, différencie), /check-upgrade-authority (audit clé unique vs multisig).
  • Agents : program-migration-architect (concevoir la migration à partir d'une différence de schéma), migration-qa-engineer (écrire des tests fork/LiteSVM, vérifier l'absence de corruption).
  • Règle : account-layout-guard se déclenche automatiquement lors de modifications des structures #[account] / state.rs et exige un changement de version + un chemin de migration.

Contrat d'exactitude

Chaque indicateur CLI, contrainte Anchor, crate et type de compte dans les fichiers routés doit être réel et vérifiable. En cas de doute, vérifiez auprès des versions installées (anchor --version, solana --version, le changelog Anchor) - n'inventez jamais. Traitez le type Migration comme peut-être non publié ; le motif manuel realloc est la valeur par défaut portable.

Skills associés