Cross Program Invocation

Cross Program Invocation (CPI) to sytuacja, gdy jeden program wywołuje instrukcję w innym programie podczas wykonywania. CPI umożliwiają kompozycyjność: instrukcje dowolnego programu mogą być wywoływane przez każdy inny program w sieci.

Przykład cross-program invocationPrzykład cross-program invocation

Najważniejsze informacje

  • Dwie funkcje: invoke (bez podpisu PDA) oraz invoke_signed (z podpisem PDA).
  • Rozszerzanie uprawnień: Uprawnienia konta (sygnatariusz, zapisywalność) są przekazywane od wywołującego do wywoływanego. Wywoływany nie może zwiększyć uprawnień ponad to, co przekazał wywołujący.
  • Wspólny budżet obliczeniowy: Zużycie CU przez wywoływanego zmniejsza pozostały budżet wywołującego.
  • Reentrancy: Dozwolona jest bezpośrednia rekurencja (A->A->A). Pośrednia rekurencja nie jest dozwolona (A->B->A zwraca ReentrancyNotAllowed).

Limity

LimitWartośćŹródło
Maksymalna głębokość stosu instrukcji5 (9 z SIMD-0268)MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268
Koszt wywołania CPI1 000 CU (946 z SIMD-0339)DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339
Maksymalna liczba sygnatariuszy PDA na CPI16MAX_SIGNERS
Maksymalny rozmiar danych instrukcji CPI10 KiB (10 240 bajtów)MAX_INSTRUCTION_DATA_LEN
Maksymalny rozmiar danych zwrotnych1 024 bajtyMAX_RETURN_DATA
Maksymalna liczba CPI account infos128 (255 z SIMD-0339)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
Koszt serializacji CPI1 CU za 250 bajtówcpi_bytes_per_unit
Maksymalna zmiana rozmiaru danych konta na CPI10 240 bajtów (10 KiB)MAX_PERMITTED_DATA_INCREASE

invoke kontra invoke_signed

Solana udostępnia dwie funkcje do wykonywania CPI:

FunkcjaZastosowaniePodpisywanie przez PDA
invokeCPI, w których wszyscy wymagani sygnatariusze już podpisali oryginalną transakcjęNie
invoke_signedCPI, w których wywołujący program musi podpisać w imieniu posiadanego przez siebie PDATak, przez signer seeds

Pod maską invoke po prostu wywołuje invoke_signed z pustą tablicą signer seeds. Użyj invoke, gdy nie potrzebujesz podpisywania przez PDA, a invoke_signed, gdy program musi autoryzować akcję w imieniu PDA.

Obie funkcje ostatecznie wywołują ten sam syscall (sol_invoke_signed_rust) i przechodzą przez tę samą ścieżkę wykonania w runtime (cpi_common). Jedyną różnicą jest to, czy signer seeds są przekazane. Gdy są, runtime wyprowadza klucze publiczne PDA i dodaje je do zestawu ważnych sygnatariuszy przed sprawdzeniem uprawnień.

Is this page helpful?

Spis treści

Edytuj stronę

Zarządzane przez

© 2026 Solana Foundation.
Wszelkie prawa zastrzeżone.
Bądź na bieżąco