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 voorbeeld
CPI's zonder PDA-ondertekenaars
De invoke-functie gebruiken, Anchor CpiContext, Native Rust-voorbeelden, SOL transfer CPI-voorbeelden.
CPI's met PDA-ondertekenaars
invoke_signed gebruiken met signer seeds, Anchor CpiContext met PDA, Native Rust PDA-ondertekeningsvoorbeelden.
CPI-uitvoering en privileges
11-stappen CPI-uitvoeringsflow, privilege-extensieregels, reentrancy, account validatie.
CPI-kostenmodel en datasynchronisatie
CPI-kostenformule, serialisatiekosten, accountdatasynchronisatie, PDA ondertekening, return data.
Belangrijkste feiten
- Twee functies:
invoke(geen PDA-ondertekening) eninvoke_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
| Limiet | Waarde | Bron |
|---|---|---|
| Max instruction stack depth | 5 (9 met SIMD-0268) | MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| CPI invocation cost | 1.000 CU's (946 met SIMD-0339) | DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339 |
| Max PDA-ondertekenaars per CPI | 16 | MAX_SIGNERS |
| Max CPI instruction data | 10 KiB (10.240 bytes) | MAX_INSTRUCTION_DATA_LEN |
| Max return data | 1.024 bytes | MAX_RETURN_DATA |
| Max CPI account infos | 128 (255 met SIMD-0339)* | MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339 |
| CPI-serialisatiekosten | 1 CU per 250 bytes | cpi_bytes_per_unit |
| Max account data realloc per CPI | 10.240 bytes (10 KiB) | MAX_PERMITTED_DATA_INCREASE |
invoke vs invoke_signed
Solana biedt twee functies voor het maken van CPI's:
| Functie | Gebruikssituatie | PDA-ondertekening |
|---|---|---|
invoke | CPI's waarbij alle vereiste ondertekenaars de oorspronkelijke transactie al hebben ondertekend | Nee |
invoke_signed | CPI's waarbij het aanroepende programma namens een PDA die het bezit moet ondertekenen | Ja, 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?