parent
11cec8f24e
commit
b35c022629
|
@ -5,6 +5,7 @@ use bincode::{deserialize, serialize_into, serialized_size, ErrorKind};
|
||||||
use log::*;
|
use log::*;
|
||||||
use num_derive::{FromPrimitive, ToPrimitive};
|
use num_derive::{FromPrimitive, ToPrimitive};
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
|
use solana_sdk::sysvar::slot_hashes::SlotHash;
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
account::{Account, KeyedAccount},
|
account::{Account, KeyedAccount},
|
||||||
account_utils::State,
|
account_utils::State,
|
||||||
|
@ -231,7 +232,7 @@ impl VoteState {
|
||||||
pub fn process_vote(
|
pub fn process_vote(
|
||||||
&mut self,
|
&mut self,
|
||||||
vote: &Vote,
|
vote: &Vote,
|
||||||
slot_hashes: &[(Slot, Hash)],
|
slot_hashes: &[SlotHash],
|
||||||
epoch: Epoch,
|
epoch: Epoch,
|
||||||
) -> Result<(), VoteError> {
|
) -> Result<(), VoteError> {
|
||||||
if vote.slots.is_empty() {
|
if vote.slots.is_empty() {
|
||||||
|
@ -407,7 +408,7 @@ pub fn initialize_account(
|
||||||
|
|
||||||
pub fn process_vote(
|
pub fn process_vote(
|
||||||
vote_account: &mut KeyedAccount,
|
vote_account: &mut KeyedAccount,
|
||||||
slot_hashes: &[(Slot, Hash)],
|
slot_hashes: &[SlotHash],
|
||||||
clock: &Clock,
|
clock: &Clock,
|
||||||
other_signers: &[KeyedAccount],
|
other_signers: &[KeyedAccount],
|
||||||
vote: &Vote,
|
vote: &Vote,
|
||||||
|
@ -487,7 +488,7 @@ mod tests {
|
||||||
vote_pubkey: &Pubkey,
|
vote_pubkey: &Pubkey,
|
||||||
vote_account: &mut Account,
|
vote_account: &mut Account,
|
||||||
vote: &Vote,
|
vote: &Vote,
|
||||||
slot_hashes: &[(u64, Hash)],
|
slot_hashes: &[SlotHash],
|
||||||
epoch: u64,
|
epoch: u64,
|
||||||
) -> Result<VoteState, InstructionError> {
|
) -> Result<VoteState, InstructionError> {
|
||||||
process_vote(
|
process_vote(
|
||||||
|
|
|
@ -52,6 +52,13 @@ pub type TransactionCredits = Vec<u64>;
|
||||||
pub type TransactionRents = Vec<u64>;
|
pub type TransactionRents = Vec<u64>;
|
||||||
pub type TransactionLoaders = Vec<Vec<(Pubkey, Account)>>;
|
pub type TransactionLoaders = Vec<Vec<(Pubkey, Account)>>;
|
||||||
|
|
||||||
|
pub type TransactionLoadResult = (
|
||||||
|
TransactionAccounts,
|
||||||
|
TransactionLoaders,
|
||||||
|
TransactionCredits,
|
||||||
|
TransactionRents,
|
||||||
|
);
|
||||||
|
|
||||||
impl Accounts {
|
impl Accounts {
|
||||||
pub fn new(paths: Option<String>) -> Self {
|
pub fn new(paths: Option<String>) -> Self {
|
||||||
let accounts_db = Arc::new(AccountsDB::new(paths));
|
let accounts_db = Arc::new(AccountsDB::new(paths));
|
||||||
|
@ -217,14 +224,7 @@ impl Accounts {
|
||||||
hash_queue: &BlockhashQueue,
|
hash_queue: &BlockhashQueue,
|
||||||
error_counters: &mut ErrorCounters,
|
error_counters: &mut ErrorCounters,
|
||||||
rent_collector: &RentCollector,
|
rent_collector: &RentCollector,
|
||||||
) -> Vec<
|
) -> Vec<Result<TransactionLoadResult>> {
|
||||||
Result<(
|
|
||||||
TransactionAccounts,
|
|
||||||
TransactionLoaders,
|
|
||||||
TransactionCredits,
|
|
||||||
TransactionRents,
|
|
||||||
)>,
|
|
||||||
> {
|
|
||||||
//PERF: hold the lock to scan for the references, but not to clone the accounts
|
//PERF: hold the lock to scan for the references, but not to clone the accounts
|
||||||
//TODO: two locks usually leads to deadlocks, should this be one structure?
|
//TODO: two locks usually leads to deadlocks, should this be one structure?
|
||||||
let accounts_index = self.accounts_db.accounts_index.read().unwrap();
|
let accounts_index = self.accounts_db.accounts_index.read().unwrap();
|
||||||
|
@ -529,12 +529,7 @@ impl Accounts {
|
||||||
txs: &[Transaction],
|
txs: &[Transaction],
|
||||||
txs_iteration_order: Option<&[usize]>,
|
txs_iteration_order: Option<&[usize]>,
|
||||||
res: &[Result<()>],
|
res: &[Result<()>],
|
||||||
loaded: &mut [Result<(
|
loaded: &mut [Result<TransactionLoadResult>],
|
||||||
TransactionAccounts,
|
|
||||||
TransactionLoaders,
|
|
||||||
TransactionCredits,
|
|
||||||
TransactionRents,
|
|
||||||
)>],
|
|
||||||
) {
|
) {
|
||||||
let accounts_to_store =
|
let accounts_to_store =
|
||||||
self.collect_accounts_to_store(txs, txs_iteration_order, res, loaded);
|
self.collect_accounts_to_store(txs, txs_iteration_order, res, loaded);
|
||||||
|
@ -611,12 +606,7 @@ impl Accounts {
|
||||||
txs: &'a [Transaction],
|
txs: &'a [Transaction],
|
||||||
txs_iteration_order: Option<&'a [usize]>,
|
txs_iteration_order: Option<&'a [usize]>,
|
||||||
res: &'a [Result<()>],
|
res: &'a [Result<()>],
|
||||||
loaded: &'a mut [Result<(
|
loaded: &'a mut [Result<TransactionLoadResult>],
|
||||||
TransactionAccounts,
|
|
||||||
TransactionLoaders,
|
|
||||||
TransactionCredits,
|
|
||||||
TransactionRents,
|
|
||||||
)>],
|
|
||||||
) -> Vec<(&'a Pubkey, &'a Account)> {
|
) -> Vec<(&'a Pubkey, &'a Account)> {
|
||||||
let mut accounts = Vec::new();
|
let mut accounts = Vec::new();
|
||||||
for (i, (raccs, tx)) in loaded
|
for (i, (raccs, tx)) in loaded
|
||||||
|
@ -693,14 +683,7 @@ mod tests {
|
||||||
ka: &Vec<(Pubkey, Account)>,
|
ka: &Vec<(Pubkey, Account)>,
|
||||||
fee_calculator: &FeeCalculator,
|
fee_calculator: &FeeCalculator,
|
||||||
error_counters: &mut ErrorCounters,
|
error_counters: &mut ErrorCounters,
|
||||||
) -> Vec<
|
) -> Vec<Result<TransactionLoadResult>> {
|
||||||
Result<(
|
|
||||||
TransactionAccounts,
|
|
||||||
TransactionLoaders,
|
|
||||||
TransactionCredits,
|
|
||||||
TransactionRents,
|
|
||||||
)>,
|
|
||||||
> {
|
|
||||||
let mut hash_queue = BlockhashQueue::new(100);
|
let mut hash_queue = BlockhashQueue::new(100);
|
||||||
hash_queue.register_hash(&tx.message().recent_blockhash, &fee_calculator);
|
hash_queue.register_hash(&tx.message().recent_blockhash, &fee_calculator);
|
||||||
let accounts = Accounts::new(None);
|
let accounts = Accounts::new(None);
|
||||||
|
@ -726,14 +709,7 @@ mod tests {
|
||||||
tx: Transaction,
|
tx: Transaction,
|
||||||
ka: &Vec<(Pubkey, Account)>,
|
ka: &Vec<(Pubkey, Account)>,
|
||||||
error_counters: &mut ErrorCounters,
|
error_counters: &mut ErrorCounters,
|
||||||
) -> Vec<
|
) -> Vec<Result<TransactionLoadResult>> {
|
||||||
Result<(
|
|
||||||
TransactionAccounts,
|
|
||||||
TransactionLoaders,
|
|
||||||
TransactionCredits,
|
|
||||||
TransactionRents,
|
|
||||||
)>,
|
|
||||||
> {
|
|
||||||
let fee_calculator = FeeCalculator::default();
|
let fee_calculator = FeeCalculator::default();
|
||||||
load_accounts_with_fee(tx, ka, &fee_calculator, error_counters)
|
load_accounts_with_fee(tx, ka, &fee_calculator, error_counters)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,7 @@
|
||||||
//! already been signed and verified.
|
//! already been signed and verified.
|
||||||
use crate::transaction_utils::OrderedIterator;
|
use crate::transaction_utils::OrderedIterator;
|
||||||
use crate::{
|
use crate::{
|
||||||
accounts::{
|
accounts::{Accounts, TransactionLoadResult},
|
||||||
Accounts, TransactionAccounts, TransactionCredits, TransactionLoaders, TransactionRents,
|
|
||||||
},
|
|
||||||
accounts_db::{AccountStorageEntry, AccountsDBSerialize, AppendVecId, ErrorCounters},
|
accounts_db::{AccountStorageEntry, AccountsDBSerialize, AppendVecId, ErrorCounters},
|
||||||
accounts_index::Fork,
|
accounts_index::Fork,
|
||||||
blockhash_queue::BlockhashQueue,
|
blockhash_queue::BlockhashQueue,
|
||||||
|
@ -797,14 +795,7 @@ impl Bank {
|
||||||
txs_iteration_order: Option<&[usize]>,
|
txs_iteration_order: Option<&[usize]>,
|
||||||
results: Vec<Result<()>>,
|
results: Vec<Result<()>>,
|
||||||
error_counters: &mut ErrorCounters,
|
error_counters: &mut ErrorCounters,
|
||||||
) -> Vec<
|
) -> Vec<Result<TransactionLoadResult>> {
|
||||||
Result<(
|
|
||||||
TransactionAccounts,
|
|
||||||
TransactionLoaders,
|
|
||||||
TransactionCredits,
|
|
||||||
TransactionRents,
|
|
||||||
)>,
|
|
||||||
> {
|
|
||||||
self.rc.accounts.load_accounts(
|
self.rc.accounts.load_accounts(
|
||||||
&self.ancestors,
|
&self.ancestors,
|
||||||
txs,
|
txs,
|
||||||
|
@ -969,14 +960,7 @@ impl Bank {
|
||||||
lock_results: &LockedAccountsResults,
|
lock_results: &LockedAccountsResults,
|
||||||
max_age: usize,
|
max_age: usize,
|
||||||
) -> (
|
) -> (
|
||||||
Vec<
|
Vec<Result<TransactionLoadResult>>,
|
||||||
Result<(
|
|
||||||
TransactionAccounts,
|
|
||||||
TransactionLoaders,
|
|
||||||
TransactionCredits,
|
|
||||||
TransactionRents,
|
|
||||||
)>,
|
|
||||||
>,
|
|
||||||
Vec<Result<()>>,
|
Vec<Result<()>>,
|
||||||
Vec<usize>,
|
Vec<usize>,
|
||||||
usize,
|
usize,
|
||||||
|
@ -1106,12 +1090,7 @@ impl Bank {
|
||||||
&self,
|
&self,
|
||||||
txs: &[Transaction],
|
txs: &[Transaction],
|
||||||
txs_iteration_order: Option<&[usize]>,
|
txs_iteration_order: Option<&[usize]>,
|
||||||
loaded_accounts: &mut [Result<(
|
loaded_accounts: &mut [Result<TransactionLoadResult>],
|
||||||
TransactionAccounts,
|
|
||||||
TransactionLoaders,
|
|
||||||
TransactionCredits,
|
|
||||||
TransactionRents,
|
|
||||||
)>],
|
|
||||||
executed: &[Result<()>],
|
executed: &[Result<()>],
|
||||||
tx_count: usize,
|
tx_count: usize,
|
||||||
signature_count: usize,
|
signature_count: usize,
|
||||||
|
@ -1391,12 +1370,7 @@ impl Bank {
|
||||||
txs: &[Transaction],
|
txs: &[Transaction],
|
||||||
txs_iteration_order: Option<&[usize]>,
|
txs_iteration_order: Option<&[usize]>,
|
||||||
res: &[Result<()>],
|
res: &[Result<()>],
|
||||||
loaded: &[Result<(
|
loaded: &[Result<TransactionLoadResult>],
|
||||||
TransactionAccounts,
|
|
||||||
TransactionLoaders,
|
|
||||||
TransactionCredits,
|
|
||||||
TransactionRents,
|
|
||||||
)>],
|
|
||||||
) {
|
) {
|
||||||
for (i, (raccs, tx)) in loaded
|
for (i, (raccs, tx)) in loaded
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -1415,7 +1389,7 @@ impl Bank {
|
||||||
.account_keys
|
.account_keys
|
||||||
.iter()
|
.iter()
|
||||||
.zip(acc.0.iter())
|
.zip(acc.0.iter())
|
||||||
.filter(|(_, account)| {
|
.filter(|(_key, account)| {
|
||||||
(Stakes::is_stake(account)) || storage_utils::is_storage(account)
|
(Stakes::is_stake(account)) || storage_utils::is_storage(account)
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
|
|
|
@ -19,8 +19,10 @@ crate::solana_name_id!(ID, "SysvarS1otHashes111111111111111111111111111");
|
||||||
|
|
||||||
pub const MAX_SLOT_HASHES: usize = 512; // 512 slots to get your vote in
|
pub const MAX_SLOT_HASHES: usize = 512; // 512 slots to get your vote in
|
||||||
|
|
||||||
|
pub type SlotHash = (Slot, Hash);
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||||
pub struct SlotHashes(Vec<(Slot, Hash)>);
|
pub struct SlotHashes(Vec<SlotHash>);
|
||||||
|
|
||||||
impl SlotHashes {
|
impl SlotHashes {
|
||||||
pub fn from(account: &Account) -> Option<Self> {
|
pub fn from(account: &Account) -> Option<Self> {
|
||||||
|
@ -46,19 +48,19 @@ impl SlotHashes {
|
||||||
.ok()
|
.ok()
|
||||||
.map(|index| &self[index].1)
|
.map(|index| &self[index].1)
|
||||||
}
|
}
|
||||||
pub fn new(slot_hashes: &[(Slot, Hash)]) -> Self {
|
pub fn new(slot_hashes: &[SlotHash]) -> Self {
|
||||||
Self(slot_hashes.to_vec())
|
Self(slot_hashes.to_vec())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Deref for SlotHashes {
|
impl Deref for SlotHashes {
|
||||||
type Target = Vec<(u64, Hash)>;
|
type Target = Vec<SlotHash>;
|
||||||
fn deref(&self) -> &Self::Target {
|
fn deref(&self) -> &Self::Target {
|
||||||
&self.0
|
&self.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_account(lamports: u64, slot_hashes: &[(Slot, Hash)]) -> Account {
|
pub fn create_account(lamports: u64, slot_hashes: &[SlotHash]) -> Account {
|
||||||
let mut account = Account::new(lamports, SlotHashes::size_of(), &sysvar::id());
|
let mut account = Account::new(lamports, SlotHashes::size_of(), &sysvar::id());
|
||||||
SlotHashes::new(slot_hashes).to(&mut account).unwrap();
|
SlotHashes::new(slot_hashes).to(&mut account).unwrap();
|
||||||
account
|
account
|
||||||
|
|
Loading…
Reference in New Issue