2016-11-03 09:19:35 -07:00
|
|
|
use std::net::SocketAddr;
|
|
|
|
use sync::create_sync_connection_factory;
|
2016-11-16 15:17:52 -08:00
|
|
|
use message::{Services, Magic};
|
2016-11-04 04:08:58 -07:00
|
|
|
use util::{open_db, init_db, node_table_path};
|
2016-11-03 09:19:35 -07:00
|
|
|
use {config, p2p};
|
|
|
|
|
|
|
|
pub fn start(cfg: config::Config) -> Result<(), String> {
|
|
|
|
let mut el = p2p::event_loop();
|
|
|
|
|
2016-11-07 01:15:15 -08:00
|
|
|
let db = open_db(&cfg);
|
2016-11-07 02:20:27 -08:00
|
|
|
try!(init_db(&cfg, &db));
|
2016-11-07 01:15:15 -08:00
|
|
|
|
2016-11-16 15:17:52 -08:00
|
|
|
let p2p_threads = match cfg.magic {
|
|
|
|
Magic::Regtest => 1,
|
|
|
|
Magic::Testnet | Magic::Mainnet => 4,
|
|
|
|
};
|
|
|
|
|
2016-11-03 09:19:35 -07:00
|
|
|
let p2p_cfg = p2p::Config {
|
2016-11-16 15:17:52 -08:00
|
|
|
threads: p2p_threads,
|
2016-11-03 09:19:35 -07:00
|
|
|
protocol_minimum: 70001,
|
|
|
|
protocol_maximum: 70017,
|
|
|
|
inbound_connections: 10,
|
|
|
|
outbound_connections: 10,
|
|
|
|
connection: p2p::NetConfig {
|
|
|
|
magic: cfg.magic,
|
|
|
|
local_address: SocketAddr::new("127.0.0.1".parse().unwrap(), cfg.port),
|
2016-11-05 07:32:57 -07:00
|
|
|
services: Services::default().with_network(true),
|
2016-11-03 09:19:35 -07:00
|
|
|
user_agent: "pbtc".into(),
|
|
|
|
start_height: 0,
|
|
|
|
relay: false,
|
|
|
|
},
|
|
|
|
peers: cfg.connect.map_or_else(|| vec![], |x| vec![x]),
|
|
|
|
seeds: cfg.seednode.map_or_else(|| vec![], |x| vec![x]),
|
2016-11-04 04:08:58 -07:00
|
|
|
node_table_path: node_table_path(),
|
2016-11-03 09:19:35 -07:00
|
|
|
};
|
|
|
|
|
2016-11-04 02:36:58 -07:00
|
|
|
let sync_handle = el.handle();
|
2016-11-15 03:00:46 -08:00
|
|
|
let sync_connection_factory = create_sync_connection_factory(&sync_handle, cfg.magic.consensus_params(), db);
|
2016-11-03 09:19:35 -07:00
|
|
|
|
2016-11-04 04:08:58 -07:00
|
|
|
let p2p = try!(p2p::P2P::new(p2p_cfg, sync_connection_factory, el.handle()).map_err(|x| x.to_string()));
|
2016-11-03 09:19:35 -07:00
|
|
|
try!(p2p.run().map_err(|_| "Failed to start p2p module"));
|
|
|
|
el.run(p2p::forever()).unwrap();
|
|
|
|
Ok(())
|
|
|
|
}
|