Qu'est-ce qu'un PDA Solana ?
Dans le développement Solana, PDA signifie Adresse Dérivée de Programme.
Un PDA est un type spécial d'adresse de compte généré par un Programme Solana en utilisant des règles déterministes. Contrairement aux adresses de portefeuille normales, un PDA n'a pas de clé privée et ne peut pas être contrôlé directement par les utilisateurs.
Le PDA est l'un des mécanismes les plus importants de Solana car il permet aux Programmes de gérer l'état et les actifs sur la chaîne de manière sécurisée.
Pourquoi Solana a-t-il besoin de PDA ?
Sur Solana, les Programmes sont sans état et en lecture seule.
Cela signifie :
- Les Programmes exécutent la logique
- Les Comptes stockent les données
Un Programme ne peut pas stocker directement les données utilisateur en interne comme le ferait un traditionnel. service backend.
Des applications telles que :
- Protocoles DeFi
- Marchés NFT
- Systèmes de staking
- Jeux blockchain
ont toutes besoin de comptes pour stocker :
- Soldes d'utilisateurs
- Positions
- Métadonnées
- Actifs des coffres
Les comptes de portefeuille réguliers sont contrôlés par des clés privées, ce qui crée des problèmes de sécurité et de propriété pour les protocoles.
Par conséquent, Solana a introduit les comptes PDA :
- Pas de clé privée
- Contrôlé uniquement par des programmes
- Généré de manière déterministe
Comment fonctionne le PDA
Un PDA est dérivé de :
- Seeds
- ID de programme
- Bump Seed
Exemple :
const [pda, bump] = PublicKey.findProgramAddressSync(
[
Buffer.from("user"),
wallet.publicKey.toBuffer(),
],
programId
);
Ici :
-
"user"est une graine -
wallet.publicKeyest l'adresse de l'utilisateur -
programIdidentifie le programme
Le résultat est une adresse PDA déterministe.
Tant que :
- Les graines restent les mêmes
- L'ID du programme reste le même
le PDA sera toujours identique.
Qu'est-ce qu'une graine de Bump ?
Les adresses Solana sont des clés publiques à courbes elliptiques.
Cependant, les PDA ne doivent pas avoir de clés privées valides.
Par conséquent, Solana essaie continuellement de
bump values:
255 → 254 → 253 ...
jusqu'à ce qu'il trouve une adresse qui :
- Ne peut pas générer de clé privée
- Ne peut être contrôlée que par le Programme
Cette valeur est appelée la seed de bump.
Pourquoi les PDA n'ont pas de clés privées
Les adresses de portefeuille normales sont générées comme ceci :
Clé Privée → Clé Publique → Adresse
Mais la génération de PDA fonctionne différemment :
Seeds + ProgrammeID → Hash → PDA
En conséquence :
- Les PDA n'ont pas de clés privées
- Les utilisateurs ne peuvent pas les contrôler
- Les hackers ne peuvent pas récupérer une clé secrète
Seul le Programme associé peut les gérer.
Comment les programmes contrôlent les PDA
Bien que les PDA ne puissent pas signer des transactions directement, l’environnement d'exécution de Solana permet aux programmes de prouver la propriété en utilisant :
- Des graines
- Un bump
- ID du programme
Cela permet aux programmes de "signer" au nom du PDA.
En conséquence, les PDA peuvent :
- Transférer des jetons
- Modifier l'état en chaîne
- Effectuer des appels CPI
- Frapper des jetons
Cas d'utilisation communs des PDA
Vaults DeFi
De nombreux protocoles DeFi utilisent des comptes PDA comme vaults pour :
- Des pools de liquidités
- Des actifs de staking
- La gestion des trésoreries
Métadonnées NFT
Les protocoles NFT dérivent souvent des comptes de métadonnées en utilisant :
métadonnées + adresse mint
Cela crée des métadonnées PDA prévisibles.
Des projets comme Metaplex s'appuient fortement sur ce design.
Gestion de l'état de l'utilisateur
Les protocoles créent souvent des PDAs dédiées pour les utilisateurs :
PDA utilisateur PDA de position PDA de mise
Ces comptes stockent :
- Positions des utilisateurs
- Données de mise
- Progrès dans le jeu
- Points de récompense
PDA vs Adresses de portefeuille normal
TypeAdresse de portefeuillePDAPossède une clé privéeOuiNonPeut signerOuiNonContrôlé parUtilisateurProgrammePrévisibleNonOuiUtilisation principalePaiementsGestion de l'état
PDA dans Anchor
Dans le cadre d'Anchor, les PDAs sont largement utilisées.
Exemple :
#[compte(
graines = [b"utilisateur", user.key().as_ref()],
bump
)]
pub user_account: Compte<'info, UserAccount>,
Anchor automatiquement :
- Dérive PDA
- Vérifie le bump
- Valide les comptes
C'est devenu le modèle de développement standard dans Solana.