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]]],
)?;