Ein Cross-Program Invocation (CPI) liegt vor, wenn ein Programm während der Ausführung eine Anweisung auf einem anderen Programm aufruft. CPIs ermöglichen Kompositionsfähigkeit: Die Anweisungen jedes Programms können von jedem anderen Programm im Netzwerk aufgerufen werden.
Cross-program invocation Beispiel
CPIs ohne PDA-Signer
Verwendung der invoke-Funktion, Anchor CpiContext, Native Rust-Beispiele, SOL-Transfer-CPI-Beispiele.
CPIs mit PDA-Signern
Verwendung von invoke_signed mit Signer-Seeds, Anchor CpiContext mit PDA, Native Rust-PDA-Signierungsbeispiele.
CPI-Ausführung und Berechtigungen
11-Schritte-CPI-Ausführungsablauf, Regeln zur Berechtigungserweiterung, Reentrancy, Kontenvalidierung.
CPI-Kostenmodell und Datensynchronisation
CPI-Kostenformel, Serialisierungskosten, Kontendatensynchronisation, PDA-Signierung, Rückgabedaten.
Wichtige Fakten
- Zwei Funktionen:
invoke(ohne PDA-Signierung) undinvoke_signed(mit PDA-Signierung). - Berechtigungserweiterung: Konten-Berechtigungen (Signer, beschreibbar) werden vom Aufrufer auf den Aufgerufenen erweitert. Ein Aufgerufener kann Berechtigungen nicht über das hinaus erweitern, was der Aufrufer übergeben hat.
- Gemeinsames Compute-Budget: Der CU-Verbrauch eines Aufgerufenen reduziert das verbleibende Budget des Aufrufers.
- Reentrancy: Direkte Selbstrekursion ist erlaubt (A->A->A). Indirekte
Reentrancy ist nicht erlaubt (A->B->A gibt
ReentrancyNotAllowedzurück).
Limits
| Limit | Wert | Quelle |
|---|---|---|
| Maximale Anweisungs-Stack-Tiefe | 5 (9 mit SIMD-0268) | MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| CPI-Aufrufkosten | 1.000 CUs (946 mit SIMD-0339) | DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339 |
| Maximale PDA-Signer pro CPI | 16 | MAX_SIGNERS |
| Maximale CPI-Anweisungsdaten | 10 KiB (10.240 Bytes) | MAX_INSTRUCTION_DATA_LEN |
| Maximale Rückgabedaten | 1.024 Bytes | MAX_RETURN_DATA |
| Maximale CPI-Konten-Infos | 128 (255 mit SIMD-0339)* | MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339 |
| CPI-Serialisierungskosten | 1 CU pro 250 Bytes | cpi_bytes_per_unit |
| Maximale Kontendaten-Realloc pro CPI | 10.240 Bytes (10 KiB) | MAX_PERMITTED_DATA_INCREASE |
invoke vs invoke_signed
Solana bietet zwei Funktionen für die Durchführung von CPIs:
| Funktion | Anwendungsfall | PDA-Signierung |
|---|---|---|
invoke | CPIs, bei denen alle erforderlichen Signer bereits die ursprüngliche Transaktion signiert haben | Nein |
invoke_signed | CPIs, bei denen das aufrufende Programm im Namen einer PDA signieren muss, die es besitzt | Ja, über Signer-Seeds |
Intern ruft invoke einfach invoke_signed mit einem leeren
Signer-Seeds-Array auf. Verwenden Sie invoke, wenn Sie keine
PDA-Signierung benötigen, und invoke_signed, wenn das Programm eine Aktion
im Namen einer PDA autorisieren muss.
Beide Funktionen lösen letztendlich denselben Syscall aus
(sol_invoke_signed_rust)
und durchlaufen denselben Runtime-Pfad
(cpi_common).
Der einzige Unterschied besteht darin, ob Signer-Seeds bereitgestellt werden.
Wenn Seeds bereitgestellt werden, leitet die Runtime PDA-Pubkeys ab und fügt sie
der Menge der gültigen Signer hinzu, bevor die Berechtigungsprüfung durchgeführt
wird.
Is this page helpful?