SVM: Move `TransactionAccountStateInfo` to svm and decouple from `bank` (#34981)
This commit is contained in:
parent
79bbe4381a
commit
2455dc1a69
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
pub mod account_loader;
|
||||
pub mod account_rent_state;
|
||||
pub mod transaction_account_state_info;
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue