es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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ón initialize del programa.

    Para solucionar este error, puedes modificar el código del cliente para incluir la cuenta sandboxAccount en la matriz de instructions, de modo que se inicialice en la misma transacción. Aquí hay un ejemplo:

    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: [
          anchor.web3.SystemProgram.createAccount({
            fromPubkey: keypair.publicKey,
            newAccountPubkey: sandboxPda,
            space: SandboxAccount.space,
            lamports: await provider.connection.getMinimumBalanceForRentExemption(SandboxAccount.space),
            programId: program.programId,
          }),
        ],
      });
    

    En este código modificado, estamos utilizando la instrucción SystemProgram.createAccount para crear la cuenta sandboxPda, e incluyéndola en la matriz de instructions junto con la instrucción initialize del programa. Esto debería inicializar la cuenta PDA y solucionar el error de CPI que estás recibiendo.

Comments are closed.