Cross Program Invocation

Cross Program Invocation (CPI)은 한 프로그램이 실행 중에 다른 프로그램의 인스트럭션을 호출하는 것입니다. CPI는 구성 가능성을 제공합니다: 네트워크의 모든 프로그램의 인스트럭션은 다른 모든 프로그램에 의해 호출될 수 있습니다.

Cross-program invocation 예시Cross-program invocation 예시

주요 사항

  • 두 가지 함수: invoke (PDA 서명 없음) 및 invoke_signed (PDA 서명 포함).
  • 권한 확장: 계정 권한(서명자, 쓰기 가능)은 호출자에서 피호출자로 확장됩니다. 피호출자는 호출자가 전달한 것 이상으로 권한을 상승시킬 수 없습니다.
  • 공유 컴퓨팅 예산: 피호출자의 CU 소비는 호출자의 남은 예산을 감소시킵니다.
  • 재진입: 직접 자기 재귀는 허용됩니다(A->A->A). 간접 재진입은 허용되지 않습니다(A->B->A는 *rsReentrancyNotAllowed*를 반환).

제한사항

제한사항출처
최대 인스트럭션 스택 깊이5 (SIMD-0268에서 9)MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268
CPI 호출 비용1,000 CU (SIMD-0339에서 946)DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339
CPI당 최대 PDA 서명자16MAX_SIGNERS
최대 CPI instruction data10 KiB (10,240바이트)MAX_INSTRUCTION_DATA_LEN
최대 반환 데이터1,024바이트MAX_RETURN_DATA
최대 CPI 계정 정보128 (SIMD-0339에서 255)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
CPI 직렬화 비용250바이트당 1 CUcpi_bytes_per_unit
CPI당 최대 계정 데이터 재할당10,240바이트 (10 KiB)MAX_PERMITTED_DATA_INCREASE

invoke vs invoke_signed

Solana는 CPI를 수행하기 위한 두 가지 함수를 제공합니다:

함수사용 사례PDA 서명
invoke필요한 모든 서명자가 이미 원본 트랜잭션에 서명한 CPI아니오
invoke_signed호출 프로그램이 소유한 PDA를 대신하여 서명해야 하는 CPI예, 서명자 시드를 통해

내부적으로 *rsinvoke*는 빈 서명자 시드 배열로 *rsinvoke_signed*를 호출합니다. PDA 서명이 필요하지 않을 때는 *rsinvoke*를 사용하고, 프로그램이 PDA를 대신하여 작업을 승인해야 할 때는 *rsinvoke_signed*를 사용하세요.

두 함수 모두 궁극적으로 동일한 시스템 콜(sol_invoke_signed_rust)을 트리거하고 동일한 런타임 경로(cpi_common)를 통과합니다. 유일한 차이점은 서명자 시드가 제공되는지 여부입니다. 시드가 제공되면 런타임은 PDA 공개 키를 파생하고 권한 검사 전에 유효한 서명자 집합에 추가합니다.

Is this page helpful?

목차

페이지 편집

관리자

© 2026 솔라나 재단.
모든 권리 보유.
연결하기