Derivación de PDA en el lado del cliente
Los clientes deben derivar las mismas PDA que las restricciones seeds en la cadena. Utilice bytes de semilla, orden e ID de programa idénticos.
Receta
import { getProgramDerivedAddress } from "@solana/kit";
const [pda] = await getProgramDerivedAddress({
programAddress: programId,
seeds: ["escrow", addressEncoder.encode(maker), u64ToLeBytes(escrowId)],
});Cuándo usar esto: Al crear transacciones que pasan cuentas PDA a instrucciones de Anchor.
Ejemplo funcional
import { address, getProgramDerivedAddress, getBytesEncoder } from "@solana/kit";
const programId = address("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
const [escrowPda] = await getProgramDerivedAddress({
programAddress: programId,
seeds: [
new TextEncoder().encode("escrow"),
getBytesEncoder().encode(makerAddress),
new Uint8Array(new BigUint64Array([BigInt(escrowId)]).buffer),
],
});
// Pasar escrowPda en el mapa de cuentas que coincide con el nombre de IDL "escrow"Lo que esto demuestra:
- Las cadenas de semillas deben coincidir con los bytes
b"escrow" - Las Pubkeys se codifican como 32 bytes sin procesar
- Los enteros utilizan la misma endianidad que Rust
to_le_bytes - El ID del programa es la dirección del programa de Anchor
Análisis en profundidad
@solana/kit 7.0.0
Utilice los ayudantes de kit para la derivación de PDA y la codificación de direcciones. Comparta los constructores de semillas entre el programa (constantes de Rust) y el cliente (módulo TS) a través de la generación de código o constantes documentadas.
Pruebas
Asegúrese de que la PDA del cliente coincida con los fixtures de prueba de Anchor para cada variante de semilla.
Errores comunes
- Desajuste entre cadena UTF-8 y cadena b - Semillas diferentes. Solución: Utilice literales de semilla ASCII exactos.
- Semillas de enteros big-endian - Rust usa le en la cadena. Solución: Coincida con
to_le_bytes. - ID de programa incorrecto en el cliente - Deriva la dirección incorrecta. Solución: Lea de los metadatos de IDL o Anchor.toml.
- Bump opcional pasado incorrectamente - Generalmente se omite; el programa valida. Solución: Deje que la restricción en la cadena verifique el bump.
- Confusión entre Base58 y bytes - Errores de codificación. Solución: Utilice tipos de dirección de
kit.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
Ayudantes .pda del cliente TS de Anchor | @coral-xyz/anchor heredado | @solana/kit Greenfield |
| PDAs generadas por Codama | A partir de metadatos de semillas de IDL | Matemáticas de semillas hechas a mano |
Preguntas frecuentes
¿Qué versión de Anchor se asume?
0.32.1 en toda esta sección.
¿Puede una PDA ser un Signer en la estructura de cuentas?
No. Utilice restricciones de semillas y firma CPI.
¿Dónde se almacena el bump?
En el campo de la estructura de su cuenta, establecido en la inicialización.
¿Cómo derivan los clientes las PDAs?
Utilice @solana/kit 7.0.0 con bytes de semilla coincidentes.
¿Qué ID de programa se utiliza para las PDAs?
La dirección declare_id de su programa Anchor.
¿Las semillas incluyen el bump?
No en el array de semillas; el bump es un parámetro separado para find_program_address.
¿Cómo depurar fallos de PDA?
Compare las claves registradas; verifique las semillas y el ID del programa en el lado del cliente.
¿Son las PDAs exentas de alquiler?
Sí, cuando contienen datos; financiar con el pagador al inicializar.
¿Puede una PDA firmar múltiples CPI en un solo ix?
Sí, con las mismas semillas de firmante para cada CPI.
¿Qué leer a continuación?
Consulte los enlaces relacionados para obtener temas más profundos sobre PDA del cliente.
Relacionados
- PDAs en Anchor - semillas en la cadena
- Generación de clientes TS - generación de código de cliente
- Derivación de PDA - derivación nativa
Versiones de la pila: 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.