Los Program Derived Addresses (PDAs) son direcciones de cuenta de 32 bytes que
se derivan de forma determinística a partir de un ID de programa y un conjunto
de seeds. Están garantizadas para no encontrarse en la curva Ed25519, lo que
significa que no existe clave privada para ellas. Solo el programa cuyo ID se
utilizó en la derivación puede "firmar" por un PDA, y lo hace a través de
invoke_signed durante invocaciones entre programas (CPIs).
Program Derived Address
Derivación de PDA
Algoritmo de derivación, bump canónico, ejemplos de findProgramAddress con diferentes tipos de seed.
Cuentas PDA
Creación de cuentas en direcciones PDA, firma con invoke_signed, patrones de Anchor.
Datos clave
- Determinístico: Los mismos seeds e ID de programa siempre producen la misma dirección.
- Fuera de la curva: La dirección derivada se verifica para no ser una clave pública Ed25519 válida. Si el hash resulta estar en la curva, la derivación falla y se prueba un bump seed diferente.
- Sin clave privada: Debido a que la dirección está fuera de la curva, nadie
puede producir una firma criptográfica para ella. El programa "firma" mediante
el mecanismo
invoke_signeddel runtime.
Cuándo usar PDAs
- Direccionamiento determinístico: Deriva la misma cuenta a partir de los mismos seeds cada vez.
- Firma del programa: Solo el programa propietario puede firmar mediante
invoke_signed, permitiendo que los programas actúen como autoridades autónomas. - Estado por usuario: Deriva cuentas por usuario a partir de seeds de pubkey
de usuario (p. ej.,
["user", user_pubkey]). - Sin gestión de keypair: No hay clave privada que almacenar o perder. La dirección se deriva puramente a partir de seeds.
Límites
| Límite | Valor | Fuente |
|---|---|---|
| Máximo de seeds | 16 | MAX_SEEDS |
| Longitud máxima de seed | 32 bytes máximo por seed | MAX_SEED_LEN |
| Rango de bump | 0-255 (1 byte) | Añadido como el elemento seed final |
Coste de create_program_address | 1.500 CUs | create_program_address_units |
Coste en el peor caso de find_program_address | 1.500 entrada + 1.500 x iteraciones | 1.500 en la entrada + 1.500 por bump fallido |
| Máximo de firmantes PDA por CPI | 16 | MAX_SIGNERS |
Is this page helpful?