Pasar Cuentas Restantes
Pasa remaining_accounts a las CPIs cuando el programa llamado espera listas de cuentas variables (enrutamiento, oráculos, swaps de múltiples saltos).
Busca en todas las páginas de la documentación
Pasa remaining_accounts a las CPIs cuando el programa llamado espera listas de cuentas variables (enrutamiento, oráculos, swaps de múltiples saltos).
let mut cpi_ctx = CpiContext::new(program, accounts);
cpi_ctx = cpi_ctx.with_remaining_accounts(
ctx.remaining_accounts.iter().map(|a| a.to_account_info()).collect(),
);Cuándo usar esto: El programa llamado documenta cuentas más allá de su diseño fijo de IDL.
use anchor_lang::prelude::*;
declare_program!(target);
pub const MAX_REMAINING: usize = 8;
#[error_code]
pub enum RelayError {
#[msg("La cuenta restante tiene un propietario inesperado")]
BadAccount,
#[msg("Demasiadas cuentas restantes")]
TooMany,
}
#[derive(Accounts)]
pub struct Relay<'info> {
pub admin: Signer<'info>,
pub target_program: Program<'info, target::program::Target>,
}
pub fn relay(ctx: Context<Relay>) -> Result<()> {
require!(
ctx.remaining_accounts.len() <= MAX_REMAINING,
RelayError::TooMany
);
for acc in ctx.remaining_accounts.iter() {
require_keys_eq!(*acc.owner, target::ID, RelayError::BadAccount);
}
let mut cpi_ctx = CpiContext::new(
ctx.accounts.target_program.to_account_info(),
target::cpi::accounts::Handle { admin: ctx.accounts.admin.to_account_info() },
);
cpi_ctx = cpi_ctx.with_remaining_accounts(ctx.remaining_accounts.to_vec());
target::cpi::handle(cpi_ctx)?;
Ok(())
}Lo que esto demuestra:
declare_programLos clientes añaden cuentas después de las cuentas fijas de la IDL en las metadatos de la transacción. Un desajuste causa fallos en el programa llamado o errores de seguridad.
Iterar sobre grandes conjuntos restantes cuesta CU; limita el número con require!(len <= MAX).
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Estructura de cuenta fija | Diseño conocido | Enrutadores dinámicos |
| Metadatos de cuenta en datos de instrucción | Patrones raros | remaining_accounts estándar |
Códigos personalizados en la IDL más cadenas #[msg].
emit_cpi! cuesta más CU pero mejora la fiabilidad de la captura.
Evitar excepto detrás de indicadores de características.
Desde la IDL a través de la generación de código de Anchor o Codama.
Sí, los tipos #[event] están listados.
Sí, con @ MyError::Variant.
Cada línea de registro y cadena formateada.
anchor test esperando códigos de error.
Sí, pero no un contrato de API; usar eventos.
Ver Relacionados para CPIs restantes.
ctx.remaining_accountsVersiones 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