Un Cross Program Invocation (CPI) se produit lorsqu'un programme appelle une instruction sur un autre programme pendant l'exécution. Les CPI permettent la composabilité : les instructions de n'importe quel programme peuvent être invoquées par n'importe quel autre programme sur le réseau.
Exemple de cross-program invocation
CPI sans signataires PDA
Utilisation de la fonction invoke, Anchor CpiContext, exemples Rust natif, exemples de CPI de transfert SOL.
CPI avec signataires PDA
Utilisation d'invoke_signed avec des seeds de signataire, Anchor CpiContext avec PDA, exemples de signature PDA en Rust natif.
Exécution et privilèges CPI
Flux d'exécution CPI en 11 étapes, règles d'extension de privilèges, réentrance, validation de compte.
Modèle de coût CPI et synchronisation des données
Formule de coût CPI, coûts de sérialisation, synchronisation des données de compte, signature PDA, données de retour.
Faits clés
- Deux fonctions :
invoke(sans signature PDA) etinvoke_signed(avec signature PDA). - Extension de privilèges : les privilèges de compte (signataire, modifiable) s'étendent de l'appelant à l'appelé. Un appelé ne peut pas augmenter les privilèges au-delà de ce que l'appelant a transmis.
- Budget de calcul partagé : la consommation de CU d'un appelé réduit le budget restant de l'appelant.
- Réentrance : l'auto-récursion directe est autorisée (A->A->A). La
réentrance indirecte ne l'est pas (A->B->A retourne
ReentrancyNotAllowed).
Limites
| Limite | Valeur | Source |
|---|---|---|
| Profondeur maximale de la pile d'instructions | 5 (9 avec SIMD-0268) | MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| Coût d'invocation CPI | 1 000 CU (946 avec SIMD-0339) | DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339 |
| Signataires PDA maximum par CPI | 16 | MAX_SIGNERS |
| Données d'instruction CPI maximum | 10 Kio (10 240 octets) | MAX_INSTRUCTION_DATA_LEN |
| Données de retour maximum | 1 024 octets | MAX_RETURN_DATA |
| Account infos CPI maximum | 128 (255 avec SIMD-0339)* | MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339 |
| Coût de sérialisation CPI | 1 CU par 250 octets | cpi_bytes_per_unit |
| Réallocation maximale de données de compte par CPI | 10 240 octets (10 Kio) | MAX_PERMITTED_DATA_INCREASE |
invoke vs invoke_signed
Solana fournit deux fonctions pour effectuer des CPI :
| Fonction | Cas d'usage | Signature PDA |
|---|---|---|
invoke | CPI où tous les signataires requis ont déjà signé la transaction d'origine | Non |
invoke_signed | CPI où le programme appelant doit signer au nom d'un PDA qu'il possède | Oui, via les graines de signataire |
En coulisses, invoke appelle simplement invoke_signed avec un
tableau de graines de signataire vide. Utilisez invoke lorsque vous n'avez
pas besoin de signature PDA, et invoke_signed lorsque le programme doit
autoriser une action au nom d'un PDA.
Les deux fonctions déclenchent finalement le même appel système
(sol_invoke_signed_rust)
et suivent le même chemin d'exécution
(cpi_common).
La seule différence est de savoir si des graines de signataire sont fournies.
Lorsque des graines sont fournies, le runtime dérive les clés publiques PDA et
les ajoute à l'ensemble des signataires valides avant la vérification des
privilèges.
Is this page helpful?