2021-12-03 09:00:31 -08:00
|
|
|
use {
|
2022-01-13 07:20:20 -08:00
|
|
|
super::{
|
|
|
|
storage::SerializableAccountStorageEntry,
|
|
|
|
utils::{serialize_iter_as_map, serialize_iter_as_seq},
|
|
|
|
*,
|
|
|
|
},
|
2022-04-11 14:07:52 -07:00
|
|
|
crate::{
|
|
|
|
ancestors::AncestorsForSerialization,
|
|
|
|
stakes::{serde_stakes_enum_compat, StakesEnum},
|
|
|
|
},
|
2021-12-03 09:00:31 -08:00
|
|
|
solana_measure::measure::Measure,
|
2022-07-29 10:10:22 -07:00
|
|
|
solana_sdk::{deserialize_utils::ignore_eof_error, stake::state::Delegation},
|
2022-02-01 03:39:53 -08:00
|
|
|
std::{cell::RefCell, collections::HashSet, sync::RwLock},
|
2021-12-03 09:00:31 -08:00
|
|
|
};
|
2021-05-20 08:11:56 -07:00
|
|
|
|
2022-07-06 15:30:30 -07:00
|
|
|
pub(super) type AccountsDbFields = super::AccountsDbFields<SerializableAccountStorageEntry>;
|
2020-07-13 07:00:59 -07:00
|
|
|
|
2022-05-22 18:00:42 -07:00
|
|
|
#[derive(Default, Clone, PartialEq, Eq, Debug, Deserialize, Serialize, AbiExample)]
|
2022-02-01 03:39:53 -08:00
|
|
|
struct UnusedAccounts {
|
|
|
|
unused1: HashSet<Pubkey>,
|
|
|
|
unused2: HashSet<Pubkey>,
|
|
|
|
unused3: HashMap<Pubkey, u64>,
|
|
|
|
}
|
|
|
|
|
2020-07-13 07:00:59 -07:00
|
|
|
// Deserializable version of Bank which need not be serializable,
|
|
|
|
// because it's handled by SerializableVersionedBank.
|
|
|
|
// So, sync fields with it!
|
|
|
|
#[derive(Clone, Deserialize)]
|
2022-01-13 07:20:20 -08:00
|
|
|
struct DeserializableVersionedBank {
|
|
|
|
blockhash_queue: BlockhashQueue,
|
|
|
|
ancestors: AncestorsForSerialization,
|
|
|
|
hash: Hash,
|
|
|
|
parent_hash: Hash,
|
|
|
|
parent_slot: Slot,
|
|
|
|
hard_forks: HardForks,
|
|
|
|
transaction_count: u64,
|
|
|
|
tick_height: u64,
|
|
|
|
signature_count: u64,
|
|
|
|
capitalization: u64,
|
|
|
|
max_tick_height: u64,
|
|
|
|
hashes_per_tick: Option<u64>,
|
|
|
|
ticks_per_slot: u64,
|
|
|
|
ns_per_slot: u128,
|
|
|
|
genesis_creation_time: UnixTimestamp,
|
|
|
|
slots_per_year: f64,
|
2022-03-17 18:14:54 -07:00
|
|
|
accounts_data_len: u64,
|
2022-01-13 07:20:20 -08:00
|
|
|
slot: Slot,
|
|
|
|
epoch: Epoch,
|
|
|
|
block_height: u64,
|
|
|
|
collector_id: Pubkey,
|
|
|
|
collector_fees: u64,
|
|
|
|
fee_calculator: FeeCalculator,
|
|
|
|
fee_rate_governor: FeeRateGovernor,
|
|
|
|
collected_rent: u64,
|
|
|
|
rent_collector: RentCollector,
|
|
|
|
epoch_schedule: EpochSchedule,
|
|
|
|
inflation: Inflation,
|
2022-04-08 06:45:26 -07:00
|
|
|
stakes: Stakes<Delegation>,
|
2021-10-05 22:24:48 -07:00
|
|
|
#[allow(dead_code)]
|
2022-01-13 07:20:20 -08:00
|
|
|
unused_accounts: UnusedAccounts,
|
|
|
|
epoch_stakes: HashMap<Epoch, EpochStakes>,
|
|
|
|
is_delta: bool,
|
2020-07-13 07:00:59 -07:00
|
|
|
}
|
|
|
|
|
2021-01-23 11:55:15 -08:00
|
|
|
impl From<DeserializableVersionedBank> for BankFieldsToDeserialize {
|
|
|
|
fn from(dvb: DeserializableVersionedBank) -> Self {
|
2020-07-13 07:00:59 -07:00
|
|
|
BankFieldsToDeserialize {
|
2021-01-23 11:55:15 -08:00
|
|
|
blockhash_queue: dvb.blockhash_queue,
|
|
|
|
ancestors: dvb.ancestors,
|
|
|
|
hash: dvb.hash,
|
|
|
|
parent_hash: dvb.parent_hash,
|
|
|
|
parent_slot: dvb.parent_slot,
|
|
|
|
hard_forks: dvb.hard_forks,
|
|
|
|
transaction_count: dvb.transaction_count,
|
|
|
|
tick_height: dvb.tick_height,
|
|
|
|
signature_count: dvb.signature_count,
|
|
|
|
capitalization: dvb.capitalization,
|
|
|
|
max_tick_height: dvb.max_tick_height,
|
|
|
|
hashes_per_tick: dvb.hashes_per_tick,
|
|
|
|
ticks_per_slot: dvb.ticks_per_slot,
|
|
|
|
ns_per_slot: dvb.ns_per_slot,
|
|
|
|
genesis_creation_time: dvb.genesis_creation_time,
|
|
|
|
slots_per_year: dvb.slots_per_year,
|
2022-03-17 18:14:54 -07:00
|
|
|
accounts_data_len: dvb.accounts_data_len,
|
2021-01-23 11:55:15 -08:00
|
|
|
slot: dvb.slot,
|
|
|
|
epoch: dvb.epoch,
|
|
|
|
block_height: dvb.block_height,
|
|
|
|
collector_id: dvb.collector_id,
|
|
|
|
collector_fees: dvb.collector_fees,
|
|
|
|
fee_calculator: dvb.fee_calculator,
|
2022-05-15 05:04:17 -07:00
|
|
|
fee_rate_governor: dvb.fee_rate_governor,
|
2021-01-23 11:55:15 -08:00
|
|
|
collected_rent: dvb.collected_rent,
|
|
|
|
rent_collector: dvb.rent_collector,
|
|
|
|
epoch_schedule: dvb.epoch_schedule,
|
|
|
|
inflation: dvb.inflation,
|
|
|
|
stakes: dvb.stakes,
|
|
|
|
epoch_stakes: dvb.epoch_stakes,
|
|
|
|
is_delta: dvb.is_delta,
|
2022-08-17 13:14:31 -07:00
|
|
|
incremental_snapshot_persistence: None,
|
2022-09-01 08:35:52 -07:00
|
|
|
epoch_accounts_hash: None,
|
2020-07-13 07:00:59 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-01-23 11:55:15 -08:00
|
|
|
|
2020-07-13 07:00:59 -07:00
|
|
|
// Serializable version of Bank, not Deserializable to avoid cloning by using refs.
|
|
|
|
// Sync fields with DeserializableVersionedBank!
|
|
|
|
#[derive(Serialize)]
|
2022-01-13 07:20:20 -08:00
|
|
|
struct SerializableVersionedBank<'a> {
|
|
|
|
blockhash_queue: &'a RwLock<BlockhashQueue>,
|
|
|
|
ancestors: &'a AncestorsForSerialization,
|
|
|
|
hash: Hash,
|
|
|
|
parent_hash: Hash,
|
|
|
|
parent_slot: Slot,
|
|
|
|
hard_forks: &'a RwLock<HardForks>,
|
|
|
|
transaction_count: u64,
|
|
|
|
tick_height: u64,
|
|
|
|
signature_count: u64,
|
|
|
|
capitalization: u64,
|
|
|
|
max_tick_height: u64,
|
|
|
|
hashes_per_tick: Option<u64>,
|
|
|
|
ticks_per_slot: u64,
|
|
|
|
ns_per_slot: u128,
|
|
|
|
genesis_creation_time: UnixTimestamp,
|
|
|
|
slots_per_year: f64,
|
2022-03-17 18:14:54 -07:00
|
|
|
accounts_data_len: u64,
|
2022-01-13 07:20:20 -08:00
|
|
|
slot: Slot,
|
|
|
|
epoch: Epoch,
|
|
|
|
block_height: u64,
|
|
|
|
collector_id: Pubkey,
|
|
|
|
collector_fees: u64,
|
|
|
|
fee_calculator: FeeCalculator,
|
|
|
|
fee_rate_governor: FeeRateGovernor,
|
|
|
|
collected_rent: u64,
|
|
|
|
rent_collector: RentCollector,
|
|
|
|
epoch_schedule: EpochSchedule,
|
|
|
|
inflation: Inflation,
|
2022-04-11 14:07:52 -07:00
|
|
|
#[serde(serialize_with = "serde_stakes_enum_compat::serialize")]
|
|
|
|
stakes: StakesEnum,
|
2022-01-13 07:20:20 -08:00
|
|
|
unused_accounts: UnusedAccounts,
|
|
|
|
epoch_stakes: &'a HashMap<Epoch, EpochStakes>,
|
|
|
|
is_delta: bool,
|
2020-07-13 07:00:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> From<crate::bank::BankFieldsToSerialize<'a>> for SerializableVersionedBank<'a> {
|
|
|
|
fn from(rhs: crate::bank::BankFieldsToSerialize<'a>) -> Self {
|
|
|
|
Self {
|
|
|
|
blockhash_queue: rhs.blockhash_queue,
|
2021-06-18 06:34:46 -07:00
|
|
|
ancestors: rhs.ancestors,
|
2020-07-13 07:00:59 -07:00
|
|
|
hash: rhs.hash,
|
|
|
|
parent_hash: rhs.parent_hash,
|
|
|
|
parent_slot: rhs.parent_slot,
|
|
|
|
hard_forks: rhs.hard_forks,
|
|
|
|
transaction_count: rhs.transaction_count,
|
|
|
|
tick_height: rhs.tick_height,
|
|
|
|
signature_count: rhs.signature_count,
|
|
|
|
capitalization: rhs.capitalization,
|
|
|
|
max_tick_height: rhs.max_tick_height,
|
|
|
|
hashes_per_tick: rhs.hashes_per_tick,
|
|
|
|
ticks_per_slot: rhs.ticks_per_slot,
|
|
|
|
ns_per_slot: rhs.ns_per_slot,
|
|
|
|
genesis_creation_time: rhs.genesis_creation_time,
|
|
|
|
slots_per_year: rhs.slots_per_year,
|
2022-03-17 18:14:54 -07:00
|
|
|
accounts_data_len: rhs.accounts_data_len,
|
2020-07-13 07:00:59 -07:00
|
|
|
slot: rhs.slot,
|
|
|
|
epoch: rhs.epoch,
|
|
|
|
block_height: rhs.block_height,
|
|
|
|
collector_id: rhs.collector_id,
|
|
|
|
collector_fees: rhs.collector_fees,
|
|
|
|
fee_calculator: rhs.fee_calculator,
|
|
|
|
fee_rate_governor: rhs.fee_rate_governor,
|
|
|
|
collected_rent: rhs.collected_rent,
|
|
|
|
rent_collector: rhs.rent_collector,
|
|
|
|
epoch_schedule: rhs.epoch_schedule,
|
|
|
|
inflation: rhs.inflation,
|
2022-04-11 14:07:52 -07:00
|
|
|
stakes: StakesEnum::from(rhs.stakes.stakes().clone()),
|
2022-01-21 04:03:41 -08:00
|
|
|
unused_accounts: UnusedAccounts::default(),
|
2020-07-13 07:00:59 -07:00
|
|
|
epoch_stakes: rhs.epoch_stakes,
|
|
|
|
is_delta: rhs.is_delta,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
2022-01-13 05:12:09 -08:00
|
|
|
impl<'a> solana_frozen_abi::abi_example::IgnoreAsHelper for SerializableVersionedBank<'a> {}
|
2020-07-13 07:00:59 -07:00
|
|
|
|
2022-05-22 18:00:42 -07:00
|
|
|
#[derive(PartialEq, Eq)]
|
2020-05-22 10:54:24 -07:00
|
|
|
pub(super) struct Context {}
|
2022-01-13 07:20:20 -08:00
|
|
|
|
2020-05-22 10:54:24 -07:00
|
|
|
impl<'a> TypeContext<'a> for Context {
|
|
|
|
type SerializableAccountStorageEntry = SerializableAccountStorageEntry;
|
|
|
|
|
2020-07-13 07:00:59 -07:00
|
|
|
fn serialize_bank_and_storage<S: serde::ser::Serializer>(
|
2020-05-22 10:54:24 -07:00
|
|
|
serializer: S,
|
2020-07-13 07:00:59 -07:00
|
|
|
serializable_bank: &SerializableBankAndStorage<'a, Self>,
|
2020-05-22 10:54:24 -07:00
|
|
|
) -> std::result::Result<S::Ok, S::Error>
|
2022-06-06 13:07:02 -07:00
|
|
|
where
|
|
|
|
Self: std::marker::Sized,
|
|
|
|
{
|
|
|
|
let ancestors = HashMap::from(&serializable_bank.bank.ancestors);
|
|
|
|
let fields = serializable_bank.bank.get_fields_to_serialize(&ancestors);
|
|
|
|
let lamports_per_signature = fields.fee_rate_governor.lamports_per_signature;
|
|
|
|
(
|
|
|
|
SerializableVersionedBank::from(fields),
|
|
|
|
SerializableAccountsDb::<'a, Self> {
|
2022-08-22 18:01:03 -07:00
|
|
|
accounts_db: &serializable_bank.bank.rc.accounts.accounts_db,
|
2022-06-06 13:07:02 -07:00
|
|
|
slot: serializable_bank.bank.rc.slot,
|
|
|
|
account_storage_entries: serializable_bank.snapshot_storages,
|
|
|
|
phantom: std::marker::PhantomData::default(),
|
|
|
|
},
|
|
|
|
// Additional fields, we manually store the lamps per signature here so that
|
|
|
|
// we can grab it on restart.
|
|
|
|
// TODO: if we do a snapshot version bump, consider moving this out.
|
|
|
|
lamports_per_signature,
|
2022-08-17 13:14:31 -07:00
|
|
|
None::<BankIncrementalSnapshotPersistence>,
|
2022-09-07 10:07:00 -07:00
|
|
|
serializable_bank
|
|
|
|
.bank
|
|
|
|
.get_epoch_accounts_hash_to_serialize(),
|
2022-06-06 13:07:02 -07:00
|
|
|
)
|
|
|
|
.serialize(serializer)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
fn serialize_bank_and_storage_without_extra_fields<S: serde::ser::Serializer>(
|
|
|
|
serializer: S,
|
|
|
|
serializable_bank: &SerializableBankAndStorageNoExtra<'a, Self>,
|
|
|
|
) -> std::result::Result<S::Ok, S::Error>
|
2020-05-22 10:54:24 -07:00
|
|
|
where
|
|
|
|
Self: std::marker::Sized,
|
|
|
|
{
|
2021-05-20 08:11:56 -07:00
|
|
|
let ancestors = HashMap::from(&serializable_bank.bank.ancestors);
|
|
|
|
let fields = serializable_bank.bank.get_fields_to_serialize(&ancestors);
|
2020-07-13 07:00:59 -07:00
|
|
|
(
|
2021-05-20 08:11:56 -07:00
|
|
|
SerializableVersionedBank::from(fields),
|
2021-02-18 23:42:09 -08:00
|
|
|
SerializableAccountsDb::<'a, Self> {
|
2022-08-22 18:01:03 -07:00
|
|
|
accounts_db: &serializable_bank.bank.rc.accounts.accounts_db,
|
2020-07-13 07:00:59 -07:00
|
|
|
slot: serializable_bank.bank.rc.slot,
|
|
|
|
account_storage_entries: serializable_bank.snapshot_storages,
|
|
|
|
phantom: std::marker::PhantomData::default(),
|
|
|
|
},
|
|
|
|
)
|
|
|
|
.serialize(serializer)
|
2020-05-22 10:54:24 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
fn serialize_accounts_db_fields<S: serde::ser::Serializer>(
|
|
|
|
serializer: S,
|
2021-02-18 23:42:09 -08:00
|
|
|
serializable_db: &SerializableAccountsDb<'a, Self>,
|
2020-05-22 10:54:24 -07:00
|
|
|
) -> std::result::Result<S::Ok, S::Error>
|
|
|
|
where
|
|
|
|
Self: std::marker::Sized,
|
|
|
|
{
|
|
|
|
// sample write version before serializing storage entries
|
|
|
|
let version = serializable_db
|
|
|
|
.accounts_db
|
|
|
|
.write_version
|
2021-11-17 05:11:16 -08:00
|
|
|
.load(Ordering::Acquire);
|
2020-05-22 10:54:24 -07:00
|
|
|
|
|
|
|
// (1st of 3 elements) write the list of account storage entry lists out as a map
|
|
|
|
let entry_count = RefCell::<usize>::new(0);
|
|
|
|
let entries =
|
|
|
|
serialize_iter_as_map(serializable_db.account_storage_entries.iter().map(|x| {
|
|
|
|
*entry_count.borrow_mut() += x.len();
|
|
|
|
(
|
2020-11-04 09:17:05 -08:00
|
|
|
x.first().unwrap().slot(),
|
2020-05-22 10:54:24 -07:00
|
|
|
serialize_iter_as_seq(
|
|
|
|
x.iter()
|
|
|
|
.map(|x| Self::SerializableAccountStorageEntry::from(x.as_ref())),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
}));
|
|
|
|
let slot = serializable_db.slot;
|
2022-04-07 12:05:57 -07:00
|
|
|
let hash: BankHashInfo = serializable_db
|
2020-05-22 10:54:24 -07:00
|
|
|
.accounts_db
|
|
|
|
.bank_hashes
|
|
|
|
.read()
|
|
|
|
.unwrap()
|
|
|
|
.get(&serializable_db.slot)
|
|
|
|
.unwrap_or_else(|| panic!("No bank_hashes entry for slot {}", serializable_db.slot))
|
|
|
|
.clone();
|
|
|
|
|
2022-04-02 10:01:43 -07:00
|
|
|
let historical_roots = serializable_db
|
2022-03-24 08:06:24 -07:00
|
|
|
.accounts_db
|
|
|
|
.accounts_index
|
|
|
|
.roots_tracker
|
|
|
|
.read()
|
|
|
|
.unwrap()
|
2022-04-04 11:13:11 -07:00
|
|
|
.historical_roots
|
2022-03-24 08:06:24 -07:00
|
|
|
.get_all();
|
2022-04-02 10:01:43 -07:00
|
|
|
let historical_roots_with_hash = Vec::<(Slot, Hash)>::default();
|
2022-03-24 08:06:24 -07:00
|
|
|
|
2020-05-22 10:54:24 -07:00
|
|
|
let mut serialize_account_storage_timer = Measure::start("serialize_account_storage_ms");
|
2022-03-24 08:06:24 -07:00
|
|
|
let result = (
|
|
|
|
entries,
|
|
|
|
version,
|
|
|
|
slot,
|
|
|
|
hash,
|
2022-04-02 10:01:43 -07:00
|
|
|
historical_roots,
|
|
|
|
historical_roots_with_hash,
|
2022-03-24 08:06:24 -07:00
|
|
|
)
|
|
|
|
.serialize(serializer);
|
2020-05-22 10:54:24 -07:00
|
|
|
serialize_account_storage_timer.stop();
|
|
|
|
datapoint_info!(
|
|
|
|
"serialize_account_storage_ms",
|
|
|
|
("duration", serialize_account_storage_timer.as_ms(), i64),
|
|
|
|
("num_entries", *entry_count.borrow(), i64),
|
|
|
|
);
|
|
|
|
result
|
|
|
|
}
|
|
|
|
|
2020-07-13 07:00:59 -07:00
|
|
|
fn deserialize_bank_fields<R>(
|
2020-05-22 10:54:24 -07:00
|
|
|
mut stream: &mut BufReader<R>,
|
2020-07-13 07:00:59 -07:00
|
|
|
) -> Result<(BankFieldsToDeserialize, AccountsDbFields), Error>
|
|
|
|
where
|
|
|
|
R: Read,
|
|
|
|
{
|
2022-06-06 13:07:02 -07:00
|
|
|
let mut bank_fields: BankFieldsToDeserialize =
|
|
|
|
deserialize_from::<_, DeserializableVersionedBank>(&mut stream)?.into();
|
2020-07-13 07:00:59 -07:00
|
|
|
let accounts_db_fields = Self::deserialize_accounts_db_fields(stream)?;
|
2022-06-06 13:07:02 -07:00
|
|
|
// Process extra fields
|
2022-07-29 10:10:22 -07:00
|
|
|
let lamports_per_signature = ignore_eof_error(deserialize_from(&mut stream))?;
|
2022-06-06 13:07:02 -07:00
|
|
|
bank_fields.fee_rate_governor = bank_fields
|
|
|
|
.fee_rate_governor
|
|
|
|
.clone_with_lamports_per_signature(lamports_per_signature);
|
2022-08-17 13:14:31 -07:00
|
|
|
|
2022-09-01 08:35:52 -07:00
|
|
|
let incremental_snapshot_persistence = ignore_eof_error(deserialize_from(&mut stream))?;
|
2022-08-17 13:14:31 -07:00
|
|
|
bank_fields.incremental_snapshot_persistence = incremental_snapshot_persistence;
|
|
|
|
|
2022-09-01 08:35:52 -07:00
|
|
|
let epoch_accounts_hash = ignore_eof_error(deserialize_from(stream))?;
|
|
|
|
bank_fields.epoch_accounts_hash = epoch_accounts_hash;
|
|
|
|
|
2020-07-13 07:00:59 -07:00
|
|
|
Ok((bank_fields, accounts_db_fields))
|
|
|
|
}
|
|
|
|
|
|
|
|
fn deserialize_accounts_db_fields<R>(
|
|
|
|
stream: &mut BufReader<R>,
|
|
|
|
) -> Result<AccountsDbFields, Error>
|
2020-05-22 10:54:24 -07:00
|
|
|
where
|
|
|
|
R: Read,
|
|
|
|
{
|
2020-07-13 07:00:59 -07:00
|
|
|
deserialize_from(stream)
|
2020-05-22 10:54:24 -07:00
|
|
|
}
|
2022-04-07 12:05:57 -07:00
|
|
|
|
|
|
|
/// deserialize the bank from 'stream_reader'
|
2022-08-17 13:14:31 -07:00
|
|
|
/// modify the accounts_hash and incremental_snapshot_persistence
|
2022-04-07 12:05:57 -07:00
|
|
|
/// reserialize the bank to 'stream_writer'
|
|
|
|
fn reserialize_bank_fields_with_hash<R, W>(
|
|
|
|
stream_reader: &mut BufReader<R>,
|
|
|
|
stream_writer: &mut BufWriter<W>,
|
|
|
|
accounts_hash: &Hash,
|
2022-08-17 13:14:31 -07:00
|
|
|
incremental_snapshot_persistence: Option<&BankIncrementalSnapshotPersistence>,
|
2022-09-07 10:07:00 -07:00
|
|
|
epoch_accounts_hash: Option<&Hash>,
|
2022-04-07 12:05:57 -07:00
|
|
|
) -> std::result::Result<(), Box<bincode::ErrorKind>>
|
|
|
|
where
|
|
|
|
R: Read,
|
|
|
|
W: Write,
|
|
|
|
{
|
|
|
|
let (bank_fields, mut accounts_db_fields) =
|
|
|
|
Self::deserialize_bank_fields(stream_reader).unwrap();
|
|
|
|
accounts_db_fields.3.snapshot_hash = *accounts_hash;
|
2022-10-16 20:33:07 -07:00
|
|
|
let mut rhs = bank_fields;
|
|
|
|
let blockhash_queue = RwLock::new(std::mem::take(&mut rhs.blockhash_queue));
|
|
|
|
let hard_forks = RwLock::new(std::mem::take(&mut rhs.hard_forks));
|
2022-06-06 13:07:02 -07:00
|
|
|
let lamports_per_signature = rhs.fee_rate_governor.lamports_per_signature;
|
2022-09-07 10:07:00 -07:00
|
|
|
let epoch_accounts_hash = epoch_accounts_hash.or(rhs.epoch_accounts_hash.as_ref());
|
2022-08-17 13:14:31 -07:00
|
|
|
|
2022-04-07 12:05:57 -07:00
|
|
|
let bank = SerializableVersionedBank {
|
|
|
|
blockhash_queue: &blockhash_queue,
|
|
|
|
ancestors: &rhs.ancestors,
|
|
|
|
hash: rhs.hash,
|
|
|
|
parent_hash: rhs.parent_hash,
|
|
|
|
parent_slot: rhs.parent_slot,
|
|
|
|
hard_forks: &hard_forks,
|
|
|
|
transaction_count: rhs.transaction_count,
|
|
|
|
tick_height: rhs.tick_height,
|
|
|
|
signature_count: rhs.signature_count,
|
|
|
|
capitalization: rhs.capitalization,
|
|
|
|
max_tick_height: rhs.max_tick_height,
|
|
|
|
hashes_per_tick: rhs.hashes_per_tick,
|
|
|
|
ticks_per_slot: rhs.ticks_per_slot,
|
|
|
|
ns_per_slot: rhs.ns_per_slot,
|
|
|
|
genesis_creation_time: rhs.genesis_creation_time,
|
|
|
|
slots_per_year: rhs.slots_per_year,
|
|
|
|
accounts_data_len: rhs.accounts_data_len,
|
|
|
|
slot: rhs.slot,
|
|
|
|
epoch: rhs.epoch,
|
|
|
|
block_height: rhs.block_height,
|
|
|
|
collector_id: rhs.collector_id,
|
|
|
|
collector_fees: rhs.collector_fees,
|
|
|
|
fee_calculator: rhs.fee_calculator,
|
|
|
|
fee_rate_governor: rhs.fee_rate_governor,
|
|
|
|
collected_rent: rhs.collected_rent,
|
|
|
|
rent_collector: rhs.rent_collector,
|
|
|
|
epoch_schedule: rhs.epoch_schedule,
|
|
|
|
inflation: rhs.inflation,
|
2022-04-11 14:07:52 -07:00
|
|
|
stakes: StakesEnum::from(rhs.stakes),
|
2022-04-07 12:05:57 -07:00
|
|
|
unused_accounts: UnusedAccounts::default(),
|
|
|
|
epoch_stakes: &rhs.epoch_stakes,
|
|
|
|
is_delta: rhs.is_delta,
|
|
|
|
};
|
|
|
|
|
2022-06-06 13:07:02 -07:00
|
|
|
bincode::serialize_into(
|
|
|
|
stream_writer,
|
2022-08-17 13:14:31 -07:00
|
|
|
&(
|
|
|
|
bank,
|
|
|
|
accounts_db_fields,
|
|
|
|
lamports_per_signature,
|
|
|
|
incremental_snapshot_persistence,
|
2022-09-07 10:07:00 -07:00
|
|
|
epoch_accounts_hash,
|
2022-08-17 13:14:31 -07:00
|
|
|
),
|
2022-06-06 13:07:02 -07:00
|
|
|
)
|
2022-04-07 12:05:57 -07:00
|
|
|
}
|
2020-05-22 10:54:24 -07:00
|
|
|
}
|