Conceptos básicos de CPI
10 ejemplos para empezar con las CPI: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con las CPI: 7 básicos y 3 intermedios.
invoke simpleLlama a la transferencia del Programa del Sistema desde tu programa.
use solana_program::program::invoke;
use solana_program::system_instruction;
invoke(
&system_instruction::transfer(from.key, to.key, lamports),
&[from.clone(), to.clone()],
)?;callee) está incrustado en la Instruction.? para propagar errores de CPI.InstructionConstruye una Instruction con el ID del programa, las cuentas y los datos.
use solana_program::instruction::{AccountMeta, Instruction};
let ix = Instruction {
program_id: *token_program.key, // Pubkey por valor; `key` es un campo en AccountInfo
accounts: vec![/* AccountMeta */],
data: vec![/* opcode */],
};Instruction.program_id es un Pubkey, así que desreferencia AccountInfo::key (&Pubkey). En Anchor, token_program.key() se resuelve en su lugar a través del trait Key.spl-token) para la codificación.IncorrectProgramId.AccountInfoinvoke necesita referencias AccountInfo propias en el slice.
&[payer.clone(), vault.clone(), system_program.clone()]clone en AccountInfo es una clonación de referencia barata.AccountMeta.Una CPI fallida hace fallar tu instrucción.
invoke(&ix, accounts).map_err(|e| {
solana_program::msg!("cpi failed");
e
})?;Pasa la cuenta del programa de tokens/sistema como de solo lectura.
let system_program = next_account_info(iter)?;
if system_program.key != &system_program::ID {
return Err(ProgramError::IncorrectProgramId);
}invoke.signer)La CPI no puede añadir firmas que las billeteras no proporcionaron.
if !payer.is_signer {
return Err(ProgramError::MissingRequiredSignature);
}invoke_signed.Algunas CPI solo leen el estado del programa llamado.
// ej. lectura de oráculo - aún pasa las cuentaswritable debe ser false si no se está mutando.over-writable) son hallazgos de auditoría.invoke_signed para PDAEl programa firma la CPI en nombre del PDA.
invoke_signed(&ix, accounts, &[&[b"vault", &[bump]]])?;invoke vs invoke_signed.Relacionado: invoke vs invoke_signed
Transfiere tokens con el programa de tokens.
use spl_token::instruction as token_ix;
let ix = token_ix::transfer(
token_program.key,
source.key,
dest.key,
authority.key,
&[],
amount,
)?;
invoke(&ix, &[source.clone(), dest.clone(), authority.clone(), token_program.clone()])?;invoke_signed.mint entre las cuentas.checked amount math) antes de la CPI.Relacionado: CPI a SPL Token
Las CPI pueden llamar a programas que a su vez hacen CPI - profundidad máxima 4.
// Tu programa -> Token -> ... presupuesto de profundidadRelacionado: Profundidad y Límites de CPI
Versiones de la pila: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.
Revisado por Chris St. John·Última actualización: 16 jul 2026