Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

310
Visualizações
Use PDA account as shared Storage solana

My intent here is to have account that can store data to be used by program. I will be passing this account in every call I make to my onchain program. And if I try to call allocate from onchain, then it's results in <pda-address>'s writable permission escalated

It seems that having an PDA is good idea for this as only my program will be able to make use of it. But I am not sure how do I do it exactly. This is what I tried so far

  • derive an PDA in front-end side
  • Pass it as other normal account
  • Program treat first AccountInfo received as PDA and use it to store data

Error with above approach:

  • I need to allocate space to store data in PDA. But since PDA do not have Secret Key and for that reason no KeyPair, I can't call calls like allocateSpace.

What am I missing here? I am new to solana so I might have missed even a simplest thing.

Client side

const deposit_instruction = new solana.TransactionInstruction({
        keys: [
            { pubkey: system_account, isSigner: false, isWriteable: false },
            { pubkey: payer.publicKey, isSigner: true, isWritable: true },
            { pubkey: pdaAccount, isSigner: false, isWriteable: false },
            { pubkey: sender.publicKey, isSigner: true, isWriteable: true },
            { pubkey: receiver, isSigner: false, isWriteable: false },
        ],
        programId: programId,
        data: argument_ser,
    });

    return await callEntryPoint(deposit_instruction, [sender, payer]);

Onchain program

 let instruction = system_instruction::allocate(pda_account.key, 100u64);

        invoke_signed(
            &instruction,
            &[pda_account.clone(), system_account.clone()],
            &[&[SEED], &[&[bump]]],
        )?;
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

  1. Make sure you derived that PDA from your on-chain program.

  2. In the on-chain program use invoked_signed instead of invoked to system_program.

Since that's PDA derived from your program, only your program can sign that PDA.

about 4 years ago · Juan Pablo Isaza Relatório

0

Use PublicKey.findProgramAddress to get a program key and bump value. Send that to the instruction in your program. Then within your program invoke the system_instruction::create_account to create the PDA with storage (up to 10k).

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda