Cross Program Invocation

Cross Program Invocation (CPI) — це коли одна програма викликає інструкцію іншої програми під час виконання. CPI забезпечують композиційність: інструкції будь-якої програми можуть бути викликані будь-якою іншою програмою в мережі.

Приклад міжпрограмного викликуПриклад міжпрограмного виклику

Ключові факти

  • Дві функції: invoke (без підписання PDA) та invoke_signed (з підписанням PDA).
  • Розширення привілеїв: привілеї акаунта (підписувач, доступний для запису) передаються від викликача до викликаного. Викликаний не може підвищити привілеї понад те, що передав викликач.
  • Спільний бюджет обчислень: споживання CU викликаним зменшує залишковий бюджет викликача.
  • Реентерабельність: пряма самостійна рекурсія дозволена (A->A->A). Непряма реентерабельність заборонена (A->B->A повертає ReentrancyNotAllowed).

Обмеження

ОбмеженняЗначенняДжерело
Макс. глибина стеку інструкцій5 (9 з SIMD-0268)MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268
Вартість виклику CPI1,000 CU (946 з SIMD-0339)DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339
Макс. підписувачів PDA на CPI16MAX_SIGNERS
Макс. розмір instruction data для CPI10 КіБ (10,240 байтів)MAX_INSTRUCTION_DATA_LEN
Макс. розмір даних, що повертаються1,024 байтиMAX_RETURN_DATA
Макс. кількість account infos для CPI128 (255 з SIMD-0339)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
Вартість серіалізації CPI1 CU на 250 байтівcpi_bytes_per_unit
Макс. зміна розміру даних акаунта на CPI10,240 байтів (10 КіБ)MAX_PERMITTED_DATA_INCREASE

invoke проти invoke_signed

Solana надає дві функції для здійснення CPI:

ФункціяВипадок використанняПідписання PDA
invokeCPI, де всі необхідні підписувачі вже підписали початкову транзакціюНі
invoke_signedCPI, де програма, що викликає, повинна підписати від імені PDA, яким вона володієТак, через сіди підписувача

Під капотом invoke просто викликає invoke_signed з порожнім масивом сідів підписувача. Використовуйте invoke, коли вам не потрібне підписання PDA, і invoke_signed, коли програма повинна авторизувати дію від імені PDA.

Обидві функції зрештою викликають один і той самий системний виклик (sol_invoke_signed_rust) і проходять через один і той самий шлях виконання (cpi_common). Єдина різниця полягає в тому, чи надаються сіди підписувача. Коли сіди надаються, середовище виконання виводить публічні ключі PDA та додає їх до набору дійсних підписувачів перед перевіркою привілеїв.

Is this page helpful?

Зміст

Редагувати сторінку

Керується

© 2026 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку