Promoção de Devnet para Mainnet
Promover um programa e dApp Solana de devnet para mainnet-beta é um processo de gates escalonados: cada cluster tem economias, material de chave e risco diferentes. Pular um estágio envia surpresas em escala.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
anchor build --verifiable
anchor test
solana program deploy --url devnet target/deploy/my_program.so
# Após o checklist: implante o mesmo .so hash na mainnet via multisigQuando usar isso:
- Primeiro deploy na mainnet após conclusão de recursos no devnet
- Migração de RPC ou ID de programa entre ambientes
- Revisão de go/no-go na semana de lançamento
- Solicitações de auditoria de evidências de paridade de ambiente
- Repromoção pós-incidente de build corrigido
Exemplo de Trabalho
#!/usr/bin/env bash
set -euo pipefail
PROGRAM_SO="target/deploy/vault.so"
DEVNET_HASH=$(solana-verify get-executable-hash "$PROGRAM_SO")
anchor deploy --provider.cluster devnet
echo "Smoke test no Devnet..."
pnpm run smoke:devnet
echo "Hash para promoção para mainnet: $DEVNET_HASH"
# A proposta do Squads anexa este hashO que isso demonstra:
- Hash de build verificável registrado antes da mainnet
- Deploy e smoke test no devnet como gate rígido
- Mesmo artefato promovido - não recompilado em máquina diferente
- Proposta multisig referencia o hash executável
Análise Profunda
Estágios de Promoção
| Estágio | Cluster | Propósito |
|---|---|---|
| 1 | Surfpool / localnet | CI rápido, replay de exploração |
| 2 | Devnet | Integração, testes de airdrop |
| 3 | Mainnet-beta | Economia e taxas reais |
Paridade de Ambiente
- Estratégia de ID de programa: novo keypair por ambiente ou mesmo ID com caminho de upgrade documentado em ADR
- Arquivos
.env:RPC_URL,PROGRAM_ID,CLUSTERnunca copiados cegamente entre ambientes - Keypairs de carteira: arquivos separados; chaves da mainnet apenas em HSM ou Squads
Armadilhas
- Recompilar em máquina diferente - O bytecode difere; o hash de auditoria é inválido. Correção: Promoção de artefato de CI.
- Dependência de airdrop do Devnet - Mainnet precisa de plano de financiamento SOL real. Correção: Orçamento do pagador de taxas e carteiras de deploy.
- Mesma chave de administrador no devnet e mainnet - Chave de dev vazada drena a mainnet. Correção: Hierarquia de chaves distintas.
- Pular teste de carga - Devnet vazio; taxas da mainnet disparam. Correção: Testes de taxa de prioridade antes do lançamento.
- Frontend ainda aponta para devnet - Usuários assinam o cluster errado. Correção: Validação de ambiente em tempo de build.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Shadow deploy na Mainnet | Canary somente leitura | Primeiro deploy |
| Pular Devnet imutavelmente | Demo descartável pequena | Quaisquer fundos de usuário |
| Mainnet com feature flags | Exposição gradual ao usuário | Lógica principal não testada |
FAQs
Quanto tempo no devnet antes da mainnet?
Mínimo de um sprint completo com testes de integração; protocolos de alto risco adicionam auditoria externa.
Mesmo ID de programa entre clusters?
Geralmente IDs diferentes por ambiente; documentar mapeamento em ADR.
Quem aprova a mainnet?
Líder técnico + segurança + produto; signatários multisig para deploy.
Quais testes de smoke rodam?
Fluxos de usuário principais simulam e enviam no devnet com carteira de CI.
Instabilidade do Devnet?
Use Surfpool 0.12.0 para CI; devnet para QA manual quando necessário.
Como financiar o deploy da mainnet?
Carteira de operações pré-financiada; alerta abaixo do limite.
IDL na mainnet?
Publique o mesmo hash de IDL que o release do build verificável.
Plano de rollback?
Obrigatório no ticket de promoção - link para o runbook.
Timing do lançamento para a comunidade?
Coordenar deploy, frontend e comunicações em uma única janela de mudança.
Correspondência da versão do Agave?
Validador e CLI alinhados com 4.1.1 por manifesto.
Relacionados
- Estratégia de Upgrade de Programa - buffers e autoridade
- Melhores Práticas de Entrega - gates de release
- Depuração de Transações Falhas - triagem pós-promoção
Versões de Stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, e LiteSVM 0.6.x.