Test Complet
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);}}}
Points Clés
- Multiple Programs : Déployez tous les programmes impliqués dans la chaîne de Cross Program Invocation
- Program IDs : Transmettez l'identifiant du programme appelé en tant que compte dans l'instruction
- System Program : Souvent nécessaire pour les opérations de Cross Program Invocation (transferts, création de comptes, etc.)
- Vérification des logs : Consultez les logs pour vérifier que tous les programmes de la chaîne d'appel ont bien été exécutés
Pour des informations plus détaillées sur le déploiement, lisez cette section.
Comprendre les Logs de Cross Program Invocation
Lorsqu'un Cross Program Invocation se produit, vous verrez des logs tels que :
Program A invoke [1]Program B invoke [2]Program B successProgram A success
Les chiffres entre crochets indiquent la profondeur d'appel.
Is this page helpful?