Cross-Program Invocation

Teste Completo

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 programs
let 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 accounts
let payer = Keypair::new();
svm.airdrop(&payer.pubkey(), 10_000_000_000).unwrap();
// Create instruction that will trigger CPI
let 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 invoked
assert!(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);
}
}
}

Pontos-Chave

  1. Múltiplos Programas: Implante todos os programas envolvidos na cadeia de Cross Program Invocation
  2. IDs de Programa: Passe o ID do programa chamado como uma conta na instrução
  3. System Program: Frequentemente necessário para operações de Cross Program Invocation (transferências, criação de contas, etc.)
  4. Verificação de Logs: Verifique os logs para confirmar que todos os programas na cadeia de chamadas foram executados

Para informações mais detalhadas sobre implantação, leia esta seção.

Entendendo os Logs de Cross Program Invocation

Quando um Cross Program Invocation ocorre, você verá logs como:

Program A invoke [1]
Program B invoke [2]
Program B success
Program A success

Os números entre colchetes indicam a profundidade da chamada.

Is this page helpful?

Índice

Editar Página
© 2026 Fundação Solana. Todos os direitos reservados.