Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

303
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!