Move Bank to its own crate
Also: * counters.rs to solana_metrics * genesis_block.rs to solana_sdk
This commit is contained in:
parent
781f7ef570
commit
dde886f058
|
@ -1940,10 +1940,8 @@ version = "0.12.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bincode 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bincode 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bv 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -2075,6 +2073,7 @@ dependencies = [
|
||||||
"solana-logger 0.12.0",
|
"solana-logger 0.12.0",
|
||||||
"solana-metrics 0.12.0",
|
"solana-metrics 0.12.0",
|
||||||
"solana-netutil 0.12.0",
|
"solana-netutil 0.12.0",
|
||||||
|
"solana-runtime 0.12.0",
|
||||||
"solana-sdk 0.12.0",
|
"solana-sdk 0.12.0",
|
||||||
"solana-vote-signer 0.12.0",
|
"solana-vote-signer 0.12.0",
|
||||||
]
|
]
|
||||||
|
@ -2122,6 +2121,7 @@ dependencies = [
|
||||||
"serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"solana 0.12.0",
|
"solana 0.12.0",
|
||||||
"solana-logger 0.12.0",
|
"solana-logger 0.12.0",
|
||||||
|
"solana-runtime 0.12.0",
|
||||||
"solana-sdk 0.12.0",
|
"solana-sdk 0.12.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2187,6 +2187,7 @@ dependencies = [
|
||||||
"solana-bpfloader 0.12.0",
|
"solana-bpfloader 0.12.0",
|
||||||
"solana-logger 0.12.0",
|
"solana-logger 0.12.0",
|
||||||
"solana-native-loader 0.12.0",
|
"solana-native-loader 0.12.0",
|
||||||
|
"solana-runtime 0.12.0",
|
||||||
"solana-sdk 0.12.0",
|
"solana-sdk 0.12.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2228,6 +2229,16 @@ dependencies = [
|
||||||
name = "solana-runtime"
|
name = "solana-runtime"
|
||||||
version = "0.12.0"
|
version = "0.12.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"bincode 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"bv 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_derive 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"solana-metrics 0.12.0",
|
||||||
"solana-native-loader 0.12.0",
|
"solana-native-loader 0.12.0",
|
||||||
"solana-sdk 0.12.0",
|
"solana-sdk 0.12.0",
|
||||||
"solana-system-program 0.12.0",
|
"solana-system-program 0.12.0",
|
||||||
|
|
|
@ -26,10 +26,8 @@ unstable = []
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bincode = "1.1.2"
|
bincode = "1.1.2"
|
||||||
bs58 = "0.2.0"
|
bs58 = "0.2.0"
|
||||||
bv = { version = "0.11.0", features = ["serde"] }
|
|
||||||
byteorder = "1.3.1"
|
byteorder = "1.3.1"
|
||||||
chrono = { version = "0.4.0", features = ["serde"] }
|
chrono = { version = "0.4.0", features = ["serde"] }
|
||||||
fnv = "1.0.6"
|
|
||||||
hashbrown = "0.1.8"
|
hashbrown = "0.1.8"
|
||||||
indexmap = "1.0"
|
indexmap = "1.0"
|
||||||
itertools = "0.8.0"
|
itertools = "0.8.0"
|
||||||
|
@ -66,9 +64,6 @@ untrusted = "0.6.2"
|
||||||
hex-literal = "0.1.2"
|
hex-literal = "0.1.2"
|
||||||
matches = "0.1.6"
|
matches = "0.1.6"
|
||||||
|
|
||||||
[[bench]]
|
|
||||||
name = "bank"
|
|
||||||
|
|
||||||
[[bench]]
|
[[bench]]
|
||||||
name = "banking_stage"
|
name = "banking_stage"
|
||||||
|
|
||||||
|
|
|
@ -4,17 +4,17 @@ extern crate test;
|
||||||
|
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use solana::bank::Bank;
|
|
||||||
use solana::banking_stage::BankingStage;
|
use solana::banking_stage::BankingStage;
|
||||||
use solana::entry::Entry;
|
use solana::entry::Entry;
|
||||||
use solana::genesis_block::GenesisBlock;
|
|
||||||
use solana::last_id_queue::MAX_ENTRY_IDS;
|
|
||||||
use solana::packet::to_packets_chunked;
|
use solana::packet::to_packets_chunked;
|
||||||
use solana::poh_service::PohServiceConfig;
|
use solana::poh_service::PohServiceConfig;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::hash;
|
use solana_sdk::hash::hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::{KeypairUtil, Signature};
|
use solana_sdk::signature::{KeypairUtil, Signature};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
|
use solana_sdk::timing::MAX_ENTRY_IDS;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use std::sync::mpsc::{channel, Receiver};
|
use std::sync::mpsc::{channel, Receiver};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
|
@ -18,6 +18,7 @@ solana-fullnode-config = { path = "../fullnode-config", version = "0.12.0" }
|
||||||
solana-logger = { path = "../logger", version = "0.12.0" }
|
solana-logger = { path = "../logger", version = "0.12.0" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.12.0" }
|
solana-netutil = { path = "../netutil", version = "0.12.0" }
|
||||||
solana-metrics = { path = "../metrics", version = "0.12.0" }
|
solana-metrics = { path = "../metrics", version = "0.12.0" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "0.12.0" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.12.0" }
|
solana-sdk = { path = "../sdk", version = "0.12.0" }
|
||||||
solana-vote-signer = { path = "../vote-signer", version = "0.12.0" }
|
solana-vote-signer = { path = "../vote-signer", version = "0.12.0" }
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,11 @@ use log::*;
|
||||||
use solana::client::mk_client;
|
use solana::client::mk_client;
|
||||||
use solana::cluster_info::{Node, NodeInfo, FULLNODE_PORT_RANGE};
|
use solana::cluster_info::{Node, NodeInfo, FULLNODE_PORT_RANGE};
|
||||||
use solana::fullnode::{Fullnode, FullnodeConfig};
|
use solana::fullnode::{Fullnode, FullnodeConfig};
|
||||||
use solana::genesis_block::GenesisBlock;
|
|
||||||
use solana::local_vote_signer_service::LocalVoteSignerService;
|
use solana::local_vote_signer_service::LocalVoteSignerService;
|
||||||
use solana::socketaddr;
|
use solana::socketaddr;
|
||||||
use solana::thin_client::{poll_gossip_for_leader, ThinClient};
|
use solana::thin_client::{poll_gossip_for_leader, ThinClient};
|
||||||
use solana::voting_keypair::{RemoteVoteSigner, VotingKeypair};
|
use solana::voting_keypair::{RemoteVoteSigner, VotingKeypair};
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::vote_program::VoteState;
|
use solana_sdk::vote_program::VoteState;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use clap::{crate_version, value_t_or_exit, App, Arg};
|
use clap::{crate_version, value_t_or_exit, App, Arg};
|
||||||
use solana::blocktree::create_new_ledger;
|
use solana::blocktree::create_new_ledger;
|
||||||
use solana::genesis_block::GenesisBlock;
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
|
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
|
||||||
use std::error;
|
use std::error;
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ serde_json = "1.0.38"
|
||||||
solana = { path = "..", version = "0.12.0" }
|
solana = { path = "..", version = "0.12.0" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.12.0" }
|
solana-sdk = { path = "../sdk", version = "0.12.0" }
|
||||||
solana-logger = { path = "../logger", version = "0.12.0" }
|
solana-logger = { path = "../logger", version = "0.12.0" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "0.12.0" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_cmd = "0.11"
|
assert_cmd = "0.11"
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use clap::{crate_version, App, Arg, SubCommand};
|
use clap::{crate_version, App, Arg, SubCommand};
|
||||||
use solana::bank::Bank;
|
|
||||||
use solana::blocktree::Blocktree;
|
use solana::blocktree::Blocktree;
|
||||||
use solana::blocktree_processor;
|
use solana::blocktree_processor;
|
||||||
use solana::genesis_block::GenesisBlock;
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use std::io::{stdout, Write};
|
use std::io::{stdout, Write};
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use solana_metrics::{influxdb, submit};
|
use crate::{influxdb, submit};
|
||||||
|
use log::{info, log_enabled};
|
||||||
use solana_sdk::timing;
|
use solana_sdk::timing;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
@ -16,6 +17,7 @@ pub struct Counter {
|
||||||
pub point: Option<influxdb::Point>,
|
pub point: Option<influxdb::Point>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
macro_rules! create_counter {
|
macro_rules! create_counter {
|
||||||
($name:expr, $lograte:expr) => {
|
($name:expr, $lograte:expr) => {
|
||||||
Counter {
|
Counter {
|
||||||
|
@ -29,21 +31,14 @@ macro_rules! create_counter {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
macro_rules! inc_counter {
|
macro_rules! inc_counter {
|
||||||
($name:expr, $level:expr, $count:expr) => {
|
($name:expr, $level:expr, $count:expr) => {
|
||||||
unsafe { $name.inc($level, $count) };
|
unsafe { $name.inc($level, $count) };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! inc_new_counter_info {
|
#[macro_export]
|
||||||
($name:expr, $count:expr) => {{
|
|
||||||
inc_new_counter!($name, $count, Level::Info, 0);
|
|
||||||
}};
|
|
||||||
($name:expr, $count:expr, $lograte:expr) => {{
|
|
||||||
inc_new_counter!($name, $count, Level::Info, $lograte);
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! inc_new_counter {
|
macro_rules! inc_new_counter {
|
||||||
($name:expr, $count:expr, $level:expr, $lograte:expr) => {{
|
($name:expr, $count:expr, $level:expr, $lograte:expr) => {{
|
||||||
static mut INC_NEW_COUNTER: Counter = create_counter!($name, $lograte);
|
static mut INC_NEW_COUNTER: Counter = create_counter!($name, $lograte);
|
||||||
|
@ -57,6 +52,16 @@ macro_rules! inc_new_counter {
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! inc_new_counter_info {
|
||||||
|
($name:expr, $count:expr) => {{
|
||||||
|
inc_new_counter!($name, $count, Level::Info, 0);
|
||||||
|
}};
|
||||||
|
($name:expr, $count:expr, $lograte:expr) => {{
|
||||||
|
inc_new_counter!($name, $count, Level::Info, $lograte);
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
impl Counter {
|
impl Counter {
|
||||||
fn default_log_rate() -> usize {
|
fn default_log_rate() -> usize {
|
||||||
let v = env::var("SOLANA_DEFAULT_LOG_RATE")
|
let v = env::var("SOLANA_DEFAULT_LOG_RATE")
|
|
@ -1,3 +1,6 @@
|
||||||
|
#[macro_use]
|
||||||
|
pub mod counter;
|
||||||
|
|
||||||
mod metrics;
|
mod metrics;
|
||||||
|
|
||||||
pub use crate::metrics::flush;
|
pub use crate::metrics::flush;
|
||||||
|
|
|
@ -22,4 +22,5 @@ solana = { path = "..", version = "0.12.0" }
|
||||||
solana-bpfloader = { path = "native/bpf_loader", version = "0.12.0" }
|
solana-bpfloader = { path = "native/bpf_loader", version = "0.12.0" }
|
||||||
solana-logger = { path = "../logger", version = "0.12.0" }
|
solana-logger = { path = "../logger", version = "0.12.0" }
|
||||||
solana-native-loader = { path = "native/native_loader", version = "0.12.0" }
|
solana-native-loader = { path = "native/native_loader", version = "0.12.0" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "0.12.0" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.12.0" }
|
solana-sdk = { path = "../sdk", version = "0.12.0" }
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use solana_rewards_api::rewards_program;
|
use solana_rewards_api::rewards_program;
|
||||||
use solana_rewards_api::rewards_transaction::RewardsTransaction;
|
use solana_rewards_api::rewards_transaction::RewardsTransaction;
|
||||||
use solana_runtime::{execute_transaction, RuntimeError};
|
use solana_runtime::runtime::{execute_transaction, RuntimeError};
|
||||||
use solana_sdk::account::Account;
|
use solana_sdk::account::Account;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::native_loader::create_program_account;
|
use solana_sdk::native_loader::create_program_account;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use solana::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
use solana::genesis_block::GenesisBlock;
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::loader_transaction::LoaderTransaction;
|
use solana_sdk::loader_transaction::LoaderTransaction;
|
||||||
use solana_sdk::native_loader;
|
use solana_sdk::native_loader;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
|
|
|
@ -9,6 +9,16 @@ homepage = "https://solana.com/"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
bincode = "1.1.2"
|
||||||
|
bv = { version = "0.11.0", features = ["serde"] }
|
||||||
|
fnv = "1.0.6"
|
||||||
|
hashbrown = "0.1.8"
|
||||||
|
log = "0.4.2"
|
||||||
|
rand = "0.6.5"
|
||||||
|
serde = "1.0.88"
|
||||||
|
serde_derive = "1.0.88"
|
||||||
|
serde_json = "1.0.38"
|
||||||
|
solana-metrics = { path = "../metrics", version = "0.12.0" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.12.0" }
|
solana-sdk = { path = "../sdk", version = "0.12.0" }
|
||||||
solana-native-loader = { path = "../programs/native/native_loader", version = "0.12.0" }
|
solana-native-loader = { path = "../programs/native/native_loader", version = "0.12.0" }
|
||||||
solana-system-program = { path = "../programs/native/system", version = "0.12.0" }
|
solana-system-program = { path = "../programs/native/system", version = "0.12.0" }
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
|
|
||||||
extern crate test;
|
extern crate test;
|
||||||
|
|
||||||
use solana::bank::*;
|
use solana_runtime::bank::*;
|
||||||
use solana::genesis_block::GenesisBlock;
|
use solana_runtime::last_id_queue::MAX_ENTRY_IDS;
|
||||||
use solana::last_id_queue::MAX_ENTRY_IDS;
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::hash;
|
use solana_sdk::hash::hash;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
|
@ -3,7 +3,7 @@
|
||||||
extern crate test;
|
extern crate test;
|
||||||
use bv::BitVec;
|
use bv::BitVec;
|
||||||
use fnv::FnvHasher;
|
use fnv::FnvHasher;
|
||||||
use solana::bloom::{Bloom, BloomHashIndex};
|
use solana_runtime::bloom::{Bloom, BloomHashIndex};
|
||||||
use solana_sdk::hash::{hash, Hash};
|
use solana_sdk::hash::{hash, Hash};
|
||||||
use solana_sdk::signature::Signature;
|
use solana_sdk::signature::Signature;
|
||||||
//use std::collections::HashSet;
|
//use std::collections::HashSet;
|
|
@ -1,10 +1,9 @@
|
||||||
use crate::bank::BankError;
|
use crate::bank::{BankError, Result};
|
||||||
use crate::bank::Result;
|
use crate::runtime::has_duplicates;
|
||||||
use crate::counter::Counter;
|
|
||||||
use bincode::serialize;
|
use bincode::serialize;
|
||||||
use hashbrown::{HashMap, HashSet};
|
use hashbrown::{HashMap, HashSet};
|
||||||
use log::Level;
|
use log::{debug, Level};
|
||||||
use solana_runtime::has_duplicates;
|
use solana_metrics::counter::Counter;
|
||||||
use solana_sdk::account::Account;
|
use solana_sdk::account::Account;
|
||||||
use solana_sdk::hash::{hash, Hash};
|
use solana_sdk::hash::{hash, Hash};
|
||||||
use solana_sdk::native_loader;
|
use solana_sdk::native_loader;
|
||||||
|
@ -256,13 +255,13 @@ impl AccountsDB {
|
||||||
pub fn transaction_count(&self) -> u64 {
|
pub fn transaction_count(&self) -> u64 {
|
||||||
self.transaction_count
|
self.transaction_count
|
||||||
}
|
}
|
||||||
pub fn account_values_slow(&self) -> Vec<(Pubkey, solana_sdk::account::Account)> {
|
//pub fn account_values_slow(&self) -> Vec<(Pubkey, solana_sdk::account::Account)> {
|
||||||
self.accounts.iter().map(|(x, y)| (*x, y.clone())).collect()
|
// self.accounts.iter().map(|(x, y)| (*x, y.clone())).collect()
|
||||||
}
|
//}
|
||||||
fn merge(&mut self, other: Self) {
|
//fn merge(&mut self, other: Self) {
|
||||||
self.transaction_count += other.transaction_count;
|
// self.transaction_count += other.transaction_count;
|
||||||
self.accounts.extend(other.accounts)
|
// self.accounts.extend(other.accounts)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Accounts {
|
impl Accounts {
|
||||||
|
@ -390,27 +389,27 @@ impl Accounts {
|
||||||
pub fn transaction_count(&self) -> u64 {
|
pub fn transaction_count(&self) -> u64 {
|
||||||
self.accounts_db.read().unwrap().transaction_count()
|
self.accounts_db.read().unwrap().transaction_count()
|
||||||
}
|
}
|
||||||
/// accounts starts with an empty data structure for every fork
|
///// accounts starts with an empty data structure for every fork
|
||||||
/// self is root, merge the fork into self
|
///// self is root, merge the fork into self
|
||||||
pub fn merge_into_root(&self, other: Self) {
|
//pub fn merge_into_root(&self, other: Self) {
|
||||||
assert!(other.account_locks.lock().unwrap().is_empty());
|
// assert!(other.account_locks.lock().unwrap().is_empty());
|
||||||
let db = other.accounts_db.into_inner().unwrap();
|
// let db = other.accounts_db.into_inner().unwrap();
|
||||||
let mut mydb = self.accounts_db.write().unwrap();
|
// let mut mydb = self.accounts_db.write().unwrap();
|
||||||
mydb.merge(db)
|
// mydb.merge(db)
|
||||||
}
|
//}
|
||||||
pub fn copy_for_tpu(&self) -> Self {
|
//pub fn copy_for_tpu(&self) -> Self {
|
||||||
//TODO: deprecate this in favor of forks and merge_into_root
|
// //TODO: deprecate this in favor of forks and merge_into_root
|
||||||
let copy = Accounts::default();
|
// let copy = Accounts::default();
|
||||||
|
|
||||||
{
|
// {
|
||||||
let mut accounts_db = copy.accounts_db.write().unwrap();
|
// let mut accounts_db = copy.accounts_db.write().unwrap();
|
||||||
for (key, val) in self.accounts_db.read().unwrap().accounts.iter() {
|
// for (key, val) in self.accounts_db.read().unwrap().accounts.iter() {
|
||||||
accounts_db.accounts.insert(key.clone(), val.clone());
|
// accounts_db.accounts.insert(key.clone(), val.clone());
|
||||||
}
|
// }
|
||||||
accounts_db.transaction_count = self.transaction_count();
|
// accounts_db.transaction_count = self.transaction_count();
|
||||||
}
|
// }
|
||||||
copy
|
// copy
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
|
@ -4,16 +4,16 @@
|
||||||
//! already been signed and verified.
|
//! already been signed and verified.
|
||||||
|
|
||||||
use crate::accounts::{Accounts, ErrorCounters, InstructionAccounts, InstructionLoaders};
|
use crate::accounts::{Accounts, ErrorCounters, InstructionAccounts, InstructionLoaders};
|
||||||
use crate::counter::Counter;
|
use crate::last_id_queue::LastIdQueue;
|
||||||
use crate::genesis_block::GenesisBlock;
|
use crate::runtime::{self, RuntimeError};
|
||||||
use crate::last_id_queue::{LastIdQueue, MAX_ENTRY_IDS};
|
|
||||||
use crate::status_cache::StatusCache;
|
use crate::status_cache::StatusCache;
|
||||||
use bincode::{deserialize, serialize};
|
use bincode::{deserialize, serialize};
|
||||||
use log::Level;
|
use log::{debug, info, Level};
|
||||||
use solana_runtime::{self, RuntimeError};
|
use solana_metrics::counter::Counter;
|
||||||
use solana_sdk::account::Account;
|
use solana_sdk::account::Account;
|
||||||
use solana_sdk::bpf_loader;
|
use solana_sdk::bpf_loader;
|
||||||
use solana_sdk::budget_program;
|
use solana_sdk::budget_program;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::{extend_and_hash, Hash};
|
use solana_sdk::hash::{extend_and_hash, Hash};
|
||||||
use solana_sdk::native_loader;
|
use solana_sdk::native_loader;
|
||||||
use solana_sdk::native_program::ProgramError;
|
use solana_sdk::native_program::ProgramError;
|
||||||
|
@ -22,7 +22,7 @@ use solana_sdk::signature::{Keypair, Signature};
|
||||||
use solana_sdk::storage_program;
|
use solana_sdk::storage_program;
|
||||||
use solana_sdk::system_program;
|
use solana_sdk::system_program;
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
use solana_sdk::timing::{duration_as_us, NUM_TICKS_PER_SECOND};
|
use solana_sdk::timing::{duration_as_us, MAX_ENTRY_IDS, NUM_TICKS_PER_SECOND};
|
||||||
use solana_sdk::token_program;
|
use solana_sdk::token_program;
|
||||||
use solana_sdk::transaction::Transaction;
|
use solana_sdk::transaction::Transaction;
|
||||||
use solana_sdk::vote_program::{self, VoteState};
|
use solana_sdk::vote_program::{self, VoteState};
|
||||||
|
@ -389,7 +389,7 @@ impl Bank {
|
||||||
.map(|(accs, tx)| match accs {
|
.map(|(accs, tx)| match accs {
|
||||||
Err(e) => Err(e.clone()),
|
Err(e) => Err(e.clone()),
|
||||||
Ok((ref mut accounts, ref mut loaders)) => {
|
Ok((ref mut accounts, ref mut loaders)) => {
|
||||||
solana_runtime::execute_transaction(tx, loaders, accounts, tick_height).map_err(
|
runtime::execute_transaction(tx, loaders, accounts, tick_height).map_err(
|
||||||
|RuntimeError::ProgramError(index, err)| {
|
|RuntimeError::ProgramError(index, err)| {
|
||||||
BankError::ProgramError(index, err)
|
BankError::ProgramError(index, err)
|
||||||
},
|
},
|
||||||
|
@ -628,6 +628,7 @@ impl Bank {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
|
use solana_sdk::genesis_block::BOOTSTRAP_LEADER_TOKENS;
|
||||||
use solana_sdk::hash::hash;
|
use solana_sdk::hash::hash;
|
||||||
use solana_sdk::native_program::ProgramError;
|
use solana_sdk::native_program::ProgramError;
|
||||||
use solana_sdk::signature::Keypair;
|
use solana_sdk::signature::Keypair;
|
||||||
|
@ -647,7 +648,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_bank_new_with_leader() {
|
fn test_bank_new_with_leader() {
|
||||||
let dummy_leader_id = Keypair::new().pubkey();
|
let dummy_leader_id = Keypair::new().pubkey();
|
||||||
let dummy_leader_tokens = crate::genesis_block::BOOTSTRAP_LEADER_TOKENS;
|
let dummy_leader_tokens = BOOTSTRAP_LEADER_TOKENS;
|
||||||
let (genesis_block, _) =
|
let (genesis_block, _) =
|
||||||
GenesisBlock::new_with_leader(10_000, dummy_leader_id, dummy_leader_tokens);
|
GenesisBlock::new_with_leader(10_000, dummy_leader_id, dummy_leader_tokens);
|
||||||
assert_eq!(genesis_block.bootstrap_leader_tokens, dummy_leader_tokens);
|
assert_eq!(genesis_block.bootstrap_leader_tokens, dummy_leader_tokens);
|
||||||
|
@ -797,7 +798,7 @@ mod tests {
|
||||||
// Result failed, but signature is registered
|
// Result failed, but signature is registered
|
||||||
assert!(res.is_err());
|
assert!(res.is_err());
|
||||||
assert!(bank.has_signature(&signature));
|
assert!(bank.has_signature(&signature));
|
||||||
assert_matches!(
|
assert_eq!(
|
||||||
bank.get_signature_status(&signature),
|
bank.get_signature_status(&signature),
|
||||||
Some(Err(BankError::ProgramError(
|
Some(Err(BankError::ProgramError(
|
||||||
0,
|
0,
|
||||||
|
@ -833,7 +834,7 @@ mod tests {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(bank.transaction_count(), 1);
|
assert_eq!(bank.transaction_count(), 1);
|
||||||
assert_eq!(bank.get_balance(&pubkey), 1_000);
|
assert_eq!(bank.get_balance(&pubkey), 1_000);
|
||||||
assert_matches!(
|
assert_eq!(
|
||||||
bank.transfer(10_001, &mint_keypair, pubkey, genesis_block.last_id()),
|
bank.transfer(10_001, &mint_keypair, pubkey, genesis_block.last_id()),
|
||||||
Err(BankError::ProgramError(
|
Err(BankError::ProgramError(
|
||||||
0,
|
0,
|
||||||
|
@ -886,7 +887,6 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_process_genesis() {
|
fn test_process_genesis() {
|
||||||
solana_logger::setup();
|
|
||||||
let dummy_leader_id = Keypair::new().pubkey();
|
let dummy_leader_id = Keypair::new().pubkey();
|
||||||
let dummy_leader_tokens = 2;
|
let dummy_leader_tokens = 2;
|
||||||
let (genesis_block, _) =
|
let (genesis_block, _) =
|
||||||
|
@ -931,10 +931,9 @@ mod tests {
|
||||||
|
|
||||||
bank.unlock_accounts(&pay_alice, &results_alice);
|
bank.unlock_accounts(&pay_alice, &results_alice);
|
||||||
|
|
||||||
assert_matches!(
|
assert!(bank
|
||||||
bank.transfer(2, &mint_keypair, bob.pubkey(), genesis_block.last_id()),
|
.transfer(2, &mint_keypair, bob.pubkey(), genesis_block.last_id())
|
||||||
Ok(_)
|
.is_ok());
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -1000,7 +999,6 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_bank_storage() {
|
fn test_bank_storage() {
|
||||||
solana_logger::setup();
|
|
||||||
let (genesis_block, alice) = GenesisBlock::new(1000);
|
let (genesis_block, alice) = GenesisBlock::new(1000);
|
||||||
let bank = Bank::new(&genesis_block);
|
let bank = Bank::new(&genesis_block);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
use bv::BitVec;
|
use bv::BitVec;
|
||||||
use fnv::FnvHasher;
|
use fnv::FnvHasher;
|
||||||
use rand::{self, Rng};
|
use rand::{self, Rng};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::hash::Hasher;
|
use std::hash::Hasher;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
|
@ -1,14 +1,6 @@
|
||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::timing::{timestamp, NUM_TICKS_PER_SECOND};
|
use solana_sdk::timing::{timestamp, MAX_ENTRY_IDS};
|
||||||
|
|
||||||
/// The number of most recent `last_id` values that the bank will track the signatures
|
|
||||||
/// of. Once the bank discards a `last_id`, it will reject any transactions that use
|
|
||||||
/// that `last_id` in a transaction. Lowering this value reduces memory consumption,
|
|
||||||
/// but requires clients to update its `last_id` more frequently. Raising the value
|
|
||||||
/// lengthens the time a client must wait to be certain a missing transaction will
|
|
||||||
/// not be processed by the network.
|
|
||||||
pub const MAX_ENTRY_IDS: usize = NUM_TICKS_PER_SECOND * 120;
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, Clone)]
|
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||||
struct LastIdEntry {
|
struct LastIdEntry {
|
||||||
|
@ -48,6 +40,7 @@ impl LastIdQueue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// check if entry is valid
|
/// check if entry is valid
|
||||||
|
#[cfg(test)]
|
||||||
pub fn check_entry(&self, entry_id: Hash) -> bool {
|
pub fn check_entry(&self, entry_id: Hash) -> bool {
|
||||||
self.entries.get(&entry_id).is_some()
|
self.entries.get(&entry_id).is_some()
|
||||||
}
|
}
|
||||||
|
@ -124,12 +117,14 @@ impl LastIdQueue {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
pub fn clear(&mut self) {
|
pub fn clear(&mut self) {
|
||||||
self.entries = HashMap::new();
|
self.entries = HashMap::new();
|
||||||
self.tick_height = 0;
|
self.tick_height = 0;
|
||||||
self.last_id = None;
|
self.last_id = None;
|
||||||
}
|
}
|
||||||
/// fork for LastIdQueue is a simple clone
|
/// fork for LastIdQueue is a simple clone
|
||||||
|
#[cfg(test)]
|
||||||
pub fn fork(&self) -> Self {
|
pub fn fork(&self) -> Self {
|
||||||
Self {
|
Self {
|
||||||
entries: self.entries.clone(),
|
entries: self.entries.clone(),
|
||||||
|
@ -138,6 +133,7 @@ impl LastIdQueue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// merge for entryq is a swap
|
/// merge for entryq is a swap
|
||||||
|
#[cfg(test)]
|
||||||
pub fn merge_into_root(&mut self, other: Self) {
|
pub fn merge_into_root(&mut self, other: Self) {
|
||||||
let (entries, tick_height, last_id) = { (other.entries, other.tick_height, other.last_id) };
|
let (entries, tick_height, last_id) = { (other.entries, other.tick_height, other.last_id) };
|
||||||
self.entries = entries;
|
self.entries = entries;
|
|
@ -1,209 +1,9 @@
|
||||||
use solana_native_loader;
|
mod accounts;
|
||||||
use solana_sdk::account::{create_keyed_accounts, Account, KeyedAccount};
|
pub mod bank;
|
||||||
use solana_sdk::native_program::ProgramError;
|
pub mod bloom;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
mod last_id_queue;
|
||||||
use solana_sdk::system_program;
|
pub mod runtime;
|
||||||
use solana_sdk::transaction::Transaction;
|
mod status_cache;
|
||||||
use solana_system_program;
|
|
||||||
|
|
||||||
/// Reasons the runtime might have rejected a transaction.
|
#[macro_use]
|
||||||
#[derive(Debug, PartialEq, Eq, Clone)]
|
extern crate solana_metrics;
|
||||||
pub enum RuntimeError {
|
|
||||||
/// Executing the instruction at the given index produced an error.
|
|
||||||
ProgramError(u8, ProgramError),
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Process an instruction
|
|
||||||
/// This method calls the instruction's program entrypoint method
|
|
||||||
fn process_instruction(
|
|
||||||
tx: &Transaction,
|
|
||||||
instruction_index: usize,
|
|
||||||
executable_accounts: &mut [(Pubkey, Account)],
|
|
||||||
program_accounts: &mut [&mut Account],
|
|
||||||
tick_height: u64,
|
|
||||||
) -> Result<(), ProgramError> {
|
|
||||||
let program_id = tx.program_id(instruction_index);
|
|
||||||
|
|
||||||
let mut keyed_accounts = create_keyed_accounts(executable_accounts);
|
|
||||||
let mut keyed_accounts2: Vec<_> = tx.instructions[instruction_index]
|
|
||||||
.accounts
|
|
||||||
.iter()
|
|
||||||
.map(|&index| {
|
|
||||||
let index = index as usize;
|
|
||||||
let key = &tx.account_keys[index];
|
|
||||||
(key, index < tx.signatures.len())
|
|
||||||
})
|
|
||||||
.zip(program_accounts.iter_mut())
|
|
||||||
.map(|((key, is_signer), account)| KeyedAccount::new(key, is_signer, account))
|
|
||||||
.collect();
|
|
||||||
keyed_accounts.append(&mut keyed_accounts2);
|
|
||||||
|
|
||||||
if system_program::check_id(&program_id) {
|
|
||||||
solana_system_program::entrypoint(
|
|
||||||
&program_id,
|
|
||||||
&mut keyed_accounts[1..],
|
|
||||||
&tx.instructions[instruction_index].userdata,
|
|
||||||
tick_height,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
solana_native_loader::entrypoint(
|
|
||||||
&program_id,
|
|
||||||
&mut keyed_accounts,
|
|
||||||
&tx.instructions[instruction_index].userdata,
|
|
||||||
tick_height,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify_instruction(
|
|
||||||
program_id: &Pubkey,
|
|
||||||
pre_program_id: &Pubkey,
|
|
||||||
pre_tokens: u64,
|
|
||||||
account: &Account,
|
|
||||||
) -> Result<(), ProgramError> {
|
|
||||||
// Verify the transaction
|
|
||||||
|
|
||||||
// Make sure that program_id is still the same or this was just assigned by the system program
|
|
||||||
if *pre_program_id != account.owner && !system_program::check_id(&program_id) {
|
|
||||||
return Err(ProgramError::ModifiedProgramId);
|
|
||||||
}
|
|
||||||
// For accounts unassigned to the program, the individual balance of each accounts cannot decrease.
|
|
||||||
if *program_id != account.owner && pre_tokens > account.tokens {
|
|
||||||
return Err(ProgramError::ExternalAccountTokenSpend);
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Execute an instruction
|
|
||||||
/// This method calls the instruction's program entrypoint method and verifies that the result of
|
|
||||||
/// the call does not violate the bank's accounting rules.
|
|
||||||
/// The accounts are committed back to the bank only if this function returns Ok(_).
|
|
||||||
fn execute_instruction(
|
|
||||||
tx: &Transaction,
|
|
||||||
instruction_index: usize,
|
|
||||||
executable_accounts: &mut [(Pubkey, Account)],
|
|
||||||
program_accounts: &mut [&mut Account],
|
|
||||||
tick_height: u64,
|
|
||||||
) -> Result<(), ProgramError> {
|
|
||||||
let program_id = tx.program_id(instruction_index);
|
|
||||||
// TODO: the runtime should be checking read/write access to memory
|
|
||||||
// we are trusting the hard-coded programs not to clobber or allocate
|
|
||||||
let pre_total: u64 = program_accounts.iter().map(|a| a.tokens).sum();
|
|
||||||
let pre_data: Vec<_> = program_accounts
|
|
||||||
.iter_mut()
|
|
||||||
.map(|a| (a.owner, a.tokens))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
process_instruction(
|
|
||||||
tx,
|
|
||||||
instruction_index,
|
|
||||||
executable_accounts,
|
|
||||||
program_accounts,
|
|
||||||
tick_height,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
// Verify the instruction
|
|
||||||
for ((pre_program_id, pre_tokens), post_account) in pre_data.iter().zip(program_accounts.iter())
|
|
||||||
{
|
|
||||||
verify_instruction(&program_id, pre_program_id, *pre_tokens, post_account)?;
|
|
||||||
}
|
|
||||||
// The total sum of all the tokens in all the accounts cannot change.
|
|
||||||
let post_total: u64 = program_accounts.iter().map(|a| a.tokens).sum();
|
|
||||||
if pre_total != post_total {
|
|
||||||
return Err(ProgramError::UnbalancedInstruction);
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return true if the slice has any duplicate elements
|
|
||||||
pub fn has_duplicates<T: PartialEq>(xs: &[T]) -> bool {
|
|
||||||
// Note: This is an O(n^2) algorithm, but requires no heap allocations. The benchmark
|
|
||||||
// `bench_has_duplicates` in benches/runtime.rs shows that this implementation is
|
|
||||||
// ~50 times faster than using HashSet for very short slices.
|
|
||||||
for i in 1..xs.len() {
|
|
||||||
if xs[i..].contains(&xs[i - 1]) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get mut references to a subset of elements.
|
|
||||||
fn get_subset_unchecked_mut<'a, T>(xs: &'a mut [T], indexes: &[u8]) -> Vec<&'a mut T> {
|
|
||||||
// Since the compiler doesn't know the indexes are unique, dereferencing
|
|
||||||
// multiple mut elements is assumed to be unsafe. If, however, all
|
|
||||||
// indexes are unique, it's perfectly safe. The returned elements will share
|
|
||||||
// the liftime of the input slice.
|
|
||||||
|
|
||||||
// Make certain there are no duplicate indexes. If there are, panic because we
|
|
||||||
// can't return multiple mut references to the same element.
|
|
||||||
if has_duplicates(indexes) {
|
|
||||||
panic!("duplicate indexes");
|
|
||||||
}
|
|
||||||
|
|
||||||
indexes
|
|
||||||
.iter()
|
|
||||||
.map(|i| {
|
|
||||||
let ptr = &mut xs[*i as usize] as *mut T;
|
|
||||||
unsafe { &mut *ptr }
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Execute a transaction.
|
|
||||||
/// This method calls each instruction in the transaction over the set of loaded Accounts
|
|
||||||
/// The accounts are committed back to the bank only if every instruction succeeds
|
|
||||||
pub fn execute_transaction(
|
|
||||||
tx: &Transaction,
|
|
||||||
loaders: &mut [Vec<(Pubkey, Account)>],
|
|
||||||
tx_accounts: &mut [Account],
|
|
||||||
tick_height: u64,
|
|
||||||
) -> Result<(), RuntimeError> {
|
|
||||||
for (instruction_index, instruction) in tx.instructions.iter().enumerate() {
|
|
||||||
let executable_accounts = &mut (&mut loaders[instruction.program_ids_index as usize]);
|
|
||||||
let mut program_accounts = get_subset_unchecked_mut(tx_accounts, &instruction.accounts);
|
|
||||||
execute_instruction(
|
|
||||||
tx,
|
|
||||||
instruction_index,
|
|
||||||
executable_accounts,
|
|
||||||
&mut program_accounts,
|
|
||||||
tick_height,
|
|
||||||
)
|
|
||||||
.map_err(|err| RuntimeError::ProgramError(instruction_index as u8, err))?;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_has_duplicates() {
|
|
||||||
assert!(!has_duplicates(&[1, 2]));
|
|
||||||
assert!(has_duplicates(&[1, 2, 1]));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_get_subset_unchecked_mut() {
|
|
||||||
assert_eq!(get_subset_unchecked_mut(&mut [7, 8], &[0]), vec![&mut 7]);
|
|
||||||
assert_eq!(
|
|
||||||
get_subset_unchecked_mut(&mut [7, 8], &[0, 1]),
|
|
||||||
vec![&mut 7, &mut 8]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[should_panic]
|
|
||||||
fn test_get_subset_unchecked_mut_duplicate_index() {
|
|
||||||
// This panics, because it assumes duplicate detection is done elsewhere.
|
|
||||||
get_subset_unchecked_mut(&mut [7, 8], &[0, 0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[should_panic]
|
|
||||||
fn test_get_subset_unchecked_mut_out_of_bounds() {
|
|
||||||
// This panics, because it assumes bounds validation is done elsewhere.
|
|
||||||
get_subset_unchecked_mut(&mut [7, 8], &[2]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,209 @@
|
||||||
|
use solana_native_loader;
|
||||||
|
use solana_sdk::account::{create_keyed_accounts, Account, KeyedAccount};
|
||||||
|
use solana_sdk::native_program::ProgramError;
|
||||||
|
use solana_sdk::pubkey::Pubkey;
|
||||||
|
use solana_sdk::system_program;
|
||||||
|
use solana_sdk::transaction::Transaction;
|
||||||
|
use solana_system_program;
|
||||||
|
|
||||||
|
/// Reasons the runtime might have rejected a transaction.
|
||||||
|
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||||
|
pub enum RuntimeError {
|
||||||
|
/// Executing the instruction at the given index produced an error.
|
||||||
|
ProgramError(u8, ProgramError),
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Process an instruction
|
||||||
|
/// This method calls the instruction's program entrypoint method
|
||||||
|
fn process_instruction(
|
||||||
|
tx: &Transaction,
|
||||||
|
instruction_index: usize,
|
||||||
|
executable_accounts: &mut [(Pubkey, Account)],
|
||||||
|
program_accounts: &mut [&mut Account],
|
||||||
|
tick_height: u64,
|
||||||
|
) -> Result<(), ProgramError> {
|
||||||
|
let program_id = tx.program_id(instruction_index);
|
||||||
|
|
||||||
|
let mut keyed_accounts = create_keyed_accounts(executable_accounts);
|
||||||
|
let mut keyed_accounts2: Vec<_> = tx.instructions[instruction_index]
|
||||||
|
.accounts
|
||||||
|
.iter()
|
||||||
|
.map(|&index| {
|
||||||
|
let index = index as usize;
|
||||||
|
let key = &tx.account_keys[index];
|
||||||
|
(key, index < tx.signatures.len())
|
||||||
|
})
|
||||||
|
.zip(program_accounts.iter_mut())
|
||||||
|
.map(|((key, is_signer), account)| KeyedAccount::new(key, is_signer, account))
|
||||||
|
.collect();
|
||||||
|
keyed_accounts.append(&mut keyed_accounts2);
|
||||||
|
|
||||||
|
if system_program::check_id(&program_id) {
|
||||||
|
solana_system_program::entrypoint(
|
||||||
|
&program_id,
|
||||||
|
&mut keyed_accounts[1..],
|
||||||
|
&tx.instructions[instruction_index].userdata,
|
||||||
|
tick_height,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
solana_native_loader::entrypoint(
|
||||||
|
&program_id,
|
||||||
|
&mut keyed_accounts,
|
||||||
|
&tx.instructions[instruction_index].userdata,
|
||||||
|
tick_height,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn verify_instruction(
|
||||||
|
program_id: &Pubkey,
|
||||||
|
pre_program_id: &Pubkey,
|
||||||
|
pre_tokens: u64,
|
||||||
|
account: &Account,
|
||||||
|
) -> Result<(), ProgramError> {
|
||||||
|
// Verify the transaction
|
||||||
|
|
||||||
|
// Make sure that program_id is still the same or this was just assigned by the system program
|
||||||
|
if *pre_program_id != account.owner && !system_program::check_id(&program_id) {
|
||||||
|
return Err(ProgramError::ModifiedProgramId);
|
||||||
|
}
|
||||||
|
// For accounts unassigned to the program, the individual balance of each accounts cannot decrease.
|
||||||
|
if *program_id != account.owner && pre_tokens > account.tokens {
|
||||||
|
return Err(ProgramError::ExternalAccountTokenSpend);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Execute an instruction
|
||||||
|
/// This method calls the instruction's program entrypoint method and verifies that the result of
|
||||||
|
/// the call does not violate the bank's accounting rules.
|
||||||
|
/// The accounts are committed back to the bank only if this function returns Ok(_).
|
||||||
|
fn execute_instruction(
|
||||||
|
tx: &Transaction,
|
||||||
|
instruction_index: usize,
|
||||||
|
executable_accounts: &mut [(Pubkey, Account)],
|
||||||
|
program_accounts: &mut [&mut Account],
|
||||||
|
tick_height: u64,
|
||||||
|
) -> Result<(), ProgramError> {
|
||||||
|
let program_id = tx.program_id(instruction_index);
|
||||||
|
// TODO: the runtime should be checking read/write access to memory
|
||||||
|
// we are trusting the hard-coded programs not to clobber or allocate
|
||||||
|
let pre_total: u64 = program_accounts.iter().map(|a| a.tokens).sum();
|
||||||
|
let pre_data: Vec<_> = program_accounts
|
||||||
|
.iter_mut()
|
||||||
|
.map(|a| (a.owner, a.tokens))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
process_instruction(
|
||||||
|
tx,
|
||||||
|
instruction_index,
|
||||||
|
executable_accounts,
|
||||||
|
program_accounts,
|
||||||
|
tick_height,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
// Verify the instruction
|
||||||
|
for ((pre_program_id, pre_tokens), post_account) in pre_data.iter().zip(program_accounts.iter())
|
||||||
|
{
|
||||||
|
verify_instruction(&program_id, pre_program_id, *pre_tokens, post_account)?;
|
||||||
|
}
|
||||||
|
// The total sum of all the tokens in all the accounts cannot change.
|
||||||
|
let post_total: u64 = program_accounts.iter().map(|a| a.tokens).sum();
|
||||||
|
if pre_total != post_total {
|
||||||
|
return Err(ProgramError::UnbalancedInstruction);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return true if the slice has any duplicate elements
|
||||||
|
pub fn has_duplicates<T: PartialEq>(xs: &[T]) -> bool {
|
||||||
|
// Note: This is an O(n^2) algorithm, but requires no heap allocations. The benchmark
|
||||||
|
// `bench_has_duplicates` in benches/runtime.rs shows that this implementation is
|
||||||
|
// ~50 times faster than using HashSet for very short slices.
|
||||||
|
for i in 1..xs.len() {
|
||||||
|
if xs[i..].contains(&xs[i - 1]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get mut references to a subset of elements.
|
||||||
|
fn get_subset_unchecked_mut<'a, T>(xs: &'a mut [T], indexes: &[u8]) -> Vec<&'a mut T> {
|
||||||
|
// Since the compiler doesn't know the indexes are unique, dereferencing
|
||||||
|
// multiple mut elements is assumed to be unsafe. If, however, all
|
||||||
|
// indexes are unique, it's perfectly safe. The returned elements will share
|
||||||
|
// the liftime of the input slice.
|
||||||
|
|
||||||
|
// Make certain there are no duplicate indexes. If there are, panic because we
|
||||||
|
// can't return multiple mut references to the same element.
|
||||||
|
if has_duplicates(indexes) {
|
||||||
|
panic!("duplicate indexes");
|
||||||
|
}
|
||||||
|
|
||||||
|
indexes
|
||||||
|
.iter()
|
||||||
|
.map(|i| {
|
||||||
|
let ptr = &mut xs[*i as usize] as *mut T;
|
||||||
|
unsafe { &mut *ptr }
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Execute a transaction.
|
||||||
|
/// This method calls each instruction in the transaction over the set of loaded Accounts
|
||||||
|
/// The accounts are committed back to the bank only if every instruction succeeds
|
||||||
|
pub fn execute_transaction(
|
||||||
|
tx: &Transaction,
|
||||||
|
loaders: &mut [Vec<(Pubkey, Account)>],
|
||||||
|
tx_accounts: &mut [Account],
|
||||||
|
tick_height: u64,
|
||||||
|
) -> Result<(), RuntimeError> {
|
||||||
|
for (instruction_index, instruction) in tx.instructions.iter().enumerate() {
|
||||||
|
let executable_accounts = &mut (&mut loaders[instruction.program_ids_index as usize]);
|
||||||
|
let mut program_accounts = get_subset_unchecked_mut(tx_accounts, &instruction.accounts);
|
||||||
|
execute_instruction(
|
||||||
|
tx,
|
||||||
|
instruction_index,
|
||||||
|
executable_accounts,
|
||||||
|
&mut program_accounts,
|
||||||
|
tick_height,
|
||||||
|
)
|
||||||
|
.map_err(|err| RuntimeError::ProgramError(instruction_index as u8, err))?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_has_duplicates() {
|
||||||
|
assert!(!has_duplicates(&[1, 2]));
|
||||||
|
assert!(has_duplicates(&[1, 2, 1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_subset_unchecked_mut() {
|
||||||
|
assert_eq!(get_subset_unchecked_mut(&mut [7, 8], &[0]), vec![&mut 7]);
|
||||||
|
assert_eq!(
|
||||||
|
get_subset_unchecked_mut(&mut [7, 8], &[0, 1]),
|
||||||
|
vec![&mut 7, &mut 8]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_get_subset_unchecked_mut_duplicate_index() {
|
||||||
|
// This panics, because it assumes duplicate detection is done elsewhere.
|
||||||
|
get_subset_unchecked_mut(&mut [7, 8], &[0, 0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_get_subset_unchecked_mut_out_of_bounds() {
|
||||||
|
// This panics, because it assumes bounds validation is done elsewhere.
|
||||||
|
get_subset_unchecked_mut(&mut [7, 8], &[2]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,11 +1,12 @@
|
||||||
use crate::bloom::{Bloom, BloomHashIndex};
|
use crate::bloom::{Bloom, BloomHashIndex};
|
||||||
use crate::last_id_queue::MAX_ENTRY_IDS;
|
|
||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::signature::Signature;
|
use solana_sdk::signature::Signature;
|
||||||
use solana_sdk::timing::NUM_TICKS_PER_SECOND;
|
use solana_sdk::timing::{MAX_ENTRY_IDS, NUM_TICKS_PER_SECOND};
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::Deref;
|
||||||
|
#[cfg(test)]
|
||||||
|
use std::ops::DerefMut;
|
||||||
|
|
||||||
/// This cache is designed to last 1 second
|
/// This cache is designed to last 1 second
|
||||||
const MAX_CACHE_ENTRIES: usize = MAX_ENTRY_IDS / NUM_TICKS_PER_SECOND;
|
const MAX_CACHE_ENTRIES: usize = MAX_ENTRY_IDS / NUM_TICKS_PER_SECOND;
|
||||||
|
@ -85,6 +86,7 @@ impl<T: Clone> StatusCache<T> {
|
||||||
/// like accounts, status cache starts with an new data structure for every checkpoint
|
/// like accounts, status cache starts with an new data structure for every checkpoint
|
||||||
/// so only merge is implemented
|
/// so only merge is implemented
|
||||||
/// but the merges maintains a history
|
/// but the merges maintains a history
|
||||||
|
#[cfg(test)]
|
||||||
pub fn merge_into_root(&mut self, other: Self) {
|
pub fn merge_into_root(&mut self, other: Self) {
|
||||||
// merges should be empty for every other checkpoint accept the root
|
// merges should be empty for every other checkpoint accept the root
|
||||||
// which cannot be rolled back
|
// which cannot be rolled back
|
||||||
|
@ -131,6 +133,7 @@ impl<T: Clone> StatusCache<T> {
|
||||||
}
|
}
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
#[cfg(test)]
|
||||||
pub fn clear_all<U>(checkpoints: &mut [U]) -> bool
|
pub fn clear_all<U>(checkpoints: &mut [U]) -> bool
|
||||||
where
|
where
|
||||||
U: DerefMut<Target = Self>,
|
U: DerefMut<Target = Self>,
|
|
@ -1,8 +1,8 @@
|
||||||
//! The `genesis_block` module is a library for generating the chain's genesis block.
|
//! The `genesis_block` module is a library for generating the chain's genesis block.
|
||||||
|
|
||||||
use solana_sdk::hash::{hash, Hash};
|
use crate::hash::{hash, Hash};
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use crate::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use crate::signature::{Keypair, KeypairUtil};
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
|
@ -4,6 +4,7 @@ pub mod budget_expr;
|
||||||
pub mod budget_instruction;
|
pub mod budget_instruction;
|
||||||
pub mod budget_program;
|
pub mod budget_program;
|
||||||
pub mod budget_transaction;
|
pub mod budget_transaction;
|
||||||
|
pub mod genesis_block;
|
||||||
pub mod hash;
|
pub mod hash;
|
||||||
pub mod loader_instruction;
|
pub mod loader_instruction;
|
||||||
pub mod loader_transaction;
|
pub mod loader_transaction;
|
||||||
|
|
|
@ -9,6 +9,14 @@ pub const NUM_TICKS_PER_SECOND: usize = 10;
|
||||||
pub const DEFAULT_TICKS_PER_SLOT: u64 = 8;
|
pub const DEFAULT_TICKS_PER_SLOT: u64 = 8;
|
||||||
pub const DEFAULT_SLOTS_PER_EPOCH: u64 = 64;
|
pub const DEFAULT_SLOTS_PER_EPOCH: u64 = 64;
|
||||||
|
|
||||||
|
/// The number of most recent `last_id` values that the bank will track the signatures
|
||||||
|
/// of. Once the bank discards a `last_id`, it will reject any transactions that use
|
||||||
|
/// that `last_id` in a transaction. Lowering this value reduces memory consumption,
|
||||||
|
/// but requires clients to update its `last_id` more frequently. Raising the value
|
||||||
|
/// lengthens the time a client must wait to be certain a missing transaction will
|
||||||
|
/// not be processed by the network.
|
||||||
|
pub const MAX_ENTRY_IDS: usize = NUM_TICKS_PER_SECOND * 120;
|
||||||
|
|
||||||
pub fn duration_as_us(d: &Duration) -> u64 {
|
pub fn duration_as_us(d: &Duration) -> u64 {
|
||||||
(d.as_secs() * 1000 * 1000) + (u64::from(d.subsec_nanos()) / 1_000)
|
(d.as_secs() * 1000 * 1000) + (u64::from(d.subsec_nanos()) / 1_000)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//! The `bank_forks` module implments BankForks a DAG of checkpointed Banks
|
//! The `bank_forks` module implments BankForks a DAG of checkpointed Banks
|
||||||
|
|
||||||
use crate::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,7 @@
|
||||||
//! to contruct a software pipeline. The stage uses all available CPU cores and
|
//! to contruct a software pipeline. The stage uses all available CPU cores and
|
||||||
//! can do its processing in parallel with signature verification on the GPU.
|
//! can do its processing in parallel with signature verification on the GPU.
|
||||||
|
|
||||||
use crate::bank::{self, Bank, BankError};
|
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::entry::Entry;
|
use crate::entry::Entry;
|
||||||
use crate::last_id_queue::MAX_ENTRY_IDS;
|
|
||||||
use crate::leader_confirmation_service::LeaderConfirmationService;
|
use crate::leader_confirmation_service::LeaderConfirmationService;
|
||||||
use crate::packet::Packets;
|
use crate::packet::Packets;
|
||||||
use crate::packet::SharedPackets;
|
use crate::packet::SharedPackets;
|
||||||
|
@ -16,9 +13,11 @@ use crate::service::Service;
|
||||||
use crate::sigverify_stage::VerifiedPackets;
|
use crate::sigverify_stage::VerifiedPackets;
|
||||||
use bincode::deserialize;
|
use bincode::deserialize;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
|
use solana_runtime::bank::{self, Bank, BankError};
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::timing::{self, duration_as_us};
|
use solana_sdk::timing::{self, duration_as_us, MAX_ENTRY_IDS};
|
||||||
use solana_sdk::transaction::Transaction;
|
use solana_sdk::transaction::Transaction;
|
||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::AtomicBool;
|
||||||
use std::sync::mpsc::{channel, Receiver, RecvTimeoutError};
|
use std::sync::mpsc::{channel, Receiver, RecvTimeoutError};
|
||||||
|
@ -344,8 +343,8 @@ impl Service for BankingStage {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::entry::EntrySlice;
|
use crate::entry::EntrySlice;
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::packet::to_packets;
|
use crate::packet::to_packets;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::native_program::ProgramError;
|
use solana_sdk::native_program::ProgramError;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
//! access read to a persistent file-based ledger.
|
//! access read to a persistent file-based ledger.
|
||||||
|
|
||||||
use crate::entry::Entry;
|
use crate::entry::Entry;
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::packet::{Blob, SharedBlob, BLOB_HEADER_SIZE};
|
use crate::packet::{Blob, SharedBlob, BLOB_HEADER_SIZE};
|
||||||
use crate::result::{Error, Result};
|
use crate::result::{Error, Result};
|
||||||
use bincode::{deserialize, serialize};
|
use bincode::{deserialize, serialize};
|
||||||
|
@ -14,6 +13,7 @@ use rocksdb::{
|
||||||
};
|
};
|
||||||
use serde::de::DeserializeOwned;
|
use serde::de::DeserializeOwned;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
use crate::bank::{Bank, BankError, Result};
|
|
||||||
use crate::bank_forks::BankForks;
|
use crate::bank_forks::BankForks;
|
||||||
use crate::blocktree::Blocktree;
|
use crate::blocktree::Blocktree;
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::entry::{Entry, EntrySlice};
|
use crate::entry::{Entry, EntrySlice};
|
||||||
use crate::last_id_queue::MAX_ENTRY_IDS;
|
|
||||||
use crate::leader_scheduler::LeaderScheduler;
|
use crate::leader_scheduler::LeaderScheduler;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
|
use solana_runtime::bank::{Bank, BankError, Result};
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
|
use solana_sdk::timing::MAX_ENTRY_IDS;
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
|
||||||
pub const VERIFY_BLOCK_SIZE: usize = 16;
|
pub const VERIFY_BLOCK_SIZE: usize = 16;
|
||||||
|
@ -202,7 +202,7 @@ mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::entry::{next_entries, next_entry, Entry};
|
use crate::entry::{next_entries, next_entry, Entry};
|
||||||
use crate::gen_keys::GenKeys;
|
use crate::gen_keys::GenKeys;
|
||||||
use crate::genesis_block::GenesisBlock;
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::native_program::ProgramError;
|
use solana_sdk::native_program::ProgramError;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
//! The `broadcast_service` broadcasts data from a leader node to validators
|
//! The `broadcast_service` broadcasts data from a leader node to validators
|
||||||
//!
|
//!
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::blocktree::Blocktree;
|
use crate::blocktree::Blocktree;
|
||||||
use crate::cluster_info::{ClusterInfo, ClusterInfoError, NodeInfo, DATA_PLANE_FANOUT};
|
use crate::cluster_info::{ClusterInfo, ClusterInfoError, NodeInfo, DATA_PLANE_FANOUT};
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::entry::Entry;
|
use crate::entry::Entry;
|
||||||
use crate::entry::EntrySlice;
|
use crate::entry::EntrySlice;
|
||||||
#[cfg(feature = "erasure")]
|
#[cfg(feature = "erasure")]
|
||||||
|
@ -14,7 +12,9 @@ use crate::result::{Error, Result};
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use solana_metrics::{influxdb, submit};
|
use solana_metrics::{influxdb, submit};
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::timing::duration_as_ms;
|
use solana_sdk::timing::duration_as_ms;
|
||||||
use std::net::UdpSocket;
|
use std::net::UdpSocket;
|
||||||
|
|
|
@ -12,11 +12,8 @@
|
||||||
//! * layer 2 - Everyone else, if layer 1 is `2^10`, layer 2 should be able to fit `2^20` number of nodes.
|
//! * layer 2 - Everyone else, if layer 1 is `2^10`, layer 2 should be able to fit `2^20` number of nodes.
|
||||||
//!
|
//!
|
||||||
//! Bank needs to provide an interface for us to query the stake weight
|
//! Bank needs to provide an interface for us to query the stake weight
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::blocktree::Blocktree;
|
use crate::blocktree::Blocktree;
|
||||||
use crate::bloom::Bloom;
|
|
||||||
use crate::contact_info::ContactInfo;
|
use crate::contact_info::ContactInfo;
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::crds_gossip::CrdsGossip;
|
use crate::crds_gossip::CrdsGossip;
|
||||||
use crate::crds_gossip_error::CrdsGossipError;
|
use crate::crds_gossip_error::CrdsGossipError;
|
||||||
use crate::crds_gossip_pull::CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS;
|
use crate::crds_gossip_pull::CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS;
|
||||||
|
@ -31,8 +28,11 @@ use hashbrown::HashMap;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use solana_metrics::{influxdb, submit};
|
use solana_metrics::{influxdb, submit};
|
||||||
use solana_netutil::{bind_in_range, bind_to, find_available_port_in_range, multi_bind_in_range};
|
use solana_netutil::{bind_in_range, bind_to, find_available_port_in_range, multi_bind_in_range};
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_runtime::bloom::Bloom;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil, Signable, Signature};
|
use solana_sdk::signature::{Keypair, KeypairUtil, Signable, Signature};
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use crate::cluster_info::{ClusterInfo, GOSSIP_SLEEP_MILLIS};
|
use crate::cluster_info::{ClusterInfo, GOSSIP_SLEEP_MILLIS};
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::packet;
|
use crate::packet;
|
||||||
use crate::result::Result;
|
use crate::result::Result;
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use crate::streamer::PacketSender;
|
use crate::streamer::PacketSender;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
use std::thread::{self, sleep, Builder, JoinHandle};
|
use std::thread::{self, sleep, Builder, JoinHandle};
|
||||||
|
|
|
@ -3,12 +3,12 @@
|
||||||
//! designed to run with a simulator or over a UDP network connection with messages up to a
|
//! designed to run with a simulator or over a UDP network connection with messages up to a
|
||||||
//! packet::BLOB_DATA_SIZE size.
|
//! packet::BLOB_DATA_SIZE size.
|
||||||
|
|
||||||
use crate::bloom::Bloom;
|
|
||||||
use crate::crds::Crds;
|
use crate::crds::Crds;
|
||||||
use crate::crds_gossip_error::CrdsGossipError;
|
use crate::crds_gossip_error::CrdsGossipError;
|
||||||
use crate::crds_gossip_pull::CrdsGossipPull;
|
use crate::crds_gossip_pull::CrdsGossipPull;
|
||||||
use crate::crds_gossip_push::{CrdsGossipPush, CRDS_GOSSIP_NUM_ACTIVE};
|
use crate::crds_gossip_push::{CrdsGossipPush, CRDS_GOSSIP_NUM_ACTIVE};
|
||||||
use crate::crds_value::CrdsValue;
|
use crate::crds_value::CrdsValue;
|
||||||
|
use solana_runtime::bloom::Bloom;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
//! with random hash functions. So each subsequent request will have a different distribution
|
//! with random hash functions. So each subsequent request will have a different distribution
|
||||||
//! of false positives.
|
//! of false positives.
|
||||||
|
|
||||||
use crate::bloom::Bloom;
|
|
||||||
use crate::crds::Crds;
|
use crate::crds::Crds;
|
||||||
use crate::crds_gossip::CRDS_GOSSIP_BLOOM_SIZE;
|
use crate::crds_gossip::CRDS_GOSSIP_BLOOM_SIZE;
|
||||||
use crate::crds_gossip_error::CrdsGossipError;
|
use crate::crds_gossip_error::CrdsGossipError;
|
||||||
|
@ -19,6 +18,7 @@ use bincode::serialized_size;
|
||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use rand;
|
use rand;
|
||||||
use rand::distributions::{Distribution, WeightedIndex};
|
use rand::distributions::{Distribution, WeightedIndex};
|
||||||
|
use solana_runtime::bloom::Bloom;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
//! the local nodes wallclock window they are drooped silently.
|
//! the local nodes wallclock window they are drooped silently.
|
||||||
//! 2. The prune set is stored in a Bloom filter.
|
//! 2. The prune set is stored in a Bloom filter.
|
||||||
|
|
||||||
use crate::bloom::Bloom;
|
|
||||||
use crate::contact_info::ContactInfo;
|
use crate::contact_info::ContactInfo;
|
||||||
use crate::crds::{Crds, VersionedCrdsValue};
|
use crate::crds::{Crds, VersionedCrdsValue};
|
||||||
use crate::crds_gossip::CRDS_GOSSIP_BLOOM_SIZE;
|
use crate::crds_gossip::CRDS_GOSSIP_BLOOM_SIZE;
|
||||||
|
@ -20,6 +19,7 @@ use hashbrown::HashMap;
|
||||||
use indexmap::map::IndexMap;
|
use indexmap::map::IndexMap;
|
||||||
use rand;
|
use rand;
|
||||||
use rand::seq::SliceRandom;
|
use rand::seq::SliceRandom;
|
||||||
|
use solana_runtime::bloom::Bloom;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
//! Set of functions for emulating windowing functions from a database ledger implementation
|
//! Set of functions for emulating windowing functions from a database ledger implementation
|
||||||
use crate::blocktree::*;
|
use crate::blocktree::*;
|
||||||
use crate::counter::Counter;
|
|
||||||
#[cfg(feature = "erasure")]
|
#[cfg(feature = "erasure")]
|
||||||
use crate::erasure;
|
use crate::erasure;
|
||||||
use crate::leader_scheduler::LeaderScheduler;
|
use crate::leader_scheduler::LeaderScheduler;
|
||||||
|
@ -8,6 +7,7 @@ use crate::packet::{SharedBlob, BLOB_HEADER_SIZE};
|
||||||
use crate::result::Result;
|
use crate::result::Result;
|
||||||
use crate::streamer::BlobSender;
|
use crate::streamer::BlobSender;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use solana_metrics::{influxdb, submit};
|
use solana_metrics::{influxdb, submit};
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
|
|
|
@ -152,12 +152,12 @@ pub struct EntryStreamBlock {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::entry::Entry;
|
use crate::entry::Entry;
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::leader_scheduler::LeaderSchedulerConfig;
|
use crate::leader_scheduler::LeaderSchedulerConfig;
|
||||||
use chrono::{DateTime, FixedOffset};
|
use chrono::{DateTime, FixedOffset};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
|
|
|
@ -110,12 +110,12 @@ impl Service for EntryStreamStage {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::entry::Entry;
|
use crate::entry::Entry;
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::leader_scheduler::LeaderSchedulerConfig;
|
use crate::leader_scheduler::LeaderSchedulerConfig;
|
||||||
use chrono::{DateTime, FixedOffset};
|
use chrono::{DateTime, FixedOffset};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
//! The `fullnode` module hosts all the fullnode microservices.
|
//! The `fullnode` module hosts all the fullnode microservices.
|
||||||
|
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::bank_forks::BankForks;
|
use crate::bank_forks::BankForks;
|
||||||
use crate::blocktree::{Blocktree, BlocktreeConfig};
|
use crate::blocktree::{Blocktree, BlocktreeConfig};
|
||||||
use crate::blocktree_processor;
|
use crate::blocktree_processor;
|
||||||
use crate::cluster_info::{ClusterInfo, Node, NodeInfo};
|
use crate::cluster_info::{ClusterInfo, Node, NodeInfo};
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::gossip_service::GossipService;
|
use crate::gossip_service::GossipService;
|
||||||
use crate::leader_scheduler::{LeaderScheduler, LeaderSchedulerConfig};
|
use crate::leader_scheduler::{LeaderScheduler, LeaderSchedulerConfig};
|
||||||
use crate::poh_service::PohServiceConfig;
|
use crate::poh_service::PohServiceConfig;
|
||||||
|
@ -19,6 +16,9 @@ use crate::tpu::{Tpu, TpuRotationReceiver};
|
||||||
use crate::tvu::{Sockets, Tvu};
|
use crate::tvu::{Sockets, Tvu};
|
||||||
use crate::voting_keypair::VotingKeypair;
|
use crate::voting_keypair::VotingKeypair;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
|
|
@ -2,10 +2,9 @@
|
||||||
//! to generate a thread which regularly calculates the last confirmation times
|
//! to generate a thread which regularly calculates the last confirmation times
|
||||||
//! observed by the leader
|
//! observed by the leader
|
||||||
|
|
||||||
use crate::bank::Bank;
|
|
||||||
|
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use solana_metrics::{influxdb, submit};
|
use solana_metrics::{influxdb, submit};
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::timing;
|
use solana_sdk::timing;
|
||||||
use std::result;
|
use std::result;
|
||||||
|
@ -134,12 +133,10 @@ impl Service for LeaderConfirmationService {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod tests {
|
pub mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::voting_keypair::VotingKeypair;
|
|
||||||
|
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::leader_scheduler::tests::new_vote_account;
|
use crate::leader_scheduler::tests::new_vote_account;
|
||||||
|
use crate::voting_keypair::VotingKeypair;
|
||||||
use bincode::serialize;
|
use bincode::serialize;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::hash;
|
use solana_sdk::hash::hash;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::vote_transaction::VoteTransaction;
|
use solana_sdk::vote_transaction::VoteTransaction;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
//! The `leader_scheduler` module implements a structure and functions for tracking and
|
//! The `leader_scheduler` module implements a structure and functions for tracking and
|
||||||
//! managing the schedule for leader rotation
|
//! managing the schedule for leader rotation
|
||||||
|
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::entry::{create_ticks, next_entry_mut, Entry};
|
use crate::entry::{create_ticks, next_entry_mut, Entry};
|
||||||
use crate::voting_keypair::VotingKeypair;
|
use crate::voting_keypair::VotingKeypair;
|
||||||
use bincode::serialize;
|
use bincode::serialize;
|
||||||
use byteorder::{LittleEndian, ReadBytesExt};
|
use byteorder::{LittleEndian, ReadBytesExt};
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::hash::{hash, Hash};
|
use solana_sdk::hash::{hash, Hash};
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
@ -435,8 +435,8 @@ pub fn make_active_set_entries(
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod tests {
|
pub mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::genesis_block::{GenesisBlock, BOOTSTRAP_LEADER_TOKENS};
|
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
|
use solana_sdk::genesis_block::{GenesisBlock, BOOTSTRAP_LEADER_TOKENS};
|
||||||
use std::hash::Hash as StdHash;
|
use std::hash::Hash as StdHash;
|
||||||
use std::iter::FromIterator;
|
use std::iter::FromIterator;
|
||||||
use std::sync::RwLock;
|
use std::sync::RwLock;
|
||||||
|
|
11
src/lib.rs
11
src/lib.rs
|
@ -7,14 +7,9 @@
|
||||||
//!
|
//!
|
||||||
|
|
||||||
#![cfg_attr(feature = "unstable", feature(test))]
|
#![cfg_attr(feature = "unstable", feature(test))]
|
||||||
#[macro_use]
|
|
||||||
pub mod counter;
|
|
||||||
pub mod accounts;
|
|
||||||
pub mod bank;
|
|
||||||
pub mod bank_forks;
|
pub mod bank_forks;
|
||||||
pub mod banking_stage;
|
pub mod banking_stage;
|
||||||
pub mod blob_fetch_stage;
|
pub mod blob_fetch_stage;
|
||||||
pub mod bloom;
|
|
||||||
pub mod broadcast_service;
|
pub mod broadcast_service;
|
||||||
#[cfg(feature = "chacha")]
|
#[cfg(feature = "chacha")]
|
||||||
pub mod chacha;
|
pub mod chacha;
|
||||||
|
@ -42,9 +37,7 @@ pub mod erasure;
|
||||||
pub mod fetch_stage;
|
pub mod fetch_stage;
|
||||||
pub mod fullnode;
|
pub mod fullnode;
|
||||||
pub mod gen_keys;
|
pub mod gen_keys;
|
||||||
pub mod genesis_block;
|
|
||||||
pub mod gossip_service;
|
pub mod gossip_service;
|
||||||
pub mod last_id_queue;
|
|
||||||
pub mod leader_confirmation_service;
|
pub mod leader_confirmation_service;
|
||||||
pub mod leader_scheduler;
|
pub mod leader_scheduler;
|
||||||
pub mod local_vote_signer_service;
|
pub mod local_vote_signer_service;
|
||||||
|
@ -69,7 +62,6 @@ pub mod rpc_subscriptions;
|
||||||
pub mod service;
|
pub mod service;
|
||||||
pub mod sigverify;
|
pub mod sigverify;
|
||||||
pub mod sigverify_stage;
|
pub mod sigverify_stage;
|
||||||
pub mod status_cache;
|
|
||||||
pub mod storage_stage;
|
pub mod storage_stage;
|
||||||
pub mod streamer;
|
pub mod streamer;
|
||||||
pub mod test_tx;
|
pub mod test_tx;
|
||||||
|
@ -95,6 +87,9 @@ extern crate serde_derive;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate solana_metrics;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate matches;
|
extern crate matches;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
//! The `packet` module defines data structures and methods to pull data from the network.
|
//! The `packet` module defines data structures and methods to pull data from the network.
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::recvmmsg::{recv_mmsg, NUM_RCVMMSGS};
|
use crate::recvmmsg::{recv_mmsg, NUM_RCVMMSGS};
|
||||||
use crate::result::{Error, Result};
|
use crate::result::{Error, Result};
|
||||||
use bincode::{serialize, serialize_into};
|
use bincode::{serialize, serialize_into};
|
||||||
use byteorder::{ByteOrder, LittleEndian};
|
use byteorder::{ByteOrder, LittleEndian};
|
||||||
use log::Level;
|
use log::Level;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
pub use solana_sdk::packet::PACKET_DATA_SIZE;
|
pub use solana_sdk::packet::PACKET_DATA_SIZE;
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
//! The `poh_recorder` module provides an object for synchronizing with Proof of History.
|
//! The `poh_recorder` module provides an object for synchronizing with Proof of History.
|
||||||
//! It synchronizes PoH, bank's register_tick and the ledger
|
//! It synchronizes PoH, bank's register_tick and the ledger
|
||||||
//!
|
//!
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::entry::Entry;
|
use crate::entry::Entry;
|
||||||
use crate::poh::Poh;
|
use crate::poh::Poh;
|
||||||
use crate::result::{Error, Result};
|
use crate::result::{Error, Result};
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::transaction::Transaction;
|
use solana_sdk::transaction::Transaction;
|
||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
|
@ -116,8 +116,8 @@ impl PohRecorder {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::test_tx::test_tx;
|
use crate::test_tx::test_tx;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::hash;
|
use solana_sdk::hash::hash;
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
//! The `poh_service` module implements a service that records the passing of
|
//! The `poh_service` module implements a service that records the passing of
|
||||||
//! "ticks", a measure of time in the PoH stream
|
//! "ticks", a measure of time in the PoH stream
|
||||||
|
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::poh_recorder::PohRecorder;
|
use crate::poh_recorder::PohRecorder;
|
||||||
use crate::result::Result;
|
use crate::result::Result;
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::timing::NUM_TICKS_PER_SECOND;
|
use solana_sdk::timing::NUM_TICKS_PER_SECOND;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
@ -108,9 +108,8 @@ impl Service for PohService {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::test_tx::test_tx;
|
use crate::test_tx::test_tx;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::hash;
|
use solana_sdk::hash::hash;
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
//! The `replay_stage` replays transactions broadcast by the leader.
|
//! The `replay_stage` replays transactions broadcast by the leader.
|
||||||
|
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::blocktree::Blocktree;
|
use crate::blocktree::Blocktree;
|
||||||
use crate::blocktree_processor;
|
use crate::blocktree_processor;
|
||||||
use crate::cluster_info::ClusterInfo;
|
use crate::cluster_info::ClusterInfo;
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::entry::{Entry, EntryReceiver, EntrySender, EntrySlice};
|
use crate::entry::{Entry, EntryReceiver, EntrySender, EntrySlice};
|
||||||
use crate::leader_scheduler::LeaderScheduler;
|
use crate::leader_scheduler::LeaderScheduler;
|
||||||
use crate::packet::BlobError;
|
use crate::packet::BlobError;
|
||||||
|
@ -14,7 +12,9 @@ use crate::service::Service;
|
||||||
use crate::tvu::TvuRotationSender;
|
use crate::tvu::TvuRotationSender;
|
||||||
use crate::voting_keypair::VotingKeypair;
|
use crate::voting_keypair::VotingKeypair;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use solana_metrics::{influxdb, submit};
|
use solana_metrics::{influxdb, submit};
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::timing::duration_as_ms;
|
use solana_sdk::timing::duration_as_ms;
|
||||||
|
@ -341,7 +341,6 @@ impl Service for ReplayStage {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::blocktree::{
|
use crate::blocktree::{
|
||||||
create_tmp_sample_ledger, Blocktree, BlocktreeConfig, DEFAULT_SLOT_HEIGHT,
|
create_tmp_sample_ledger, Blocktree, BlocktreeConfig, DEFAULT_SLOT_HEIGHT,
|
||||||
};
|
};
|
||||||
|
@ -349,12 +348,12 @@ mod test {
|
||||||
use crate::entry::create_ticks;
|
use crate::entry::create_ticks;
|
||||||
use crate::entry::{next_entry_mut, Entry};
|
use crate::entry::{next_entry_mut, Entry};
|
||||||
use crate::fullnode::new_bank_from_ledger;
|
use crate::fullnode::new_bank_from_ledger;
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::leader_scheduler::{
|
use crate::leader_scheduler::{
|
||||||
make_active_set_entries, LeaderScheduler, LeaderSchedulerConfig,
|
make_active_set_entries, LeaderScheduler, LeaderSchedulerConfig,
|
||||||
};
|
};
|
||||||
use crate::replay_stage::ReplayStage;
|
use crate::replay_stage::ReplayStage;
|
||||||
use crate::voting_keypair::VotingKeypair;
|
use crate::voting_keypair::VotingKeypair;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use std::fs::remove_dir_all;
|
use std::fs::remove_dir_all;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
//! The `result` module exposes a Result type that propagates one of many different Error types.
|
//! The `result` module exposes a Result type that propagates one of many different Error types.
|
||||||
|
|
||||||
use crate::bank;
|
|
||||||
use crate::blocktree;
|
use crate::blocktree;
|
||||||
use crate::cluster_info;
|
use crate::cluster_info;
|
||||||
#[cfg(feature = "erasure")]
|
#[cfg(feature = "erasure")]
|
||||||
|
@ -9,6 +8,7 @@ use crate::packet;
|
||||||
use crate::poh_recorder;
|
use crate::poh_recorder;
|
||||||
use bincode;
|
use bincode;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
|
use solana_runtime::bank;
|
||||||
use std;
|
use std;
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
//! The `retransmit_stage` retransmits blobs between validators
|
//! The `retransmit_stage` retransmits blobs between validators
|
||||||
|
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::blocktree::Blocktree;
|
use crate::blocktree::Blocktree;
|
||||||
use crate::cluster_info::{
|
use crate::cluster_info::{
|
||||||
compute_retransmit_peers, ClusterInfo, DATA_PLANE_FANOUT, GROW_LAYER_CAPACITY,
|
compute_retransmit_peers, ClusterInfo, DATA_PLANE_FANOUT, GROW_LAYER_CAPACITY,
|
||||||
NEIGHBORHOOD_SIZE,
|
NEIGHBORHOOD_SIZE,
|
||||||
};
|
};
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::leader_scheduler::LeaderScheduler;
|
use crate::leader_scheduler::LeaderScheduler;
|
||||||
use crate::packet::SharedBlob;
|
use crate::packet::SharedBlob;
|
||||||
use crate::result::{Error, Result};
|
use crate::result::{Error, Result};
|
||||||
|
@ -14,7 +12,9 @@ use crate::service::Service;
|
||||||
use crate::streamer::BlobReceiver;
|
use crate::streamer::BlobReceiver;
|
||||||
use crate::window_service::WindowService;
|
use crate::window_service::WindowService;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use solana_metrics::{influxdb, submit};
|
use solana_metrics::{influxdb, submit};
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use std::net::UdpSocket;
|
use std::net::UdpSocket;
|
||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::AtomicBool;
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
//! The `rpc` module implements the Solana RPC interface.
|
//! The `rpc` module implements the Solana RPC interface.
|
||||||
|
|
||||||
use crate::bank::{self, Bank, BankError};
|
|
||||||
use crate::cluster_info::ClusterInfo;
|
use crate::cluster_info::ClusterInfo;
|
||||||
use crate::packet::PACKET_DATA_SIZE;
|
use crate::packet::PACKET_DATA_SIZE;
|
||||||
use crate::rpc_status::RpcSignatureStatus;
|
use crate::rpc_status::RpcSignatureStatus;
|
||||||
|
@ -10,6 +9,7 @@ use bs58;
|
||||||
use jsonrpc_core::{Error, ErrorCode, Metadata, Result};
|
use jsonrpc_core::{Error, ErrorCode, Metadata, Result};
|
||||||
use jsonrpc_derive::rpc;
|
use jsonrpc_derive::rpc;
|
||||||
use solana_drone::drone::request_airdrop_transaction;
|
use solana_drone::drone::request_airdrop_transaction;
|
||||||
|
use solana_runtime::bank::{self, Bank, BankError};
|
||||||
use solana_sdk::account::Account;
|
use solana_sdk::account::Account;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::Signature;
|
use solana_sdk::signature::Signature;
|
||||||
|
@ -328,10 +328,9 @@ impl RpcSol for RpcSolImpl {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::cluster_info::NodeInfo;
|
use crate::cluster_info::NodeInfo;
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use jsonrpc_core::{MetaIoHandler, Response};
|
use jsonrpc_core::{MetaIoHandler, Response};
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::{hash, Hash};
|
use solana_sdk::hash::{hash, Hash};
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
|
|
|
@ -161,13 +161,13 @@ impl RpcSolPubSub for RpcSolPubSubImpl {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::bank::{self, Bank};
|
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use jsonrpc_core::futures::sync::mpsc;
|
use jsonrpc_core::futures::sync::mpsc;
|
||||||
use jsonrpc_core::Response;
|
use jsonrpc_core::Response;
|
||||||
use jsonrpc_pubsub::{PubSubHandler, Session};
|
use jsonrpc_pubsub::{PubSubHandler, Session};
|
||||||
|
use solana_runtime::bank::{self, Bank};
|
||||||
use solana_sdk::budget_program;
|
use solana_sdk::budget_program;
|
||||||
use solana_sdk::budget_transaction::BudgetTransaction;
|
use solana_sdk::budget_transaction::BudgetTransaction;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
use solana_sdk::transaction::Transaction;
|
use solana_sdk::transaction::Transaction;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
//! The `rpc_service` module implements the Solana JSON RPC service.
|
//! The `rpc_service` module implements the Solana JSON RPC service.
|
||||||
|
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::cluster_info::ClusterInfo;
|
use crate::cluster_info::ClusterInfo;
|
||||||
use crate::rpc::*;
|
use crate::rpc::*;
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use crate::storage_stage::StorageState;
|
use crate::storage_stage::StorageState;
|
||||||
use jsonrpc_core::MetaIoHandler;
|
use jsonrpc_core::MetaIoHandler;
|
||||||
use jsonrpc_http_server::{hyper, AccessControlAllowOrigin, DomainsValidation, ServerBuilder};
|
use jsonrpc_http_server::{hyper, AccessControlAllowOrigin, DomainsValidation, ServerBuilder};
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
@ -101,9 +101,8 @@ impl Service for JsonRpcService {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::cluster_info::NodeInfo;
|
use crate::cluster_info::NodeInfo;
|
||||||
use crate::genesis_block::GenesisBlock;
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::signature::KeypairUtil;
|
use solana_sdk::signature::KeypairUtil;
|
||||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
//! The `pubsub` module implements a threaded subscription service on client RPC request
|
//! The `pubsub` module implements a threaded subscription service on client RPC request
|
||||||
|
|
||||||
use crate::bank::{self, Bank, BankError};
|
|
||||||
use crate::rpc_status::RpcSignatureStatus;
|
use crate::rpc_status::RpcSignatureStatus;
|
||||||
use jsonrpc_core::futures::Future;
|
use jsonrpc_core::futures::Future;
|
||||||
use jsonrpc_pubsub::typed::Sink;
|
use jsonrpc_pubsub::typed::Sink;
|
||||||
use jsonrpc_pubsub::SubscriptionId;
|
use jsonrpc_pubsub::SubscriptionId;
|
||||||
|
use solana_runtime::bank::{self, Bank, BankError};
|
||||||
use solana_sdk::account::Account;
|
use solana_sdk::account::Account;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::Signature;
|
use solana_sdk::signature::Signature;
|
||||||
|
@ -144,9 +144,9 @@ impl RpcSubscriptions {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use jsonrpc_pubsub::typed::Subscriber;
|
use jsonrpc_pubsub::typed::Subscriber;
|
||||||
use solana_sdk::budget_program;
|
use solana_sdk::budget_program;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
use tokio::prelude::{Async, Stream};
|
use tokio::prelude::{Async, Stream};
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
//! offloaded to the GPU.
|
//! offloaded to the GPU.
|
||||||
//!
|
//!
|
||||||
|
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::packet::{Packet, SharedPackets};
|
use crate::packet::{Packet, SharedPackets};
|
||||||
use crate::result::Result;
|
use crate::result::Result;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::shortvec::decode_len;
|
use solana_sdk::shortvec::decode_len;
|
||||||
use solana_sdk::signature::Signature;
|
use solana_sdk::signature::Signature;
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
//! transaction. All processing is done on the CPU by default and on a GPU
|
//! transaction. All processing is done on the CPU by default and on a GPU
|
||||||
//! if the `cuda` feature is enabled with `--features=cuda`.
|
//! if the `cuda` feature is enabled with `--features=cuda`.
|
||||||
|
|
||||||
use crate::counter::Counter;
|
|
||||||
|
|
||||||
use crate::packet::SharedPackets;
|
use crate::packet::SharedPackets;
|
||||||
use crate::result::{Error, Result};
|
use crate::result::{Error, Result};
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
|
@ -14,6 +12,7 @@ use crate::sigverify;
|
||||||
use crate::streamer::{self, PacketReceiver};
|
use crate::streamer::{self, PacketReceiver};
|
||||||
use log::Level;
|
use log::Level;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use solana_metrics::{influxdb, submit};
|
use solana_metrics::{influxdb, submit};
|
||||||
use solana_sdk::timing;
|
use solana_sdk::timing;
|
||||||
use std::sync::mpsc::{channel, Receiver, RecvTimeoutError, Sender};
|
use std::sync::mpsc::{channel, Receiver, RecvTimeoutError, Sender};
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
//! The `tpu` module implements the Transaction Processing Unit, a
|
//! The `tpu` module implements the Transaction Processing Unit, a
|
||||||
//! multi-stage transaction processing pipeline in software.
|
//! multi-stage transaction processing pipeline in software.
|
||||||
|
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::banking_stage::{BankingStage, UnprocessedPackets};
|
use crate::banking_stage::{BankingStage, UnprocessedPackets};
|
||||||
use crate::blocktree::Blocktree;
|
use crate::blocktree::Blocktree;
|
||||||
use crate::broadcast_service::BroadcastService;
|
use crate::broadcast_service::BroadcastService;
|
||||||
|
@ -13,6 +12,7 @@ use crate::poh_service::PohServiceConfig;
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use crate::sigverify_stage::SigVerifyStage;
|
use crate::sigverify_stage::SigVerifyStage;
|
||||||
use crate::tpu_forwarder::TpuForwarder;
|
use crate::tpu_forwarder::TpuForwarder;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use std::net::UdpSocket;
|
use std::net::UdpSocket;
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
use crate::banking_stage::UnprocessedPackets;
|
use crate::banking_stage::UnprocessedPackets;
|
||||||
use crate::cluster_info::ClusterInfo;
|
use crate::cluster_info::ClusterInfo;
|
||||||
use crate::contact_info::ContactInfo;
|
use crate::contact_info::ContactInfo;
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use crate::streamer::{self, PacketReceiver};
|
use crate::streamer::{self, PacketReceiver};
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use std::net::{SocketAddr, UdpSocket};
|
use std::net::{SocketAddr, UdpSocket};
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
//! 4. StorageStage
|
//! 4. StorageStage
|
||||||
//! - Generating the keys used to encrypt the ledger and sample it for storage mining.
|
//! - Generating the keys used to encrypt the ledger and sample it for storage mining.
|
||||||
|
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::blob_fetch_stage::BlobFetchStage;
|
use crate::blob_fetch_stage::BlobFetchStage;
|
||||||
use crate::blocktree::Blocktree;
|
use crate::blocktree::Blocktree;
|
||||||
use crate::cluster_info::ClusterInfo;
|
use crate::cluster_info::ClusterInfo;
|
||||||
|
@ -25,6 +24,7 @@ use crate::service::Service;
|
||||||
use crate::storage_stage::{StorageStage, StorageState};
|
use crate::storage_stage::{StorageStage, StorageState};
|
||||||
use crate::tpu::{TpuReturnType, TpuRotationReceiver, TpuRotationSender};
|
use crate::tpu::{TpuReturnType, TpuRotationReceiver, TpuRotationSender};
|
||||||
use crate::voting_keypair::VotingKeypair;
|
use crate::voting_keypair::VotingKeypair;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use std::net::UdpSocket;
|
use std::net::UdpSocket;
|
||||||
|
@ -209,12 +209,11 @@ impl Service for Tvu {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod tests {
|
pub mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::bank::Bank;
|
|
||||||
use crate::blocktree::get_tmp_ledger_path;
|
use crate::blocktree::get_tmp_ledger_path;
|
||||||
use crate::cluster_info::{ClusterInfo, Node};
|
use crate::cluster_info::{ClusterInfo, Node};
|
||||||
use crate::genesis_block::GenesisBlock;
|
|
||||||
use crate::leader_scheduler::LeaderSchedulerConfig;
|
use crate::leader_scheduler::LeaderSchedulerConfig;
|
||||||
use crate::storage_stage::STORAGE_ROTATE_TEST_COUNT;
|
use crate::storage_stage::STORAGE_ROTATE_TEST_COUNT;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_tvu_exit() {
|
fn test_tvu_exit() {
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
//!
|
//!
|
||||||
use crate::blocktree::Blocktree;
|
use crate::blocktree::Blocktree;
|
||||||
use crate::cluster_info::ClusterInfo;
|
use crate::cluster_info::ClusterInfo;
|
||||||
use crate::counter::Counter;
|
|
||||||
use crate::db_window::*;
|
use crate::db_window::*;
|
||||||
use crate::leader_scheduler::LeaderScheduler;
|
use crate::leader_scheduler::LeaderScheduler;
|
||||||
use crate::repair_service::RepairService;
|
use crate::repair_service::RepairService;
|
||||||
|
@ -10,6 +9,7 @@ use crate::result::{Error, Result};
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use crate::streamer::{BlobReceiver, BlobSender};
|
use crate::streamer::{BlobReceiver, BlobSender};
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use solana_metrics::counter::Counter;
|
||||||
use solana_metrics::{influxdb, submit};
|
use solana_metrics::{influxdb, submit};
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::timing::duration_as_ms;
|
use solana_sdk::timing::duration_as_ms;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use rayon::iter::{IntoParallelIterator, ParallelIterator};
|
use rayon::iter::{IntoParallelIterator, ParallelIterator};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use solana::bank::Bank;
|
|
||||||
use solana::cluster_info::{
|
use solana::cluster_info::{
|
||||||
compute_retransmit_peers, ClusterInfo, DATA_PLANE_FANOUT, GROW_LAYER_CAPACITY,
|
compute_retransmit_peers, ClusterInfo, DATA_PLANE_FANOUT, GROW_LAYER_CAPACITY,
|
||||||
NEIGHBORHOOD_SIZE,
|
NEIGHBORHOOD_SIZE,
|
||||||
};
|
};
|
||||||
use solana::contact_info::ContactInfo;
|
use solana::contact_info::ContactInfo;
|
||||||
use solana::genesis_block::GenesisBlock;
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
use log::trace;
|
use log::trace;
|
||||||
use solana::bank::Bank;
|
|
||||||
use solana::blocktree::Blocktree;
|
use solana::blocktree::Blocktree;
|
||||||
use solana::blocktree::{get_tmp_ledger_path, BlocktreeConfig};
|
use solana::blocktree::{get_tmp_ledger_path, BlocktreeConfig};
|
||||||
use solana::cluster_info::{ClusterInfo, Node};
|
use solana::cluster_info::{ClusterInfo, Node};
|
||||||
use solana::entry::next_entry_mut;
|
use solana::entry::next_entry_mut;
|
||||||
use solana::entry::EntrySlice;
|
use solana::entry::EntrySlice;
|
||||||
use solana::genesis_block::GenesisBlock;
|
|
||||||
use solana::gossip_service::GossipService;
|
use solana::gossip_service::GossipService;
|
||||||
use solana::leader_scheduler::LeaderScheduler;
|
use solana::leader_scheduler::LeaderScheduler;
|
||||||
use solana::leader_scheduler::LeaderSchedulerConfig;
|
use solana::leader_scheduler::LeaderSchedulerConfig;
|
||||||
|
@ -17,6 +15,8 @@ use solana::storage_stage::STORAGE_ROTATE_TEST_COUNT;
|
||||||
use solana::streamer;
|
use solana::streamer;
|
||||||
use solana::tvu::{Sockets, Tvu};
|
use solana::tvu::{Sockets, Tvu};
|
||||||
use solana::voting_keypair::VotingKeypair;
|
use solana::voting_keypair::VotingKeypair;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
|
|
Loading…
Reference in New Issue