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