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 invocation
CPI bez sygnatariuszy PDA
Użycie funkcji invoke, Anchor CpiContext, przykłady w czystym Rust, przykłady transferu SOL przez CPI.
CPI z sygnatariuszami PDA
Użycie invoke_signed z seedami sygnatariusza, Anchor CpiContext z PDA, przykłady podpisywania PDA w czystym Rust.
Wykonanie CPI i uprawnienia
11-etapowy przebieg wykonania CPI, zasady rozszerzania uprawnień, reentrancy, walidacja kont.
Model kosztów CPI i synchronizacja danych
Wzór na koszt CPI, koszty serializacji, synchronizacja danych kont, podpisywanie PDA, dane zwrotne.
Najważniejsze informacje
- Dwie funkcje:
invoke(bez podpisu PDA) orazinvoke_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
| Limit | Wartość | Źródło |
|---|---|---|
| Maksymalna głębokość stosu instrukcji | 5 (9 z SIMD-0268) | MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| Koszt wywołania CPI | 1 000 CU (946 z SIMD-0339) | DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339 |
| Maksymalna liczba sygnatariuszy PDA na CPI | 16 | MAX_SIGNERS |
| Maksymalny rozmiar danych instrukcji CPI | 10 KiB (10 240 bajtów) | MAX_INSTRUCTION_DATA_LEN |
| Maksymalny rozmiar danych zwrotnych | 1 024 bajty | MAX_RETURN_DATA |
| Maksymalna liczba CPI account infos | 128 (255 z SIMD-0339)* | MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339 |
| Koszt serializacji CPI | 1 CU za 250 bajtów | cpi_bytes_per_unit |
| Maksymalna zmiana rozmiaru danych konta na CPI | 10 240 bajtów (10 KiB) | MAX_PERMITTED_DATA_INCREASE |
invoke kontra invoke_signed
Solana udostępnia dwie funkcje do wykonywania CPI:
| Funkcja | Zastosowanie | Podpisywanie przez PDA |
|---|---|---|
invoke | CPI, w których wszyscy wymagani sygnatariusze już podpisali oryginalną transakcję | Nie |
invoke_signed | CPI, w których wywołujący program musi podpisać w imieniu posiadanego przez siebie PDA | Tak, 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?