Feature Flags & cfg
Use features do Cargo e #[cfg(feature = ...)] para controlar logs de depuração, instruções exclusivas para desenvolvimento e código específico de cluster em programas Anchor.
Receita
[features]
default = []
debug-log = []
devnet-only = []#[cfg(feature = "debug-log")]
msg!("debug");Quando usar isso: Você precisa de builds diferentes para dev vs mainnet ou diagnósticos opcionais.
Exemplo de Trabalho
#[cfg(feature = "devnet-only")]
#[program]
pub mod my_program {
pub fn airdrop_test_tokens(ctx: Context<Airdrop>) -> Result<()> {
// compilado apenas quando o recurso está habilitado
Ok(())
}
}
#[cfg(not(feature = "devnet-only"))]
#[program]
pub mod my_program {
// instruções de produção apenas
}O que isso demonstra:
- Recursos controlam a inclusão em tempo de compilação
- Binário menor para mainnet sem instruções de dev
- cfg em módulos requer cuidado com #[program]
- Documente os recursos no README
Mergulho Profundo
Ressalva do Anchor
Dividir módulos #[program] por cfg altera o IDL entre builds. Prefira crates de desenvolvimento separados ou instruções protegidas por chaves de administrador em vez de enviar instruções de dev para mainnet.
Padrão de recurso de cluster
Use constantes em Anchor.toml / scripts de build em vez de múltiplos módulos #[program] quando possível.
Armadilhas
- IDL diferente por conjunto de recursos - Confusão do cliente. Correção: Um perfil de release para mainnet.
- Habilitar acidentalmente devnet-only na mainnet - Superfície de ataque extra. Correção: CI proíbe combinação de recursos.
- cfg em structs de conta - Desvio de layout do IDL. Correção: Mantenha o layout da conta estável entre builds.
- Recurso de logs de depuração deixado ativado - Desperdício de CU. Correção: Recursos padrão vazios.
- Erro de dois módulos #[program] - Erros de compilação. Correção: Módulo de programa único por build.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Crate de programa de dev separado | Separação clara | Flags de recursos em um único crate |
| Gate de admin em tempo de execução | Mesmo binário | Remoção em tempo de compilação |
FAQs
Versão do Anchor?
0.32.1 em tópicos avançados.
Quando usar zero_copy?
Layouts fixos grandes quando Borsh CU é muito alto.
Realloc é reversível?
Não facilmente; planeje o crescimento futuro.
Contas restantes estão no IDL?
Não; documente separadamente.
declare_program! precisa de quê?
JSON do IDL do chamador em tempo de compilação.
O Anchor pode fazer CPI para Pinocchio?
Sim, com metadados de conta corretos.
Flags de recursos e IDL?
Evite IDLs diferentes por recurso na mainnet.
Como medir CU?
LiteSVM, Surfpool, simulação em devnet.
Tipos de conta personalizados são comuns?
Não; último recurso.
Próximos passos?
Veja os links relacionados para recursos.
Relacionado
- Logging & CU Cost - logs de depuração
- Program Upgrades - releases
- Making Programs Immutable - deploy final
Versões da 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.