Cross Program Invocation

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 BeispielCross-program invocation Beispiel

Wichtige Fakten

  • Zwei Funktionen: invoke (ohne PDA-Signierung) und invoke_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 ReentrancyNotAllowed zurück).

Limits

LimitWertQuelle
Maximale Anweisungs-Stack-Tiefe5 (9 mit SIMD-0268)MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268
CPI-Aufrufkosten1.000 CUs (946 mit SIMD-0339)DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339
Maximale PDA-Signer pro CPI16MAX_SIGNERS
Maximale CPI-Anweisungsdaten10 KiB (10.240 Bytes)MAX_INSTRUCTION_DATA_LEN
Maximale Rückgabedaten1.024 BytesMAX_RETURN_DATA
Maximale CPI-Konten-Infos128 (255 mit SIMD-0339)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
CPI-Serialisierungskosten1 CU pro 250 Bytescpi_bytes_per_unit
Maximale Kontendaten-Realloc pro CPI10.240 Bytes (10 KiB)MAX_PERMITTED_DATA_INCREASE

invoke vs invoke_signed

Solana bietet zwei Funktionen für die Durchführung von CPIs:

FunktionAnwendungsfallPDA-Signierung
invokeCPIs, bei denen alle erforderlichen Signer bereits die ursprüngliche Transaktion signiert habenNein
invoke_signedCPIs, bei denen das aufrufende Programm im Namen einer PDA signieren muss, die es besitztJa, ü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?

Inhaltsverzeichnis

Seite bearbeiten

Verwaltet von

© 2026 Solana Foundation.
Alle Rechte vorbehalten.
Verbinden Sie sich