diff --git a/Cargo.lock b/Cargo.lock index 08e8c1a820..d7fd8599b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2014,6 +2014,7 @@ dependencies = [ "solana-metrics 0.12.0", "solana-netutil 0.12.0", "solana-sdk 0.12.0", + "solana-vote-signer 0.12.0", ] [[package]] diff --git a/fullnode/Cargo.toml b/fullnode/Cargo.toml index 8209b87086..abc2431ecb 100644 --- a/fullnode/Cargo.toml +++ b/fullnode/Cargo.toml @@ -19,6 +19,7 @@ solana-logger = { path = "../logger", version = "0.12.0" } solana-netutil = { path = "../netutil", version = "0.12.0" } solana-metrics = { path = "../metrics", version = "0.12.0" } solana-sdk = { path = "../sdk", version = "0.12.0" } +solana-vote-signer = { path = "../vote-signer", version = "0.12.0" } [features] chacha = ["solana/chacha"] diff --git a/fullnode/src/main.rs b/fullnode/src/main.rs index 8f729bf688..2a072850f2 100644 --- a/fullnode/src/main.rs +++ b/fullnode/src/main.rs @@ -12,6 +12,7 @@ use solana_sdk::pubkey::Pubkey; use solana_sdk::signature::{Keypair, KeypairUtil}; use solana_sdk::vote_program::VoteProgram; use solana_sdk::vote_transaction::VoteTransaction; +use solana_vote_signer::rpc::{LocalVoteSigner, VoteSigner}; use std::fs::File; use std::io::{Error, ErrorKind, Result}; use std::net::{Ipv4Addr, SocketAddr}; @@ -207,6 +208,7 @@ fn main() { let mut fullnode_config = FullnodeConfig::default(); fullnode_config.sigverify_disabled = matches.is_present("no_sigverify"); let no_signer = matches.is_present("no_signer"); + fullnode_config.voting_disabled = no_signer; let use_only_bootstrap_leader = matches.is_present("no_leader_rotation"); let (keypair, gossip) = parse_identity(&matches); let ledger_path = matches.value_of("ledger").unwrap(); @@ -249,18 +251,15 @@ fn main() { let mut leader_scheduler = LeaderScheduler::default(); leader_scheduler.use_only_bootstrap_leader = use_only_bootstrap_leader; - let vote_signer_option = if !no_signer { - let vote_signer = VoteSignerProxy::new_with_signer( - &keypair, - Box::new(RemoteVoteSigner::new(signer_addr)), - ); + let vote_signer: Box = if !no_signer { info!("Signer service address: {:?}", signer_addr); - info!("New vote account ID is {:?}", vote_signer.pubkey()); - Some(Arc::new(vote_signer)) + Box::new(RemoteVoteSigner::new(signer_addr)) } else { - None + Box::new(LocalVoteSigner::default()) }; - let vote_account_option = vote_signer_option.as_ref().map(|x| x.pubkey()); + let vote_signer = VoteSignerProxy::new_with_signer(&keypair, vote_signer); + let vote_account_id = vote_signer.pubkey(); + info!("New vote account ID is {:?}", vote_account_id); let gossip_addr = node.info.gossip; let mut fullnode = Fullnode::new( @@ -268,14 +267,14 @@ fn main() { keypair.clone(), ledger_path, Arc::new(RwLock::new(leader_scheduler)), - vote_signer_option, + vote_signer, cluster_entrypoint .map(|i| NodeInfo::new_entry_point(&i)) .as_ref(), fullnode_config, ); - if let Some(vote_account) = vote_account_option { + if !no_signer { let leader_node_info = loop { info!("Looking for leader..."); match poll_gossip_for_leader(gossip_addr, Some(10)) { @@ -290,7 +289,7 @@ fn main() { }; let mut client = mk_client(&leader_node_info); - if let Err(err) = create_and_fund_vote_account(&mut client, vote_account, &keypair) { + if let Err(err) = create_and_fund_vote_account(&mut client, vote_account_id, &keypair) { panic!("Failed to create_and_fund_vote_account: {:?}", err); } } diff --git a/src/fullnode.rs b/src/fullnode.rs index a52d1d684b..e678628ca3 100644 --- a/src/fullnode.rs +++ b/src/fullnode.rs @@ -67,6 +67,7 @@ pub enum FullnodeReturnType { pub struct FullnodeConfig { pub sigverify_disabled: bool, + pub voting_disabled: bool, pub entry_stream: Option, pub storage_rotate_count: u64, } @@ -78,6 +79,7 @@ impl Default for FullnodeConfig { const NUM_HASHES_FOR_STORAGE_ROTATE: u64 = 1024; Self { sigverify_disabled: false, + voting_disabled: false, entry_stream: None, storage_rotate_count: NUM_HASHES_FOR_STORAGE_ROTATE, } @@ -105,7 +107,7 @@ impl Fullnode { keypair: Arc, ledger_path: &str, leader_scheduler: Arc>, - vote_signer: Option>, + vote_signer: VoteSignerProxy, entrypoint_info_option: Option<&NodeInfo>, config: FullnodeConfig, ) -> Self { @@ -205,12 +207,18 @@ impl Fullnode { .collect(), }; + let vote_signer_option = if config.voting_disabled { + None + } else { + Some(Arc::new(vote_signer)) + }; + // Setup channels for rotation indications let (to_leader_sender, to_leader_receiver) = channel(); let (to_validator_sender, to_validator_receiver) = channel(); let tvu = Tvu::new( - vote_signer, + vote_signer_option, &bank, entry_height, last_entry_id, @@ -251,7 +259,7 @@ impl Fullnode { inc_new_counter_info!("fullnode-new", 1); - Fullnode { + Self { keypair, cluster_info, bank, @@ -473,7 +481,7 @@ mod tests { Arc::new(validator_keypair), &validator_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&Default::default()))), - None, + VoteSignerProxy::new(), Some(&leader_node.info), Default::default(), ); @@ -505,7 +513,7 @@ mod tests { Arc::new(validator_keypair), &validator_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&Default::default()))), - None, + VoteSignerProxy::new(), Some(&leader_node.info), Default::default(), ) @@ -569,7 +577,7 @@ mod tests { bootstrap_leader_keypair, &bootstrap_leader_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - Some(Arc::new(signer)), + signer, Some(&bootstrap_leader_info), Default::default(), ); @@ -654,7 +662,7 @@ mod tests { bootstrap_leader_keypair, &bootstrap_leader_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - None, + VoteSignerProxy::new(), Some(&bootstrap_leader_info), Default::default(), ); @@ -667,7 +675,7 @@ mod tests { validator_keypair, &validator_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - None, + VoteSignerProxy::new(), Some(&bootstrap_leader_info), Default::default(), ); @@ -751,7 +759,7 @@ mod tests { validator_keypair, &validator_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - Some(Arc::new(vote_signer)), + vote_signer, Some(&leader_node.info), Default::default(), ); diff --git a/src/thin_client.rs b/src/thin_client.rs index 05f4837120..25d3050861 100644 --- a/src/thin_client.rs +++ b/src/thin_client.rs @@ -458,7 +458,7 @@ pub fn new_fullnode(ledger_name: &'static str) -> (Fullnode, NodeInfo, Keypair, node_keypair, &ledger_path, Arc::new(RwLock::new(leader_scheduler)), - Some(Arc::new(vote_signer)), + vote_signer, None, Default::default(), ); diff --git a/tests/multinode.rs b/tests/multinode.rs index a90817fd7c..36bcc0e388 100644 --- a/tests/multinode.rs +++ b/tests/multinode.rs @@ -161,7 +161,7 @@ fn test_multi_node_ledger_window() -> result::Result<()> { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, None, Default::default(), ); @@ -180,7 +180,7 @@ fn test_multi_node_ledger_window() -> result::Result<()> { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_data), Default::default(), ); @@ -264,7 +264,7 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, None, Default::default(), ); @@ -297,7 +297,7 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_data), Default::default(), ); @@ -359,7 +359,7 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_data), Default::default(), ); @@ -448,7 +448,7 @@ fn test_multi_node_basic() { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, None, Default::default(), ); @@ -477,7 +477,7 @@ fn test_multi_node_basic() { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_data), Default::default(), ); @@ -556,7 +556,7 @@ fn test_boot_validator_from_file() -> result::Result<()> { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, None, Default::default(), ); @@ -580,7 +580,7 @@ fn test_boot_validator_from_file() -> result::Result<()> { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_data), Default::default(), ); @@ -601,7 +601,7 @@ fn test_boot_validator_from_file() -> result::Result<()> { fn create_leader( ledger_path: &str, leader_keypair: Arc, - signer: Arc, + signer: VoteSignerProxy, ) -> (NodeInfo, Fullnode) { let leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey()); let leader_data = leader.info.clone(); @@ -612,7 +612,7 @@ fn create_leader( Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_data.id, ))), - Some(signer), + signer, None, Default::default(), ); @@ -637,11 +637,10 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> { ); let bob_pubkey = Keypair::new().pubkey(); - let signer_proxy = Arc::new(VoteSignerProxy::new_local(&leader_keypair)); - { + let signer_proxy = VoteSignerProxy::new_local(&leader_keypair); let (leader_data, leader_fullnode) = - create_leader(&ledger_path, leader_keypair.clone(), signer_proxy.clone()); + create_leader(&ledger_path, leader_keypair.clone(), signer_proxy); // lengthen the ledger let leader_balance = @@ -660,8 +659,9 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> { ); { + let signer_proxy = VoteSignerProxy::new_local(&leader_keypair); let (leader_data, leader_fullnode) = - create_leader(&ledger_path, leader_keypair.clone(), signer_proxy.clone()); + create_leader(&ledger_path, leader_keypair.clone(), signer_proxy); // lengthen the ledger let leader_balance = @@ -673,8 +673,8 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> { leader_fullnode.close()?; } - let (leader_data, leader_fullnode) = - create_leader(&ledger_path, leader_keypair, signer_proxy.clone()); + let signer_proxy = VoteSignerProxy::new_local(&leader_keypair); + let (leader_data, leader_fullnode) = create_leader(&ledger_path, leader_keypair, signer_proxy); // start validator from old ledger let keypair = Arc::new(Keypair::new()); @@ -689,7 +689,7 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_data.id, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_data), Default::default(), ); @@ -762,7 +762,7 @@ fn test_multi_node_dynamic_network() { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, None, Default::default(), ); @@ -836,7 +836,7 @@ fn test_multi_node_dynamic_network() { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_pubkey, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_data), Default::default(), ); @@ -1011,7 +1011,7 @@ fn test_leader_to_validator_transition() { leader_keypair, &leader_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_info), Default::default(), ); @@ -1160,7 +1160,7 @@ fn test_leader_validator_basic() { validator_keypair, &validator_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_info), Default::default(), ); @@ -1172,7 +1172,7 @@ fn test_leader_validator_basic() { leader_keypair, &leader_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_info), Default::default(), ); @@ -1359,7 +1359,7 @@ fn test_dropped_handoff_recovery() { bootstrap_leader_keypair, &bootstrap_leader_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&bootstrap_leader_info), Default::default(), ); @@ -1381,7 +1381,7 @@ fn test_dropped_handoff_recovery() { keypair, &validator_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&bootstrap_leader_info), Default::default(), ); @@ -1407,7 +1407,7 @@ fn test_dropped_handoff_recovery() { next_leader_keypair, &next_leader_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&bootstrap_leader_info), Default::default(), ); @@ -1545,7 +1545,7 @@ fn test_full_leader_validator_network() { kp.clone(), &validator_ledger_path, leader_scheduler.clone(), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&bootstrap_leader_info), Default::default(), ); @@ -1562,7 +1562,7 @@ fn test_full_leader_validator_network() { leader_keypair.clone(), &bootstrap_leader_ledger_path, leader_scheduler.clone(), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&bootstrap_leader_info), Default::default(), ); @@ -1734,7 +1734,7 @@ fn test_broadcast_last_tick() { bootstrap_leader_keypair, &bootstrap_leader_ledger_path, Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&bootstrap_leader_info), Default::default(), ); diff --git a/tests/replicator.rs b/tests/replicator.rs index dbba827bd9..f9c0dd0925 100644 --- a/tests/replicator.rs +++ b/tests/replicator.rs @@ -58,7 +58,7 @@ fn test_replicator_startup() { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_info.id.clone(), ))), - Some(Arc::new(signer_proxy)), + signer_proxy, None, fullnode_config, ); @@ -88,7 +88,7 @@ fn test_replicator_startup() { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_info.id, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_info), fullnode_config, ); @@ -283,7 +283,7 @@ fn test_replicator_startup_ledger_hang() { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_info.id.clone(), ))), - Some(Arc::new(signer_proxy)), + signer_proxy, None, Default::default(), ); @@ -299,7 +299,7 @@ fn test_replicator_startup_ledger_hang() { Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader( leader_info.id, ))), - Some(Arc::new(signer_proxy)), + signer_proxy, Some(&leader_info), Default::default(), );