완전한 테스트
tests/cpi_test.rs
use litesvm::LiteSVM;use solana_sdk::{instruction::{AccountMeta, Instruction},pubkey::Pubkey,signature::{Keypair, Signer},transaction::Transaction,system_program,};#[test]fn test_cross_program_invocation() {let mut svm = LiteSVM::new();// Deploy both programslet caller_program = Pubkey::new_unique();let callee_program = Pubkey::new_unique();svm.add_program(caller_program,include_bytes!("../target/deploy/caller.so")).unwrap();svm.add_program(callee_program,include_bytes!("../target/deploy/callee.so")).unwrap();// Setup accountslet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10_000_000_000).unwrap();// Create instruction that will trigger CPIlet instruction = Instruction {program_id: caller_program,accounts: vec![AccountMeta::new(payer.pubkey(), true),AccountMeta::new_readonly(callee_program, false),AccountMeta::new_readonly(system_program::id(), false),],data: vec![1], // Instruction to trigger CPI};let tx = Transaction::new_signed_with_payer(&[instruction],Some(&payer.pubkey()),&[&payer],svm.latest_blockhash(),);let result = svm.send_transaction(tx).unwrap();// Verify both programs were invokedassert!(result.logs.iter().any(|log|log.contains(&format!("Program {} invoke", caller_program))));assert!(result.logs.iter().any(|log|log.contains(&format!("Program {} invoke", callee_program))));println!("CPI successful!");println!("Logs showing both programs:");for log in &result.logs {if log.contains("invoke") {println!(" {}", log);}}}
핵심 사항
- 여러 프로그램: CPI 체인에 관련된 모든 프로그램을 배포합니다
- 프로그램 ID: 명령어의 계정으로 피호출 프로그램 ID를 전달합니다
- System Program: CPI 작업(전송, 계정 생성 등)에 종종 필요합니다
- 로그 검증: 호출 체인의 모든 프로그램이 실행되었는지 로그를 확인합니다
보다 자세한 배포 정보는 이 섹션을 참고하세요.
Cross Program Invocation 로그 이해하기
Cross Program Invocation이 발생하면 다음과 같은 로그가 표시됩니다:
Program A invoke [1]Program B invoke [2]Program B successProgram A success
괄호 안의 숫자는 호출 깊이를 나타냅니다.
Is this page helpful?