Refactor: Rebase offset of `index_in_caller` (#25531)
* Removes the offset InstructionContext::get_number_of_program_accounts() from InstructionAccount::index_in_caller. * Removes unreachable SyscallError::InvalidLength in orig_data_lens.get().
This commit is contained in:
parent
7b98ff1929
commit
f10c80b49f
|
@ -601,7 +601,7 @@ impl<'a> InvokeContext<'a> {
|
|||
.get_account_at_index(instruction_account.index_in_transaction)?;
|
||||
let is_writable = if before_instruction_context_push {
|
||||
instruction_context
|
||||
.try_borrow_account(
|
||||
.try_borrow_instruction_account(
|
||||
self.transaction_context,
|
||||
instruction_account.index_in_caller,
|
||||
)?
|
||||
|
@ -772,6 +772,9 @@ impl<'a> InvokeContext<'a> {
|
|||
} else {
|
||||
let index_in_caller = instruction_context
|
||||
.find_index_of_account(self.transaction_context, &account_meta.pubkey)
|
||||
.map(|index| {
|
||||
index.saturating_sub(instruction_context.get_number_of_program_accounts())
|
||||
})
|
||||
.ok_or_else(|| {
|
||||
ic_msg!(
|
||||
self,
|
||||
|
@ -791,7 +794,7 @@ impl<'a> InvokeContext<'a> {
|
|||
}
|
||||
}
|
||||
for instruction_account in deduplicated_instruction_accounts.iter() {
|
||||
let borrowed_account = instruction_context.try_borrow_account(
|
||||
let borrowed_account = instruction_context.try_borrow_instruction_account(
|
||||
self.transaction_context,
|
||||
instruction_account.index_in_caller,
|
||||
)?;
|
||||
|
@ -1142,7 +1145,7 @@ pub struct MockInvokeContextPreparation {
|
|||
pub fn prepare_mock_invoke_context(
|
||||
transaction_accounts: Vec<TransactionAccount>,
|
||||
instruction_account_metas: Vec<AccountMeta>,
|
||||
program_indices: &[usize],
|
||||
_program_indices: &[usize],
|
||||
) -> MockInvokeContextPreparation {
|
||||
let mut instruction_accounts: Vec<InstructionAccount> =
|
||||
Vec::with_capacity(instruction_account_metas.len());
|
||||
|
@ -1161,7 +1164,7 @@ pub fn prepare_mock_invoke_context(
|
|||
.unwrap_or(index_in_instruction);
|
||||
instruction_accounts.push(InstructionAccount {
|
||||
index_in_transaction,
|
||||
index_in_caller: program_indices.len().saturating_add(index_in_transaction),
|
||||
index_in_caller: index_in_transaction,
|
||||
index_in_callee,
|
||||
is_signer: account_meta.is_signer,
|
||||
is_writable: account_meta.is_writable,
|
||||
|
@ -1465,7 +1468,7 @@ mod tests {
|
|||
));
|
||||
instruction_accounts.push(InstructionAccount {
|
||||
index_in_transaction: index,
|
||||
index_in_caller: 1 + index,
|
||||
index_in_caller: index,
|
||||
index_in_callee: instruction_accounts.len(),
|
||||
is_signer: false,
|
||||
is_writable: true,
|
||||
|
@ -1478,7 +1481,7 @@ mod tests {
|
|||
));
|
||||
instruction_accounts.push(InstructionAccount {
|
||||
index_in_transaction: index,
|
||||
index_in_caller: 1 + index,
|
||||
index_in_caller: index,
|
||||
index_in_callee: index,
|
||||
is_signer: false,
|
||||
is_writable: false,
|
||||
|
@ -1507,14 +1510,14 @@ mod tests {
|
|||
let instruction_accounts = vec![
|
||||
InstructionAccount {
|
||||
index_in_transaction: not_owned_index,
|
||||
index_in_caller: 1 + not_owned_index,
|
||||
index_in_caller: not_owned_index,
|
||||
index_in_callee: 0,
|
||||
is_signer: false,
|
||||
is_writable: true,
|
||||
},
|
||||
InstructionAccount {
|
||||
index_in_transaction: owned_index,
|
||||
index_in_caller: 1 + owned_index,
|
||||
index_in_caller: owned_index,
|
||||
index_in_callee: 1,
|
||||
is_signer: false,
|
||||
is_writable: true,
|
||||
|
@ -1632,7 +1635,7 @@ mod tests {
|
|||
let instruction_accounts = (0..4)
|
||||
.map(|index_in_instruction| InstructionAccount {
|
||||
index_in_transaction: index_in_instruction,
|
||||
index_in_caller: 1 + index_in_instruction,
|
||||
index_in_caller: index_in_instruction,
|
||||
index_in_callee: index_in_instruction,
|
||||
is_signer: false,
|
||||
is_writable: index_in_instruction < 2,
|
||||
|
@ -1845,14 +1848,14 @@ mod tests {
|
|||
let instruction_accounts = [
|
||||
InstructionAccount {
|
||||
index_in_transaction: 0,
|
||||
index_in_caller: 1,
|
||||
index_in_caller: 0,
|
||||
index_in_callee: 0,
|
||||
is_signer: false,
|
||||
is_writable: true,
|
||||
},
|
||||
InstructionAccount {
|
||||
index_in_transaction: 1,
|
||||
index_in_caller: 2,
|
||||
index_in_caller: 1,
|
||||
index_in_callee: 1,
|
||||
is_signer: false,
|
||||
is_writable: false,
|
||||
|
|
|
@ -93,7 +93,7 @@ fn create_inputs() -> TransactionContext {
|
|||
.enumerate()
|
||||
.map(
|
||||
|(index_in_instruction, index_in_transaction)| InstructionAccount {
|
||||
index_in_caller: 1usize.saturating_add(index_in_instruction),
|
||||
index_in_caller: index_in_instruction,
|
||||
index_in_transaction,
|
||||
index_in_callee: index_in_instruction,
|
||||
is_signer: false,
|
||||
|
|
|
@ -2955,10 +2955,6 @@ fn get_translated_accounts<'a, T, F>(
|
|||
where
|
||||
F: Fn(&T, &InvokeContext) -> Result<CallerAccount<'a>, EbpfError<BpfError>>,
|
||||
{
|
||||
let instruction_context = invoke_context
|
||||
.transaction_context
|
||||
.get_current_instruction_context()
|
||||
.map_err(SyscallError::InstructionError)?;
|
||||
let mut accounts = Vec::with_capacity(instruction_accounts.len().saturating_add(1));
|
||||
|
||||
let program_account_index = program_indices
|
||||
|
@ -3010,28 +3006,19 @@ where
|
|||
account.set_rent_epoch(caller_account.rent_epoch);
|
||||
}
|
||||
let caller_account = if instruction_account.is_writable {
|
||||
let orig_data_len_index = instruction_account
|
||||
.index_in_caller
|
||||
.saturating_sub(instruction_context.get_number_of_program_accounts());
|
||||
let orig_data_lens = invoke_context
|
||||
.get_orig_account_lengths()
|
||||
.map_err(SyscallError::InstructionError)?;
|
||||
if orig_data_len_index < orig_data_lens.len() {
|
||||
caller_account.original_data_len = *orig_data_lens
|
||||
.get(orig_data_len_index)
|
||||
.ok_or(SyscallError::InvalidLength)?;
|
||||
} else {
|
||||
.get(instruction_account.index_in_caller)
|
||||
.ok_or_else(|| {
|
||||
ic_msg!(
|
||||
invoke_context,
|
||||
"Internal error: index mismatch for account {}",
|
||||
account_key
|
||||
);
|
||||
return Err(SyscallError::InstructionError(
|
||||
InstructionError::MissingAccount,
|
||||
)
|
||||
.into());
|
||||
}
|
||||
|
||||
SyscallError::InstructionError(InstructionError::MissingAccount)
|
||||
})?;
|
||||
Some(caller_account)
|
||||
} else {
|
||||
None
|
||||
|
|
|
@ -83,7 +83,7 @@ fn create_accounts() -> (
|
|||
let mut instruction_accounts = (0..4)
|
||||
.map(|index_in_instruction| InstructionAccount {
|
||||
index_in_transaction: 1usize.saturating_add(index_in_instruction),
|
||||
index_in_caller: 1usize.saturating_add(index_in_instruction),
|
||||
index_in_caller: index_in_instruction,
|
||||
index_in_callee: index_in_instruction,
|
||||
is_signer: false,
|
||||
is_writable: false,
|
||||
|
|
|
@ -133,7 +133,7 @@ impl MessageProcessor {
|
|||
let index_in_transaction = *index_in_transaction as usize;
|
||||
instruction_accounts.push(InstructionAccount {
|
||||
index_in_transaction,
|
||||
index_in_caller: program_indices.len().saturating_add(index_in_transaction),
|
||||
index_in_caller: index_in_transaction,
|
||||
index_in_callee,
|
||||
is_signer: message.is_signer(index_in_transaction),
|
||||
is_writable: message.is_writable(index_in_transaction),
|
||||
|
|
|
@ -25,7 +25,7 @@ pub struct InstructionAccount {
|
|||
pub index_in_transaction: usize,
|
||||
/// Points to the first occurrence in the parent `InstructionContext`
|
||||
///
|
||||
/// This includes the program accounts.
|
||||
/// This excludes the program accounts.
|
||||
pub index_in_caller: usize,
|
||||
/// Points to the first occurrence in the current `InstructionContext`
|
||||
///
|
||||
|
|
Loading…
Reference in New Issue