Index loaders / executable accounts (#19469)
* Appends loaders / executable_accounts to accounts in transaction loading. * Adds indices to loaders / executable_accounts. * Moves MessageProcessor::create_keyed_accounts() into InvokeContext::push(). * Removes "executable_accounts", now referenced by transaction wide index into "accounts". * Removes create_pre_accounts() from InstructionProcessor, as it is already in MessageProcessor. * Collect program account indices directly in load_executable_accounts().
This commit is contained in:
committed by
GitHub
parent
4386e09710
commit
88c1b8f047
@ -254,14 +254,6 @@ impl solana_sdk::program_stubs::SyscallStubs for SyscallStubs {
|
||||
let message = Message::new(&[instruction.clone()], None);
|
||||
let program_id_index = message.instructions[0].program_id_index as usize;
|
||||
let program_id = message.account_keys[program_id_index];
|
||||
let program_account_info = || {
|
||||
for account_info in account_infos {
|
||||
if account_info.unsigned_key() == &program_id {
|
||||
return account_info;
|
||||
}
|
||||
}
|
||||
panic!("Program id {} wasn't found in account_infos", program_id);
|
||||
};
|
||||
let demote_program_write_locks =
|
||||
invoke_context.is_feature_active(&demote_program_write_locks::id());
|
||||
// TODO don't have the caller's keyed_accounts so can't validate writer or signer escalation or deescalation yet
|
||||
@ -274,6 +266,7 @@ impl solana_sdk::program_stubs::SyscallStubs for SyscallStubs {
|
||||
|
||||
stable_log::program_invoke(&logger, &program_id, invoke_context.invoke_depth());
|
||||
|
||||
// Convert AccountInfos into Accounts
|
||||
fn ai_to_a(ai: &AccountInfo) -> AccountSharedData {
|
||||
AccountSharedData::from(Account {
|
||||
lamports: ai.lamports(),
|
||||
@ -283,12 +276,6 @@ impl solana_sdk::program_stubs::SyscallStubs for SyscallStubs {
|
||||
rent_epoch: ai.rent_epoch,
|
||||
})
|
||||
}
|
||||
let executables = vec![(
|
||||
program_id,
|
||||
Rc::new(RefCell::new(ai_to_a(program_account_info()))),
|
||||
)];
|
||||
|
||||
// Convert AccountInfos into Accounts
|
||||
let mut accounts = vec![];
|
||||
'outer: for key in &message.account_keys {
|
||||
for account_info in account_infos {
|
||||
@ -304,6 +291,9 @@ impl solana_sdk::program_stubs::SyscallStubs for SyscallStubs {
|
||||
message.account_keys.len(),
|
||||
"Missing or not enough accounts passed to invoke"
|
||||
);
|
||||
let (program_account_index, _program_account) =
|
||||
invoke_context.get_account(&program_id).unwrap();
|
||||
let program_indices = vec![program_account_index];
|
||||
|
||||
// Check Signers
|
||||
for account_info in account_infos {
|
||||
@ -331,7 +321,7 @@ impl solana_sdk::program_stubs::SyscallStubs for SyscallStubs {
|
||||
|
||||
InstructionProcessor::process_cross_program_instruction(
|
||||
&message,
|
||||
&executables,
|
||||
&program_indices,
|
||||
&accounts,
|
||||
&caller_privileges,
|
||||
invoke_context,
|
||||
|
Reference in New Issue
Block a user