Forma adecuada de inicializar dispositivos PDA dentro del marco de trabajo de Solana Anchor.
Estoy intentando escribir un programa simple de Solana usando Rust/Anchor que utiliza una PDA, pero obtengo un error de CPI cuando intento invocarlo, incluso si no hay CPI sucediendo (tal vez por la inicialización de la cuenta PDA).
Aquí está el código del programa:
use anchor_lang::prelude::*;
declare_id!("51v31qHaEQniLoYuvvtXByZcfiyvog3R2EKC39EPD52p");
#[program]
pub mod solana_sandbox {
use super::*;
pub fn initialize(ctx: Context<initialize>, bump: u8) -> ProgramResult {
ctx.accounts.sandbox_account.bump = bump;
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(mut)]
pub signer: Signer<'info>,
#[account(
init,
seeds = [b"seed".as_ref()],
bump,
payer = signer,
)]
pub sandbox_account: Account<'info, SandboxAccount>,
pub system_program: Program<'info, System>,
}
#[account]
#[derive(Default)]
pub struct SandboxAccount {
pub bump: u8,
}
Aquí está el código del cliente:
const [sandboxPda, sandboxBump] = await PublicKey.findProgramAddress([Buffer.from('seed')], SystemProgram.programId);
await program.rpc.initialize(
sandboxBump,
{
accounts: {
signer: keypair.publicKey,
sandboxAccount: sandboxPda,
systemProgram: anchor.web3.SystemProgram.programId,
},
signers: [keypair],
instructions: []
});
Cuando ejecuto lo anterior, obtengo lo siguiente:
Transaction simulation failed: Error processing Instruction 0: Cross-program invocation with unauthorized signer or writable account Program 51v31qHaEQniLoYuvvtXByZcfiyvog3R2EKC39EPD52p invoke [1] 8ZiyjNgnFFPyw39NyMQE5FGETTjyUhSHUVQG3oKAFZiU's signer privilege escalated Program 51v31qHaEQniLoYuvvtXByZcfiyvog3R2EKC39EPD52p consumed 200000 of 200000 compute units Program 51v31qHaEQniLoYuvvtXByZcfiyvog3R2EKC39EPD52p failed: Cross-program invocation with unauthorized signer or writable account
8ZiyjNgnFFPyw39NyMQE5FGETTjyUhSHUVQG3oKAFZiU
es la dirección PDA que paso, y estoy usando anchor-cli 0.18.0
.
davy.ai
Es posible que el error de CPI que estás recibiendo al invocar el programa Solana con Rust/Anchor usando una cuenta PDA se deba a la inicialización de la cuenta PDA.
Al observar el código de tu programa y el código del cliente, parece que la cuenta
sandboxPda
se está creando como una cuenta no inicializada, que debe ser inicializada en la misma transacción que la instruccióninitialize
del programa.Para solucionar este error, puedes modificar el código del cliente para incluir la cuenta
sandboxAccount
en la matriz deinstructions
, de modo que se inicialice en la misma transacción. Aquí hay un ejemplo:En este código modificado, estamos utilizando la instrucción
SystemProgram.createAccount
para crear la cuentasandboxPda
, e incluyéndola en la matriz deinstructions
junto con la instruccióninitialize
del programa. Esto debería inicializar la cuenta PDA y solucionar el error de CPI que estás recibiendo.