More TestValidator cleanup
This commit is contained in:
committed by
mergify[bot]
parent
b5f7e39be8
commit
43b82b31e5
@ -1,8 +1,6 @@
|
||||
use {
|
||||
crate::{
|
||||
cluster_info::Node,
|
||||
contact_info::ContactInfo,
|
||||
gossip_service::discover_cluster,
|
||||
validator::{Validator, ValidatorConfig},
|
||||
},
|
||||
solana_ledger::create_new_tmp_ledger,
|
||||
@ -11,83 +9,111 @@ use {
|
||||
hash::Hash,
|
||||
native_token::sol_to_lamports,
|
||||
pubkey::Pubkey,
|
||||
rent::Rent,
|
||||
signature::{Keypair, Signer},
|
||||
},
|
||||
std::{path::PathBuf, sync::Arc},
|
||||
std::{fs::remove_dir_all, net::SocketAddr, path::PathBuf, sync::Arc},
|
||||
};
|
||||
|
||||
pub struct TestValidator {
|
||||
pub server: Validator,
|
||||
pub leader_data: ContactInfo,
|
||||
pub alice: Keypair,
|
||||
pub ledger_path: PathBuf,
|
||||
pub genesis_hash: Hash,
|
||||
pub vote_pubkey: Pubkey,
|
||||
}
|
||||
|
||||
struct TestValidatorConfig {
|
||||
fee_rate_governor: FeeRateGovernor,
|
||||
validator_identity_lamports: u64,
|
||||
validator_stake_lamports: u64,
|
||||
mint_lamports: u64,
|
||||
pub struct TestValidatorConfig {
|
||||
pub fee_rate_governor: FeeRateGovernor,
|
||||
pub mint_lamports: u64,
|
||||
pub rent: Rent,
|
||||
pub validator_identity_keypair: Keypair,
|
||||
pub validator_identity_lamports: u64,
|
||||
pub validator_stake_lamports: u64,
|
||||
}
|
||||
|
||||
impl Default for TestValidatorConfig {
|
||||
fn default() -> Self {
|
||||
TestValidatorConfig {
|
||||
fee_rate_governor: FeeRateGovernor::new(0, 0),
|
||||
Self {
|
||||
fee_rate_governor: FeeRateGovernor::default(),
|
||||
mint_lamports: sol_to_lamports(500_000_000.),
|
||||
rent: Rent::default(),
|
||||
validator_identity_keypair: Keypair::new(),
|
||||
validator_identity_lamports: sol_to_lamports(500.),
|
||||
validator_stake_lamports: sol_to_lamports(1.),
|
||||
mint_lamports: sol_to_lamports(500_000_000.),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct TestValidator {
|
||||
validator: Validator,
|
||||
ledger_path: PathBuf,
|
||||
preserve_ledger: bool,
|
||||
|
||||
genesis_hash: Hash,
|
||||
mint_keypair: Keypair,
|
||||
vote_account_address: Pubkey,
|
||||
|
||||
tpu: SocketAddr,
|
||||
rpc_url: String,
|
||||
rpc_pubsub_url: String,
|
||||
}
|
||||
|
||||
impl Default for TestValidator {
|
||||
fn default() -> Self {
|
||||
Self::new(TestValidatorConfig::default())
|
||||
}
|
||||
}
|
||||
|
||||
impl TestValidator {
|
||||
pub fn with_no_fee() -> Self {
|
||||
pub fn with_no_fees() -> Self {
|
||||
Self::new(TestValidatorConfig {
|
||||
fee_rate_governor: FeeRateGovernor::new(0, 0),
|
||||
rent: Rent {
|
||||
lamports_per_byte_year: 1,
|
||||
exemption_threshold: 1.0,
|
||||
..Rent::default()
|
||||
},
|
||||
..TestValidatorConfig::default()
|
||||
})
|
||||
}
|
||||
|
||||
pub fn with_custom_fee(target_lamports_per_signature: u64) -> Self {
|
||||
pub fn with_custom_fees(target_lamports_per_signature: u64) -> Self {
|
||||
Self::new(TestValidatorConfig {
|
||||
fee_rate_governor: FeeRateGovernor::new(target_lamports_per_signature, 0),
|
||||
rent: Rent {
|
||||
lamports_per_byte_year: 1,
|
||||
exemption_threshold: 1.0,
|
||||
..Rent::default()
|
||||
},
|
||||
..TestValidatorConfig::default()
|
||||
})
|
||||
}
|
||||
|
||||
fn new(config: TestValidatorConfig) -> Self {
|
||||
pub fn new(config: TestValidatorConfig) -> Self {
|
||||
use solana_ledger::genesis_utils::{
|
||||
create_genesis_config_with_leader_ex, GenesisConfigInfo,
|
||||
};
|
||||
|
||||
let TestValidatorConfig {
|
||||
fee_rate_governor,
|
||||
mint_lamports,
|
||||
rent,
|
||||
validator_identity_keypair,
|
||||
validator_identity_lamports,
|
||||
validator_stake_lamports,
|
||||
mint_lamports,
|
||||
} = config;
|
||||
let node_keypair = Arc::new(Keypair::new());
|
||||
let node = Node::new_localhost_with_pubkey(&node_keypair.pubkey());
|
||||
let contact_info = node.info.clone();
|
||||
let validator_identity_keypair = Arc::new(validator_identity_keypair);
|
||||
|
||||
let node = Node::new_localhost_with_pubkey(&validator_identity_keypair.pubkey());
|
||||
|
||||
let GenesisConfigInfo {
|
||||
mut genesis_config,
|
||||
mint_keypair,
|
||||
voting_keypair,
|
||||
voting_keypair: vote_account_keypair,
|
||||
} = create_genesis_config_with_leader_ex(
|
||||
mint_lamports,
|
||||
&contact_info.id,
|
||||
&node.info.id,
|
||||
&Keypair::new(),
|
||||
&solana_sdk::pubkey::new_rand(),
|
||||
&Keypair::new().pubkey(),
|
||||
validator_stake_lamports,
|
||||
validator_identity_lamports,
|
||||
solana_sdk::genesis_config::ClusterType::Development,
|
||||
);
|
||||
genesis_config.rent.lamports_per_byte_year = 1;
|
||||
genesis_config.rent.exemption_threshold = 1.0;
|
||||
|
||||
genesis_config.rent = rent;
|
||||
genesis_config.fee_rate_governor = fee_rate_governor;
|
||||
|
||||
let (ledger_path, blockhash) = create_new_tmp_ledger!(&genesis_config);
|
||||
@ -96,24 +122,63 @@ impl TestValidator {
|
||||
rpc_addrs: Some((node.info.rpc, node.info.rpc_pubsub, node.info.rpc_banks)),
|
||||
..ValidatorConfig::default()
|
||||
};
|
||||
let vote_pubkey = voting_keypair.pubkey();
|
||||
let node = Validator::new(
|
||||
|
||||
let vote_account_address = vote_account_keypair.pubkey();
|
||||
let rpc_url = format!("http://{}:{}", node.info.rpc.ip(), node.info.rpc.port());
|
||||
let rpc_pubsub_url = format!("ws://{}/", node.info.rpc_pubsub);
|
||||
let tpu = node.info.tpu;
|
||||
|
||||
let validator = Validator::new(
|
||||
node,
|
||||
&node_keypair,
|
||||
&validator_identity_keypair,
|
||||
&ledger_path,
|
||||
&voting_keypair.pubkey(),
|
||||
vec![Arc::new(voting_keypair)],
|
||||
&vote_account_keypair.pubkey(),
|
||||
vec![Arc::new(vote_account_keypair)],
|
||||
None,
|
||||
&config,
|
||||
);
|
||||
discover_cluster(&contact_info.gossip, 1).expect("Node startup failed");
|
||||
|
||||
TestValidator {
|
||||
server: node,
|
||||
leader_data: contact_info,
|
||||
alice: mint_keypair,
|
||||
validator,
|
||||
vote_account_address,
|
||||
mint_keypair,
|
||||
ledger_path,
|
||||
genesis_hash: blockhash,
|
||||
vote_pubkey,
|
||||
tpu,
|
||||
rpc_url,
|
||||
rpc_pubsub_url,
|
||||
preserve_ledger: false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn close(self) {
|
||||
self.validator.close().unwrap();
|
||||
if !self.preserve_ledger {
|
||||
remove_dir_all(&self.ledger_path).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn tpu(&self) -> &SocketAddr {
|
||||
&self.tpu
|
||||
}
|
||||
|
||||
pub fn mint_keypair(&self) -> Keypair {
|
||||
Keypair::from_bytes(&self.mint_keypair.to_bytes()).unwrap()
|
||||
}
|
||||
|
||||
pub fn rpc_url(&self) -> String {
|
||||
self.rpc_url.clone()
|
||||
}
|
||||
|
||||
pub fn rpc_pubsub_url(&self) -> String {
|
||||
self.rpc_pubsub_url.clone()
|
||||
}
|
||||
|
||||
pub fn genesis_hash(&self) -> Hash {
|
||||
self.genesis_hash
|
||||
}
|
||||
|
||||
pub fn vote_account_address(&self) -> Pubkey {
|
||||
self.vote_account_address
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user