Cross Program Invocation

Een Cross-Program Invocation (CPI) is wanneer één programma een instructie op een ander programma aanroept tijdens uitvoering. CPI's maken composability mogelijk: de instructies van elk programma kunnen worden aangeroepen door elk ander programma op het netwerk.

Cross-program invocation voorbeeldCross-program invocation voorbeeld

Belangrijkste feiten

  • Twee functies: invoke (geen PDA-ondertekening) en invoke_signed (met PDA-ondertekening).
  • Privilege-extensie: Account-privileges (signer, writable) worden uitgebreid van aanroeper naar aangeroepene. Een aangeroepene kan privileges niet escaleren buiten wat de aanroeper heeft doorgegeven.
  • Gedeeld compute budget: Het CU-verbruik van een aangeroepene vermindert het resterende budget van de aanroeper.
  • Reentrancy: Directe zelfrecursie is toegestaan (A->A->A). Indirecte reentrancy is niet toegestaan (A->B->A retourneert ReentrancyNotAllowed).

Limieten

LimietWaardeBron
Max instruction stack depth5 (9 met SIMD-0268)MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268
CPI invocation cost1.000 CU's (946 met SIMD-0339)DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339
Max PDA-ondertekenaars per CPI16MAX_SIGNERS
Max CPI instruction data10 KiB (10.240 bytes)MAX_INSTRUCTION_DATA_LEN
Max return data1.024 bytesMAX_RETURN_DATA
Max CPI account infos128 (255 met SIMD-0339)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
CPI-serialisatiekosten1 CU per 250 bytescpi_bytes_per_unit
Max account data realloc per CPI10.240 bytes (10 KiB)MAX_PERMITTED_DATA_INCREASE

invoke vs invoke_signed

Solana biedt twee functies voor het maken van CPI's:

FunctieGebruikssituatiePDA-ondertekening
invokeCPI's waarbij alle vereiste ondertekenaars de oorspronkelijke transactie al hebben ondertekendNee
invoke_signedCPI's waarbij het aanroepende programma namens een PDA die het bezit moet ondertekenenJa, via signer seeds

Onder de motorkap roept invoke simpelweg invoke_signed aan met een lege signer seeds array. Gebruik invoke wanneer je geen PDA-ondertekening nodig hebt, en invoke_signed wanneer het programma een actie namens een PDA moet autoriseren.

Beide functies activeren uiteindelijk dezelfde syscall (sol_invoke_signed_rust) en doorlopen hetzelfde runtime-pad (cpi_common). Het enige verschil is of signer seeds worden verstrekt. Wanneer seeds worden verstrekt, leidt de runtime PDA-pubkeys af en voegt deze toe aan de set van geldige ondertekenaars voordat de privilege-controle plaatsvindt.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken

Beheerd door

© 2026 Solana Foundation.
Alle rechten voorbehouden.
Blijf Verbonden