Cross Program Invocation

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

Пример cross-program invocationПример cross-program invocation

Основные факты

  • Две функции: invoke (без подписи PDA) и invoke_signed (с подписью PDA).
  • Расширение привилегий: Привилегии аккаунта (signer, writable) передаются от вызывающей программы к вызываемой. Вызываемая программа не может повысить привилегии сверх переданных.
  • Общий бюджет вычислений: Использование 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
Максимальный размер данных инструкции CPI10 КиБ (10 240 байт)MAX_INSTRUCTION_DATA_LEN
Максимальный размер возвращаемых данных1 024 байтаMAX_RETURN_DATA
Максимум CPI account infos128 (255 с SIMD-0339)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
Стоимость сериализации CPI1 CU за 250 байтcpi_bytes_per_unit
Максимальный realloc данных аккаунта на CPI10 240 байт (10 КиБ)MAX_PERMITTED_DATA_INCREASE

invoke против invoke_signed

Solana предоставляет две функции для выполнения CPI:

ФункцияСценарий использованияПодпись от PDA
invokeCPI, где все необходимые подписанты уже подписали исходную транзакциюНет
invoke_signedCPI, где вызывающая программа должна подписывать от имени принадлежащего ей PDAДа, через signer seeds

Внутри invoke просто вызывает invoke_signed с пустым массивом signer seeds. Используйте invoke, когда подпись PDA не требуется, и invoke_signed — когда программе нужно авторизовать действие от имени PDA.

Обе функции в конечном итоге вызывают один и тот же системный вызов (sol_invoke_signed_rust) и проходят по одному и тому же пути выполнения (cpi_common). Единственное различие — предоставляются ли signer seeds. Если seeds указаны, рантайм вычисляет PDA pubkey и добавляет их в список допустимых подписантов до проверки привилегий.

Is this page helpful?

Содержание

Редактировать страницу

Управляется

© 2026 Solana Foundation.
Все права защищены.
Связаться с нами