From 4fdd9fbfca00af50a355454f5d3a2718ec247b7a Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Fri, 17 Aug 2018 15:42:23 -0600 Subject: [PATCH] Wallet: use gossip to identify leader's port config --- src/bin/wallet.rs | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/bin/wallet.rs b/src/bin/wallet.rs index d78c23389b..2e5552574e 100644 --- a/src/bin/wallet.rs +++ b/src/bin/wallet.rs @@ -9,10 +9,12 @@ extern crate solana; use clap::{App, Arg, SubCommand}; use solana::client::mk_client; -use solana::crdt::NodeInfo; +use solana::crdt::{Crdt, NodeInfo, TestNode}; use solana::drone::DRONE_PORT; use solana::fullnode::Config; use solana::logger; +use solana::ncp::Ncp; +use solana::service::Service; use solana::signature::{read_keypair, Keypair, KeypairUtil, Pubkey, Signature}; use solana::thin_client::ThinClient; use solana::wallet::request_airdrop; @@ -20,8 +22,10 @@ use std::error; use std::fmt; use std::fs::File; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, RwLock}; use std::thread::sleep; -use std::time::Duration; +use std::time::{Duration, Instant}; enum WalletCommand { Address, @@ -35,6 +39,7 @@ enum WalletCommand { enum WalletError { CommandNotRecognized(String), BadParameter(String), + NoNode(String), } impl fmt::Display for WalletError { @@ -163,6 +168,35 @@ fn parse_args() -> Result> { ))) })?; + // Set up gossip functionality + let exit = Arc::new(AtomicBool::new(false)); + let testnode = TestNode::new_localhost(); + let extra_data = testnode.data.clone(); + let crdt = Arc::new(RwLock::new(Crdt::new(extra_data).expect("Crdt::new"))); + let window = Arc::new(RwLock::new(vec![])); + let ncp = Ncp::new( + &crdt.clone(), + window, + None, + testnode.sockets.gossip, + testnode.sockets.gossip_send, + exit.clone(), + ).unwrap(); + let leader_entry_point = NodeInfo::new_entry_point(leader.contact_info.ncp); + crdt.write().unwrap().insert(&leader_entry_point); + + let now = Instant::now(); + // Block until leader's correct contact info is received + while crdt.read().unwrap().leader_data().is_none() { + if now.elapsed() > Duration::new(10, 0) { + Err(WalletError::NoNode("No leader detected".to_string()))?; + } + } + + exit.store(true, Ordering::Relaxed); + ncp.join().unwrap(); + let leader = crdt.read().unwrap().leader_data().unwrap().clone(); + let mut drone_addr = leader.contact_info.tpu; drone_addr.set_port(DRONE_PORT);