I currently have a PDA account with the following structure:
#[derive(AnchorSerialize, AnchorDeserialize)]pub struct NewFoo { pub foo_id: String,}#[derive(Accounts)]#[instruction(new_foo: NewFoo)]pub struct CreateFoo<'info> { #[account( init, space = 8 + Foo::INIT_SPACE, payer = sender, seeds = [ FOO_SEED.as_bytes(), new_foo.foo_id.as_bytes(), ], bump, )] pub foo: Account<'info, Foo>,
With this setup, the compiled IDL structure of the PDA account looks like this:
{"name": "foo","writable": true,"pda": {"seeds": [ {"kind": "const","value": [ 83, 116, 97, 116, 101, 109, 101, 110, 116 ] }, {"kind": "arg","path": "new_foo.foo_id" } ] } }
However, I modified the CreateFoo structure to use a hash function to generate one of the seeds. The updated structure is as follows:
use anchor_lang::{prelude::*, solana_program::hash::hash};#[derive(Accounts)]#[instruction(new_foo: NewFoo)]pub struct CreateFoo<'info> { #[account( init, space = 8 + Foo::INIT_SPACE, payer = sender, seeds = [ FOO_SEED.as_bytes(),&hash(&new_foo.foo_id.as_bytes()).to_bytes()[..], // changed this line ], bump, )] pub foo: Account<'info, Foo>,
After this change, I noticed that the compiled IDL structure no longer represents a PDA account. Instead, it appears as a regular account:
{"name": "foo","writable": true,}
My questions are:
- Is it correct for a PDA account generated using a hash function to compile like this? Are there any risks with this approach?
- Can a hash function be used to generate a seed for a PDA account? If yes, is this a common practice?
I appreciate any insights or guidance you can provide on this. Thank you in advance for your help and time!