SVM: Move `TransactionAccountStateInfo` to svm and decouple from `bank` (#34981)

This commit is contained in:
Pankaj Garg 2024-01-27 11:10:09 -08:00 committed by GitHub
parent 79bbe4381a
commit 2455dc1a69
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 33 additions and 23 deletions

View File

@ -59,7 +59,10 @@ use {
},
stakes::{InvalidCacheEntryReason, Stakes, StakesCache, StakesEnum},
status_cache::{SlotDelta, StatusCache},
svm::account_loader::load_accounts,
svm::{
account_loader::load_accounts,
transaction_account_state_info::TransactionAccountStateInfo,
},
transaction_batch::TransactionBatch,
},
byteorder::{ByteOrder, LittleEndian},
@ -230,7 +233,6 @@ mod serde_snapshot;
mod sysvar_cache;
#[cfg(test)]
pub(crate) mod tests;
mod transaction_account_state_info;
pub const SECONDS_PER_YEAR: f64 = 365.25 * 24.0 * 60.0 * 60.0;
@ -4862,8 +4864,11 @@ impl Bank {
#[cfg(debug_assertions)]
transaction_context.set_signature(tx.signature());
let pre_account_state_info =
self.get_transaction_account_state_info(&transaction_context, tx.message());
let pre_account_state_info = TransactionAccountStateInfo::new(
&self.rent_collector.rent,
&transaction_context,
tx.message(),
);
let log_collector = if enable_log_recording {
match log_messages_bytes_limit {
@ -4908,9 +4913,12 @@ impl Bank {
let mut status = process_result
.and_then(|info| {
let post_account_state_info =
self.get_transaction_account_state_info(&transaction_context, tx.message());
self.verify_transaction_account_state_changes(
let post_account_state_info = TransactionAccountStateInfo::new(
&self.rent_collector.rent,
&transaction_context,
tx.message(),
);
TransactionAccountStateInfo::verify_changes(
&pre_account_state_info,
&post_account_state_info,
&transaction_context,

View File

@ -11014,8 +11014,12 @@ fn test_rent_state_list_len() {
);
assert_eq!(
bank.get_transaction_account_state_info(&transaction_context, sanitized_tx.message())
.len(),
TransactionAccountStateInfo::new(
&bank.rent_collector.rent,
&transaction_context,
sanitized_tx.message()
)
.len(),
num_accounts,
);
}

View File

@ -1,2 +1,3 @@
pub mod account_loader;
pub mod account_rent_state;
pub mod transaction_account_state_info;

View File

@ -1,9 +1,10 @@
use {
crate::{bank::Bank, svm::account_rent_state::RentState},
crate::svm::account_rent_state::RentState,
solana_sdk::{
account::ReadableAccount,
message::SanitizedMessage,
native_loader,
rent::Rent,
transaction::Result,
transaction_context::{IndexOfAccount, TransactionContext},
},
@ -13,12 +14,12 @@ pub(crate) struct TransactionAccountStateInfo {
rent_state: Option<RentState>, // None: readonly account
}
impl Bank {
pub(crate) fn get_transaction_account_state_info(
&self,
impl TransactionAccountStateInfo {
pub(crate) fn new(
rent: &Rent,
transaction_context: &TransactionContext,
message: &SanitizedMessage,
) -> Vec<TransactionAccountStateInfo> {
) -> Vec<Self> {
(0..message.account_keys().len())
.map(|i| {
let rent_state = if message.is_writable(i) {
@ -31,10 +32,7 @@ impl Bank {
// balances; however they will never be loaded as writable
debug_assert!(!native_loader::check_id(account.owner()));
Some(RentState::from_account(
&account,
&self.rent_collector().rent,
))
Some(RentState::from_account(&account, rent))
} else {
None
};
@ -46,15 +44,14 @@ impl Bank {
} else {
None
};
TransactionAccountStateInfo { rent_state }
Self { rent_state }
})
.collect()
}
pub(crate) fn verify_transaction_account_state_changes(
&self,
pre_state_infos: &[TransactionAccountStateInfo],
post_state_infos: &[TransactionAccountStateInfo],
pub(crate) fn verify_changes(
pre_state_infos: &[Self],
post_state_infos: &[Self],
transaction_context: &TransactionContext,
) -> Result<()> {
for (i, (pre_state_info, post_state_info)) in