Cross Program Invocation

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 invocationExemple de cross-program invocation

Faits clés

  • Deux fonctions : invoke (sans signature PDA) et invoke_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

LimiteValeurSource
Profondeur maximale de la pile d'instructions5 (9 avec SIMD-0268)MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268
Coût d'invocation CPI1 000 CU (946 avec SIMD-0339)DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339
Signataires PDA maximum par CPI16MAX_SIGNERS
Données d'instruction CPI maximum10 Kio (10 240 octets)MAX_INSTRUCTION_DATA_LEN
Données de retour maximum1 024 octetsMAX_RETURN_DATA
Account infos CPI maximum128 (255 avec SIMD-0339)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
Coût de sérialisation CPI1 CU par 250 octetscpi_bytes_per_unit
Réallocation maximale de données de compte par CPI10 240 octets (10 Kio)MAX_PERMITTED_DATA_INCREASE

invoke vs invoke_signed

Solana fournit deux fonctions pour effectuer des CPI :

FonctionCas d'usageSignature PDA
invokeCPI où tous les signataires requis ont déjà signé la transaction d'origineNon
invoke_signedCPI où le programme appelant doit signer au nom d'un PDA qu'il possèdeOui, 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?

Table des matières

Modifier la page

Géré par

© 2026 Fondation Solana.
Tous droits réservés.
Restez connecté