Before: There seemed to be a lack of solana nostd entrypoint documentation, I couldn't find any good resources.
I made solana program using solana_nostd_entrypoint
.I want to create PDA account using InstructionC
.
let rent = solana_program::rent::Rent::default(); let space = 1000; let rent_lamports = rent.minimum_balance(space); let mut instruction_data = [0u8; 56]; instruction_data[4..12].copy_from_slice(&rent_lamports.to_le_bytes()); instruction_data[12..20].copy_from_slice(&space.to_le_bytes()); instruction_data[20..52].copy_from_slice(program_id.as_ref()); let instruction_accounts = [signer.to_meta_c(), game_pda.to_meta_c()]; let instruction = InstructionC { program_id: &system_program::ID, accounts: instruction_accounts.as_ptr(), accounts_len: instruction_accounts.len() as u64, data: instruction_data.as_ptr(), data_len: instruction_data.len() as u64, }; let infos = [signer.to_info_c(), game_pda.to_info_c()]; let seeds: &[&[&[u8]]] = &[&[GAME_PDA, &[GAME_PDA_BUMP]]]; #[cfg(target_os = "solana")] unsafe { solana_program::syscalls::sol_invoke_signed_c(&instruction as *const InstructionC as *const u8, infos.as_ptr() as *const u8, infos.len() as u64, seeds.as_ptr() as *const u8, seeds.len() as u64, ); }
But sol_invoke_signed_c fails because of lack of pda signature. Error log:
transactionLogs: ['Program ProgramID invoke [1]','Program 11111111111111111111111111111111 invoke [2]',"Allocate: 'to' account Address { address: PDA account here, base: None } must sign",'Program 11111111111111111111111111111111 failed: missing required signature for instruction','Program ProgramID consumed 1555 of 200000 compute units','Program ProgramID failed: missing required signature for instruction' ]
Am I wrong to pass pda seeds
and bump
to sol_invoke_signed_c syscall
cpi?
How can I fix this error?