Allow program accounts to be passed as program and parameter (#8907)

This commit is contained in:
Jack May
2020-03-17 12:06:15 -07:00
committed by GitHub
parent 46fcab14dd
commit 61514e3b0e
2 changed files with 308 additions and 428 deletions

View File

@ -158,6 +158,14 @@ pub fn process_instruction(
if is_executable(keyed_accounts)? {
let mut keyed_accounts_iter = keyed_accounts.iter();
let program = next_keyed_account(&mut keyed_accounts_iter)?;
let parameter_accounts = keyed_accounts_iter.as_slice();
let parameter_bytes = serialize_parameters(
program.unsigned_key(),
parameter_accounts,
&instruction_data,
)?;
{
let program_account = program.try_account_ref_mut()?;
let (mut vm, heap_region) = match create_vm(&program_account.data) {
Ok(info) => info,
@ -166,12 +174,6 @@ pub fn process_instruction(
return Err(BPFLoaderError::VirtualMachineCreationFailed.into());
}
};
let parameter_accounts = keyed_accounts_iter.as_slice();
let parameter_bytes = serialize_parameters(
program.unsigned_key(),
parameter_accounts,
&instruction_data,
)?;
info!("Call BPF program");
match vm.execute_program(parameter_bytes.as_slice(), &[], &[heap_region]) {
@ -187,6 +189,7 @@ pub fn process_instruction(
return Err(BPFLoaderError::VirtualMachineFailedToRunProgram.into());
}
}
}
deserialize_parameters(parameter_accounts, &parameter_bytes)?;
info!("BPF program success");
} else if !keyed_accounts.is_empty() {

File diff suppressed because it is too large Load Diff