Derivación de PDAs
Los PDAs se derivan de semillas y un ID de programa. find_program_address devuelve la dirección canónica fuera de la curva y la semilla de "bump" necesaria para invoke_signed.
Busca en todas las páginas de la documentación
Los PDAs se derivan de semillas y un ID de programa. find_program_address devuelve la dirección canónica fuera de la curva y la semilla de "bump" necesaria para invoke_signed.
let (pda, bump) = Pubkey::find_program_address(
&[b"metadata", mint.key.as_ref()],
program_id,
);Cuándo recurrir a esto:
pub fn verify_config(config: &AccountInfo, authority: &Pubkey, program_id: &Pubkey, stored_bump: u8) -> ProgramResult {
let (expected, bump) = Pubkey::find_program_address(&[b"config", authority.as_ref()], program_id);
if expected != *config.key || bump != stored_bump {
return Err(ProgramError::InvalidSeeds);
}
Ok(())
}Lo que esto demuestra:
InvalidSeeds en caso de discrepancia.| Restricción | Valor |
|---|---|
| Conteo de semillas | <= 16 |
| Longitud de semilla | <= 32 bytes cada una |
let bump_seed = [bump];
let signer_seeds: &[&[u8]] = &[b"vault", owner.as_ref(), &bump_seed];
// invoke_signed espera &[&[&[u8]]] - envuelve el grupo una vez más:
invoke_signed(&ix, account_infos, &[signer_seeds])?;invoke_signed falla. Solución: Añadir el slice &[bump]..as_bytes() consistentemente. Solución: Documentar la codificación.id.to_le_bytes(). Solución: Evitar empaquetado ambiguo.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
create_program_address | "Bump" conocido | "Bump" desconocido |
Macro seeds de Anchor | Ergonómico | Explícito nativo |
| Derivación solo fuera de la cadena | Ahorrar CU | Debe verificarse en la cadena |
find busca la semilla de "bump"; create requiere la semilla de "bump" exacta.
PDAs diferentes - por diseño.
Desaconsejado - usar prefijo constante.
Documentar; cambiar el orden cambia la dirección.
No garantizado - almacenar la semilla de "bump" real.
@solana/kit getProgramDerivedAddress.
Almacenar "snapshot" de PDA + semilla de "bump" en pruebas.
Las diferentes semánticas necesitan prefijos diferentes.
No si el ID del programa no cambia.
Añadir bytes de semilla "desambiguador".
16 semillas por derivación.
Evitar - usar la semilla de "bump" almacenada.
invoke_signedVersiones de Stack: Esta página se escribió 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, y LiteSVM 0.6.x.
Revisado por Chris St. John·Última actualización: 19 jul 2026