Added a decent logging.
This commit is contained in:
@@ -11,6 +11,8 @@ repository = "https://github.com/Revertron/Alfis"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
getopts = "0.2.21"
|
getopts = "0.2.21"
|
||||||
|
log = "0.4.14"
|
||||||
|
simple_logger = "1.11.0"
|
||||||
rust-crypto = "^0.2"
|
rust-crypto = "^0.2"
|
||||||
num_cpus = "1.13.0"
|
num_cpus = "1.13.0"
|
||||||
byteorder = "1.3.2"
|
byteorder = "1.3.2"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ use sqlite::{Connection, State, Statement};
|
|||||||
|
|
||||||
use crate::{Block, Bytes, Keystore, Transaction};
|
use crate::{Block, Bytes, Keystore, Transaction};
|
||||||
use crate::settings::Settings;
|
use crate::settings::Settings;
|
||||||
|
use log::{trace, debug, info, warn, error};
|
||||||
|
|
||||||
const DB_NAME: &str = "blockchain.db";
|
const DB_NAME: &str = "blockchain.db";
|
||||||
|
|
||||||
@@ -30,18 +31,18 @@ impl Blockchain {
|
|||||||
Ok(mut statement) => {
|
Ok(mut statement) => {
|
||||||
while statement.next().unwrap() == State::Row {
|
while statement.next().unwrap() == State::Row {
|
||||||
match Self::get_block_from_statement(&mut statement) {
|
match Self::get_block_from_statement(&mut statement) {
|
||||||
None => { println!("Something wrong with block in DB!"); }
|
None => { error!("Something wrong with block in DB!"); }
|
||||||
Some(block) => {
|
Some(block) => {
|
||||||
println!("Loaded last block: {:?}", &block);
|
info!("Loaded last block: {:?}", &block);
|
||||||
self.version = block.version;
|
self.version = block.version;
|
||||||
self.last_block = Some(block);
|
self.last_block = Some(block);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
println!("Blockchain version from DB = {}", self.version);
|
debug!("Blockchain version from DB = {}", self.version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
println!("No blockchain database found. Creating new.");
|
info!("No blockchain database found. Creating new.");
|
||||||
self.db.execute("
|
self.db.execute("
|
||||||
CREATE TABLE blocks (
|
CREATE TABLE blocks (
|
||||||
'id' BIGINT,
|
'id' BIGINT,
|
||||||
@@ -64,10 +65,10 @@ impl Blockchain {
|
|||||||
|
|
||||||
pub fn add_block(&mut self, block: Block) -> Result<(), &str> {
|
pub fn add_block(&mut self, block: Block) -> Result<(), &str> {
|
||||||
if !self.check_block(&block, &self.last_block) {
|
if !self.check_block(&block, &self.last_block) {
|
||||||
println!("Bad block found, ignoring:\n{:?}", &block);
|
warn!("Bad block found, ignoring:\n{:?}", &block);
|
||||||
return Err("Bad block found, ignoring");
|
return Err("Bad block found, ignoring");
|
||||||
}
|
}
|
||||||
println!("Adding block:\n{:?}", &block);
|
info!("Adding block:\n{:?}", &block);
|
||||||
self.blocks.push(block.clone());
|
self.blocks.push(block.clone());
|
||||||
self.last_block = Some(block.clone());
|
self.last_block = Some(block.clone());
|
||||||
let transaction = block.transaction.clone();
|
let transaction = block.transaction.clone();
|
||||||
@@ -124,11 +125,11 @@ impl Blockchain {
|
|||||||
while statement.next().unwrap() == State::Row {
|
while statement.next().unwrap() == State::Row {
|
||||||
return match Self::get_block_from_statement(&mut statement) {
|
return match Self::get_block_from_statement(&mut statement) {
|
||||||
None => {
|
None => {
|
||||||
println!("Something wrong with block in DB!");
|
error!("Something wrong with block in DB!");
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
Some(block) => {
|
Some(block) => {
|
||||||
println!("Loaded block: {:?}", &block);
|
debug!("Loaded block: {:?}", &block);
|
||||||
Some(block)
|
Some(block)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,7 +137,7 @@ impl Blockchain {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
println!("Can't find block {}", index);
|
warn!("Can't find requested block {}", index);
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -192,7 +193,7 @@ impl Blockchain {
|
|||||||
let pub_key = Bytes::from_bytes(statement.read::<Vec<u8>>(5).unwrap().as_slice());
|
let pub_key = Bytes::from_bytes(statement.read::<Vec<u8>>(5).unwrap().as_slice());
|
||||||
let signature = Bytes::from_bytes(statement.read::<Vec<u8>>(6).unwrap().as_slice());
|
let signature = Bytes::from_bytes(statement.read::<Vec<u8>>(6).unwrap().as_slice());
|
||||||
let transaction = Transaction { identity, confirmation, method, data, pub_key, signature };
|
let transaction = Transaction { identity, confirmation, method, data, pub_key, signature };
|
||||||
println!("Got transaction: {:?}", &transaction);
|
debug!("Got transaction: {:?}", &transaction);
|
||||||
if transaction.check_for(domain) {
|
if transaction.check_for(domain) {
|
||||||
return Some(transaction.data);
|
return Some(transaction.data);
|
||||||
}
|
}
|
||||||
@@ -227,13 +228,13 @@ impl Blockchain {
|
|||||||
|
|
||||||
fn check_block(&self, block: &Block, prev_block: &Option<Block>) -> bool {
|
fn check_block(&self, block: &Block, prev_block: &Option<Block>) -> bool {
|
||||||
if !check_block_hash(block) {
|
if !check_block_hash(block) {
|
||||||
println!("{:?} has wrong hash! Ignoring!", &block);
|
warn!("{:?} has wrong hash! Ignoring!", &block);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// TODO make transaction not Optional
|
// TODO make transaction not Optional
|
||||||
let transaction = block.transaction.as_ref().unwrap();
|
let transaction = block.transaction.as_ref().unwrap();
|
||||||
if !check_transaction_signature(&transaction) {
|
if !check_transaction_signature(&transaction) {
|
||||||
println!("{:?} has wrong signature! Ignoring block!", &transaction);
|
warn!("{:?} has wrong signature! Ignoring block!", &transaction);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
match prev_block {
|
match prev_block {
|
||||||
@@ -250,7 +251,7 @@ impl Blockchain {
|
|||||||
}
|
}
|
||||||
Some(prev) => {
|
Some(prev) => {
|
||||||
if block.index != prev.index + 1 {
|
if block.index != prev.index + 1 {
|
||||||
println!("Discarding block with index {} as not needed now", block.index);
|
info!("Discarding block with index {} as not needed now", block.index);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
block.prev_block_hash.eq(&prev.hash)
|
block.prev_block_hash.eq(&prev.hash)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ use crate::Context;
|
|||||||
use std::sync::{Mutex, Arc};
|
use std::sync::{Mutex, Arc};
|
||||||
use crate::dns::filter::DnsFilter;
|
use crate::dns::filter::DnsFilter;
|
||||||
use crate::dns::protocol::{DnsPacket, QueryType, DnsRecord, DnsQuestion};
|
use crate::dns::protocol::{DnsPacket, QueryType, DnsRecord, DnsQuestion};
|
||||||
|
use log::{trace, debug, info, warn, error};
|
||||||
|
|
||||||
pub struct BlockchainFilter {
|
pub struct BlockchainFilter {
|
||||||
context: Arc<Mutex<Context>>
|
context: Arc<Mutex<Context>>
|
||||||
@@ -17,8 +18,9 @@ impl DnsFilter for BlockchainFilter {
|
|||||||
fn lookup(&self, qname: &str, qtype: QueryType) -> Option<DnsPacket> {
|
fn lookup(&self, qname: &str, qtype: QueryType) -> Option<DnsPacket> {
|
||||||
let data = self.context.lock().unwrap().blockchain.get_domain_info(qname);
|
let data = self.context.lock().unwrap().blockchain.get_domain_info(qname);
|
||||||
match data {
|
match data {
|
||||||
None => { println!("Not found info for domain {}", &qname); }
|
None => { debug!("Not found data for domain {}", &qname); }
|
||||||
Some(data) => {
|
Some(data) => {
|
||||||
|
info!("Found data for domain {}", &qname);
|
||||||
let records: Vec<DnsRecord> = match serde_json::from_str(&data) {
|
let records: Vec<DnsRecord> = match serde_json::from_str(&data) {
|
||||||
Err(_) => { return None; }
|
Err(_) => { return None; }
|
||||||
Ok(records) => { records }
|
Ok(records) => { records }
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
use crate::{Blockchain, Bus, Keystore};
|
use crate::{Blockchain, Bus, Keystore};
|
||||||
use crate::event::Event;
|
use crate::event::Event;
|
||||||
use crate::settings::Settings;
|
use crate::settings::Settings;
|
||||||
|
use log::{trace, debug, info, warn, error};
|
||||||
|
|
||||||
pub struct Context {
|
pub struct Context {
|
||||||
pub settings: Settings,
|
pub settings: Settings,
|
||||||
@@ -20,7 +21,7 @@ impl Context {
|
|||||||
let filename = &name.into();
|
let filename = &name.into();
|
||||||
match Keystore::from_file(filename, &password.into()) {
|
match Keystore::from_file(filename, &password.into()) {
|
||||||
None => {
|
None => {
|
||||||
println!("Error loading keystore '{}'!", filename);
|
warn!("Error loading keystore '{}'!", filename);
|
||||||
},
|
},
|
||||||
Some(keystore) => {
|
Some(keystore) => {
|
||||||
self.keystore = keystore;
|
self.keystore = keystore;
|
||||||
|
|||||||
+12
-8
@@ -13,6 +13,7 @@ use std::path::Path;
|
|||||||
use serde::{Serialize, Deserialize, Serializer, Deserializer};
|
use serde::{Serialize, Deserialize, Serializer, Deserializer};
|
||||||
// For deserialization
|
// For deserialization
|
||||||
use serde::de::{Error as DeError, Visitor};
|
use serde::de::{Error as DeError, Visitor};
|
||||||
|
use log::{trace, debug, info, warn, error};
|
||||||
use crate::hash_is_good;
|
use crate::hash_is_good;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
@@ -61,7 +62,7 @@ impl Keystore {
|
|||||||
f.write_all(&self.seed).expect("Error saving keystore");
|
f.write_all(&self.seed).expect("Error saving keystore");
|
||||||
self.path = filename.to_owned();
|
self.path = filename.to_owned();
|
||||||
}
|
}
|
||||||
Err(_) => { println!("Error saving key file!"); }
|
Err(_) => { error!("Error saving key file!"); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,11 +204,14 @@ impl<'dd> Deserialize<'dd> for Bytes {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[cfg(test)]
|
||||||
pub fn test_signature() {
|
mod tests {
|
||||||
let keystore: Keystore = Keystore::new();
|
#[test]
|
||||||
let data = b"{ identity: 178135D209C697625E3EC71DA5C760382E54936F824EE5083908DA66B14ECE18,\
|
pub fn test_signature() {
|
||||||
|
let keystore: Keystore = Keystore::new();
|
||||||
|
let data = b"{ identity: 178135D209C697625E3EC71DA5C760382E54936F824EE5083908DA66B14ECE18,\
|
||||||
confirmation: A4A0AFECD1A511825226F0D3437C6C6BDAE83554040AA7AEB49DEFEAB0AE9EA4 }";
|
confirmation: A4A0AFECD1A511825226F0D3437C6C6BDAE83554040AA7AEB49DEFEAB0AE9EA4 }";
|
||||||
let signature = keystore.sign(data);
|
let signature = keystore.sign(data);
|
||||||
assert!(Keystore::check(data, keystore.get_public().as_bytes(), &signature), "Wrong signature!")
|
assert!(Keystore::check(data, keystore.get_public().as_bytes(), &signature), "Wrong signature!")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
+33
-20
@@ -18,6 +18,8 @@ use rand::RngCore;
|
|||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use web_view::*;
|
use web_view::*;
|
||||||
use getopts::Options;
|
use getopts::Options;
|
||||||
|
use simple_logger::{SimpleLogger};
|
||||||
|
use log::{trace, debug, info, warn, error, LevelFilter};
|
||||||
|
|
||||||
use alfis::{Blockchain, Bytes, Context, Keystore, Transaction};
|
use alfis::{Blockchain, Bytes, Context, Keystore, Transaction};
|
||||||
use alfis::event::Event;
|
use alfis::event::Event;
|
||||||
@@ -47,13 +49,15 @@ fn main() {
|
|||||||
AttachConsole(ATTACH_PARENT_PROCESS);
|
AttachConsole(ATTACH_PARENT_PROCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("ALFIS 0.1.0");
|
println!("Starting ALFIS 0.1.0");
|
||||||
let args: Vec<String> = env::args().collect();
|
let args: Vec<String> = env::args().collect();
|
||||||
let program = args[0].clone();
|
let program = args[0].clone();
|
||||||
|
|
||||||
let mut opts = Options::new();
|
let mut opts = Options::new();
|
||||||
opts.optflag("h","help", "Print this help menu");
|
opts.optflag("h","help", "Print this help menu");
|
||||||
opts.optflag("n","nogui","Run without graphic user interface");
|
opts.optflag("n","nogui","Run without graphic user interface");
|
||||||
|
opts.optflag("v","verbose","Show more debug messages");
|
||||||
|
opts.optflag("d","debug","Show trace messages, more than debug");
|
||||||
opts.optopt("c","config","Path to config file", "");
|
opts.optopt("c","config","Path to config file", "");
|
||||||
|
|
||||||
let opt_matches = match opts.parse(&args[1..]) {
|
let opt_matches = match opts.parse(&args[1..]) {
|
||||||
@@ -69,18 +73,27 @@ fn main() {
|
|||||||
|
|
||||||
let no_gui = opt_matches.opt_present("n");
|
let no_gui = opt_matches.opt_present("n");
|
||||||
|
|
||||||
|
let mut level = LevelFilter::Info;
|
||||||
|
if opt_matches.opt_present("v") {
|
||||||
|
level = LevelFilter::Debug;
|
||||||
|
}
|
||||||
|
if opt_matches.opt_present("d") {
|
||||||
|
level = LevelFilter::Trace;
|
||||||
|
}
|
||||||
|
SimpleLogger::new().with_level(level).init().unwrap();
|
||||||
|
|
||||||
let settings = Settings::load(SETTINGS_FILENAME).expect("Error loading settings");
|
let settings = Settings::load(SETTINGS_FILENAME).expect("Error loading settings");
|
||||||
let keystore: Keystore = match Keystore::from_file(&settings.key_file, "") {
|
let keystore: Keystore = match Keystore::from_file(&settings.key_file, "") {
|
||||||
None => {
|
None => {
|
||||||
println!("Generated temporary keystore. Please, generate full-privileged keys.");
|
warn!("Generated temporary keystore. Please, generate full-privileged keys.");
|
||||||
Keystore::new()
|
Keystore::new()
|
||||||
}
|
}
|
||||||
Some(keystore) => { keystore }
|
Some(keystore) => { keystore }
|
||||||
};
|
};
|
||||||
let blockchain: Blockchain = Blockchain::new(&settings);
|
let blockchain: Blockchain = Blockchain::new(&settings);
|
||||||
match blockchain.get_block(0) {
|
match blockchain.get_block(0) {
|
||||||
None => { println!("No blocks found in DB"); }
|
None => { info!("No blocks found in DB"); }
|
||||||
Some(block) => { println!("Loaded DB with origin {:?}", &block.hash); }
|
Some(block) => { info!("Loaded DB with origin {:?}", &block.hash); }
|
||||||
}
|
}
|
||||||
let settings_copy = settings.clone();
|
let settings_copy = settings.clone();
|
||||||
let context: Arc<Mutex<Context>> = Arc::new(Mutex::new(Context::new(settings, keystore, blockchain)));
|
let context: Arc<Mutex<Context>> = Arc::new(Mutex::new(Context::new(settings, keystore, blockchain)));
|
||||||
@@ -116,14 +129,14 @@ fn start_dns_server(context: &Arc<Mutex<Context>>, settings: &Settings) {
|
|||||||
if server_context.enable_udp {
|
if server_context.enable_udp {
|
||||||
let udp_server = DnsUdpServer::new(server_context.clone(), 20);
|
let udp_server = DnsUdpServer::new(server_context.clone(), 20);
|
||||||
if let Err(e) = udp_server.run_server() {
|
if let Err(e) = udp_server.run_server() {
|
||||||
println!("Failed to bind UDP listener: {:?}", e);
|
error!("Failed to bind UDP listener: {:?}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if server_context.enable_tcp {
|
if server_context.enable_tcp {
|
||||||
let tcp_server = DnsTcpServer::new(server_context.clone(), 20);
|
let tcp_server = DnsTcpServer::new(server_context.clone(), 20);
|
||||||
if let Err(e) = tcp_server.run_server() {
|
if let Err(e) = tcp_server.run_server() {
|
||||||
println!("Failed to bind TCP listener: {:?}", e);
|
error!("Failed to bind TCP listener: {:?}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -156,14 +169,14 @@ fn run_interface(context: Arc<Mutex<Context>>, miner: Arc<Mutex<Miner>>) {
|
|||||||
.user_data(())
|
.user_data(())
|
||||||
.invoke_handler(|web_view, arg| {
|
.invoke_handler(|web_view, arg| {
|
||||||
use Cmd::*;
|
use Cmd::*;
|
||||||
println!("Command {}", arg);
|
debug!("Command {}", arg);
|
||||||
match serde_json::from_str(arg).unwrap() {
|
match serde_json::from_str(arg).unwrap() {
|
||||||
Loaded => {
|
Loaded => {
|
||||||
web_view.eval("showMiningIndicator(false);").expect("Error evaluating!");
|
web_view.eval("showMiningIndicator(false);").expect("Error evaluating!");
|
||||||
let handle = web_view.handle();
|
let handle = web_view.handle();
|
||||||
let mut c = context.lock().unwrap();
|
let mut c = context.lock().unwrap();
|
||||||
c.bus.register(move |_uuid, e| {
|
c.bus.register(move |_uuid, e| {
|
||||||
println!("Got event from bus {:?}", &e);
|
debug!("Got event from bus {:?}", &e);
|
||||||
let eval = match e {
|
let eval = match e {
|
||||||
Event::KeyCreated { path, public } => { format!("keystoreChanged('{}', '{}');", &path, &public) }
|
Event::KeyCreated { path, public } => { format!("keystoreChanged('{}', '{}');", &path, &public) }
|
||||||
Event::KeyLoaded { path, public } => { format!("keystoreChanged('{}', '{}');", &path, &public) }
|
Event::KeyLoaded { path, public } => { format!("keystoreChanged('{}', '{}');", &path, &public) }
|
||||||
@@ -176,7 +189,7 @@ fn run_interface(context: Arc<Mutex<Context>>, miner: Arc<Mutex<Miner>>) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if !eval.is_empty() {
|
if !eval.is_empty() {
|
||||||
println!("Evaluating {}", &eval);
|
debug!("Evaluating {}", &eval);
|
||||||
handle.dispatch(move |web_view| {
|
handle.dispatch(move |web_view| {
|
||||||
web_view.eval(&eval.replace("\\", "\\\\"))
|
web_view.eval(&eval.replace("\\", "\\\\"))
|
||||||
}).expect("Error dispatching!");
|
}).expect("Error dispatching!");
|
||||||
@@ -184,7 +197,7 @@ fn run_interface(context: Arc<Mutex<Context>>, miner: Arc<Mutex<Miner>>) {
|
|||||||
true
|
true
|
||||||
});
|
});
|
||||||
let eval = format!("keystoreChanged('{}', '{}');", c.keystore.get_path(), &c.keystore.get_public().to_string());
|
let eval = format!("keystoreChanged('{}', '{}');", c.keystore.get_path(), &c.keystore.get_public().to_string());
|
||||||
println!("Evaluating {}", &eval);
|
debug!("Evaluating {}", &eval);
|
||||||
web_view.eval(&eval.replace("\\", "\\\\")).expect("Error evaluating!");
|
web_view.eval(&eval.replace("\\", "\\\\")).expect("Error evaluating!");
|
||||||
}
|
}
|
||||||
LoadKey {} => {
|
LoadKey {} => {
|
||||||
@@ -194,10 +207,10 @@ fn run_interface(context: Arc<Mutex<Context>>, miner: Arc<Mutex<Miner>>) {
|
|||||||
Some(file_name) => {
|
Some(file_name) => {
|
||||||
match Keystore::from_file(&file_name, "") {
|
match Keystore::from_file(&file_name, "") {
|
||||||
None => {
|
None => {
|
||||||
println!("Error loading keystore '{}'!", &file_name);
|
error!("Error loading keystore '{}'!", &file_name);
|
||||||
},
|
},
|
||||||
Some(keystore) => {
|
Some(keystore) => {
|
||||||
println!("Loaded keystore with key: {:?}", &keystore.get_public());
|
info!("Loaded keystore with key: {:?}", &keystore.get_public());
|
||||||
let mut c = context.lock().unwrap();
|
let mut c = context.lock().unwrap();
|
||||||
c.bus.post(Event::KeyLoaded {path: keystore.get_path().to_owned(), public: keystore.get_public().to_string()});
|
c.bus.post(Event::KeyLoaded {path: keystore.get_path().to_owned(), public: keystore.get_public().to_string()});
|
||||||
c.set_keystore(keystore);
|
c.set_keystore(keystore);
|
||||||
@@ -218,7 +231,7 @@ fn run_interface(context: Arc<Mutex<Context>>, miner: Arc<Mutex<Miner>>) {
|
|||||||
let path = new_path.clone();
|
let path = new_path.clone();
|
||||||
let public = c.keystore.get_public().to_string();
|
let public = c.keystore.get_public().to_string();
|
||||||
c.keystore.save(&new_path, "");
|
c.keystore.save(&new_path, "");
|
||||||
println!("Key file saved to {}", &path);
|
info!("Key file saved to {}", &path);
|
||||||
c.bus.post(Event::KeySaved {path, public });
|
c.bus.post(Event::KeySaved {path, public });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -229,7 +242,7 @@ fn run_interface(context: Arc<Mutex<Context>>, miner: Arc<Mutex<Miner>>) {
|
|||||||
web_view.eval(&format!("domainAvailable({})", available)).expect("Error evaluating!");
|
web_view.eval(&format!("domainAvailable({})", available)).expect("Error evaluating!");
|
||||||
}
|
}
|
||||||
CreateDomain { name, records, .. } => {
|
CreateDomain { name, records, .. } => {
|
||||||
println!("Got records: {}", records);
|
debug!("Got records: {}", records);
|
||||||
if serde_json::from_str::<Vec<DnsRecord>>(&records).is_ok() {
|
if serde_json::from_str::<Vec<DnsRecord>>(&records).is_ok() {
|
||||||
let keystore = {
|
let keystore = {
|
||||||
let guard = context.lock().unwrap();
|
let guard = context.lock().unwrap();
|
||||||
@@ -237,7 +250,7 @@ fn run_interface(context: Arc<Mutex<Context>>, miner: Arc<Mutex<Miner>>) {
|
|||||||
};
|
};
|
||||||
create_domain(miner.clone(), name, records, &keystore);
|
create_domain(miner.clone(), name, records, &keystore);
|
||||||
} else {
|
} else {
|
||||||
println!("Error in DNS records for domain!");
|
warn!("Error in DNS records for domain!");
|
||||||
web_view.eval(&format!("showWarning('{}');", "Something wrong with your records! Please, correct the error and try again."));
|
web_view.eval(&format!("showWarning('{}');", "Something wrong with your records! Please, correct the error and try again."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -266,7 +279,7 @@ fn create_genesis<S: Into<String>>(miner: Arc<Mutex<Miner>>, name: S, keystore:
|
|||||||
|
|
||||||
fn create_domain<S: Into<String>>(miner: Arc<Mutex<Miner>>, name: S, data: S, keystore: &Keystore) {
|
fn create_domain<S: Into<String>>(miner: Arc<Mutex<Miner>>, name: S, data: S, keystore: &Keystore) {
|
||||||
let name = name.into();
|
let name = name.into();
|
||||||
println!("Generating domain {}", name);
|
info!("Generating domain or zone {}", name);
|
||||||
//let rec_vector: Vec<String> = records.into().trim().split("\n").map(|s| s.trim()).map(String::from).collect();
|
//let rec_vector: Vec<String> = records.into().trim().split("\n").map(|s| s.trim()).map(String::from).collect();
|
||||||
//let tags_vector: Vec<String> = tags.into().trim().split(",").map(|s| s.trim()).map(String::from).collect();
|
//let tags_vector: Vec<String> = tags.into().trim().split(",").map(|s| s.trim()).map(String::from).collect();
|
||||||
let transaction = create_transaction(keystore, name, "domain".into(), data.into());
|
let transaction = create_transaction(keystore, name, "domain".into(), data.into());
|
||||||
@@ -296,10 +309,10 @@ fn create_key(context: Arc<Mutex<Context>>) {
|
|||||||
miners_count.fetch_add(1, Ordering::Relaxed);
|
miners_count.fetch_add(1, Ordering::Relaxed);
|
||||||
match generate_key(KEYSTORE_DIFFICULTY, mining.clone()) {
|
match generate_key(KEYSTORE_DIFFICULTY, mining.clone()) {
|
||||||
None => {
|
None => {
|
||||||
println!("Keystore mining finished");
|
debug!("Keystore mining finished");
|
||||||
}
|
}
|
||||||
Some(keystore) => {
|
Some(keystore) => {
|
||||||
println!("Key mined successfully: {:?}", &keystore.get_public());
|
info!("Key mined successfully: {:?}", &keystore.get_public());
|
||||||
let mut c = context.lock().unwrap();
|
let mut c = context.lock().unwrap();
|
||||||
mining.store(false,Ordering::Relaxed);
|
mining.store(false,Ordering::Relaxed);
|
||||||
c.bus.post(Event::KeyCreated {path: keystore.get_path().to_owned(), public: keystore.get_public().to_string()});
|
c.bus.post(Event::KeyCreated {path: keystore.get_path().to_owned(), public: keystore.get_public().to_string()});
|
||||||
@@ -327,7 +340,7 @@ fn generate_key(difficulty: usize, mining: Arc<AtomicBool>) -> Option<Keystore>
|
|||||||
rng.fill_bytes(&mut buf);
|
rng.fill_bytes(&mut buf);
|
||||||
let keystore = Keystore::from_bytes(&buf);
|
let keystore = Keystore::from_bytes(&buf);
|
||||||
if keystore.hash_is_good(difficulty) {
|
if keystore.hash_is_good(difficulty) {
|
||||||
println!("Generated keypair: {:?}", &keystore);
|
info!("Generated keypair: {:?}", &keystore);
|
||||||
return Some(keystore);
|
return Some(keystore);
|
||||||
}
|
}
|
||||||
if !mining.load(Ordering::Relaxed) {
|
if !mining.load(Ordering::Relaxed) {
|
||||||
@@ -347,7 +360,7 @@ fn create_server_context(context: Arc<Mutex<Context>>, settings: &Settings) -> A
|
|||||||
server_context.filters.push(Box::new(BlockchainFilter::new(context)));
|
server_context.filters.push(Box::new(BlockchainFilter::new(context)));
|
||||||
match server_context.initialize() {
|
match server_context.initialize() {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(e) => { panic!("Server failed to initialize: {:?}", e); }
|
Err(e) => { panic!("DNS server failed to initialize: {:?}", e); }
|
||||||
}
|
}
|
||||||
|
|
||||||
Arc::new(server_context)
|
Arc::new(server_context)
|
||||||
|
|||||||
+8
-7
@@ -7,6 +7,7 @@ use chrono::Utc;
|
|||||||
use crypto::digest::Digest;
|
use crypto::digest::Digest;
|
||||||
use crypto::sha2::Sha256;
|
use crypto::sha2::Sha256;
|
||||||
use num_cpus;
|
use num_cpus;
|
||||||
|
use log::{trace, debug, info, warn, error};
|
||||||
|
|
||||||
use crate::{Block, Bytes, Context, hash_is_good, Transaction};
|
use crate::{Block, Bytes, Context, hash_is_good, Transaction};
|
||||||
use crate::event::Event;
|
use crate::event::Event;
|
||||||
@@ -58,7 +59,7 @@ impl Miner {
|
|||||||
|
|
||||||
let mut lock = transactions.lock().unwrap();
|
let mut lock = transactions.lock().unwrap();
|
||||||
if lock.len() > 0 {
|
if lock.len() > 0 {
|
||||||
println!("Got new transaction to mine");
|
info!("Got new transaction to mine");
|
||||||
let transaction = lock.remove(0);
|
let transaction = lock.remove(0);
|
||||||
mining.store(true, Ordering::Relaxed);
|
mining.store(true, Ordering::Relaxed);
|
||||||
Miner::mine_internal(context.clone(), transactions.clone(), transaction, mining.clone(), cond_var.clone());
|
Miner::mine_internal(context.clone(), transactions.clone(), transaction, mining.clone(), cond_var.clone());
|
||||||
@@ -98,7 +99,7 @@ impl Miner {
|
|||||||
let last_block = { context.lock().unwrap().blockchain.last_block() };
|
let last_block = { context.lock().unwrap().blockchain.last_block() };
|
||||||
match last_block {
|
match last_block {
|
||||||
None => {
|
None => {
|
||||||
println!("Mining genesis block");
|
warn!("Mining genesis block");
|
||||||
// Creating a block with that signed transaction
|
// Creating a block with that signed transaction
|
||||||
Block::new(0, Utc::now().timestamp(), version, Bytes::zero32(), Some(transaction.clone()))
|
Block::new(0, Utc::now().timestamp(), version, Bytes::zero32(), Some(transaction.clone()))
|
||||||
},
|
},
|
||||||
@@ -111,7 +112,7 @@ impl Miner {
|
|||||||
|
|
||||||
let live_threads = Arc::new(AtomicU32::new(0u32));
|
let live_threads = Arc::new(AtomicU32::new(0u32));
|
||||||
let cpus = num_cpus::get();
|
let cpus = num_cpus::get();
|
||||||
println!("Starting {} threads for mining", cpus);
|
debug!("Starting {} threads for mining", cpus);
|
||||||
for _ in 0..cpus {
|
for _ in 0..cpus {
|
||||||
let transactions = transactions.clone();
|
let transactions = transactions.clone();
|
||||||
let context = context.clone();
|
let context = context.clone();
|
||||||
@@ -124,7 +125,7 @@ impl Miner {
|
|||||||
live_threads.fetch_add(1, Ordering::Relaxed);
|
live_threads.fetch_add(1, Ordering::Relaxed);
|
||||||
match find_hash(&mut Sha256::new(), block, mining.clone()) {
|
match find_hash(&mut Sha256::new(), block, mining.clone()) {
|
||||||
None => {
|
None => {
|
||||||
println!("Mining did not find suitable hash or was stopped");
|
debug!("Mining did not find suitable hash or was stopped");
|
||||||
let count = live_threads.fetch_sub(1, Ordering::Relaxed);
|
let count = live_threads.fetch_sub(1, Ordering::Relaxed);
|
||||||
// If this is the last thread, but mining was not stopped by another thread
|
// If this is the last thread, but mining was not stopped by another thread
|
||||||
if count == 0 && mining.load(Ordering::Relaxed) {
|
if count == 0 && mining.load(Ordering::Relaxed) {
|
||||||
@@ -138,9 +139,9 @@ impl Miner {
|
|||||||
let index = block.index;
|
let index = block.index;
|
||||||
let mut context = context.lock().unwrap();
|
let mut context = context.lock().unwrap();
|
||||||
if context.blockchain.add_block(block).is_err() {
|
if context.blockchain.add_block(block).is_err() {
|
||||||
println!("Error adding mined block!");
|
warn!("Error adding mined block!");
|
||||||
if index == 0 {
|
if index == 0 {
|
||||||
println!("To mine genesis block you need to make 'origin' an empty string in config.");
|
error!("To mine genesis block you need to make 'origin' an empty string in config.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
context.bus.post(Event::MinerStopped);
|
context.bus.post(Event::MinerStopped);
|
||||||
@@ -155,7 +156,7 @@ impl Miner {
|
|||||||
fn find_hash(digest: &mut dyn Digest, mut block: Block, running: Arc<AtomicBool>) -> Option<Block> {
|
fn find_hash(digest: &mut dyn Digest, mut block: Block, running: Arc<AtomicBool>) -> Option<Block> {
|
||||||
let mut buf: [u8; 32] = [0; 32];
|
let mut buf: [u8; 32] = [0; 32];
|
||||||
block.random = rand::random();
|
block.random = rand::random();
|
||||||
println!("Mining block {}", serde_json::to_string(&block).unwrap());
|
debug!("Mining block {}", serde_json::to_string(&block).unwrap());
|
||||||
for nonce in 0..std::u64::MAX {
|
for nonce in 0..std::u64::MAX {
|
||||||
if !running.load(Ordering::Relaxed) {
|
if !running.load(Ordering::Relaxed) {
|
||||||
return None;
|
return None;
|
||||||
|
|||||||
+20
-19
@@ -10,6 +10,7 @@ use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
|
|||||||
use mio::{Events, Interest, Poll, Registry, Token};
|
use mio::{Events, Interest, Poll, Registry, Token};
|
||||||
use mio::event::Event;
|
use mio::event::Event;
|
||||||
use mio::net::{TcpListener, TcpStream};
|
use mio::net::{TcpListener, TcpStream};
|
||||||
|
use log::{trace, debug, info, warn, error};
|
||||||
|
|
||||||
use crate::{Context, Block, p2p::Message, p2p::State, p2p::Peer, p2p::Peers};
|
use crate::{Context, Block, p2p::Message, p2p::State, p2p::Peer, p2p::Peers};
|
||||||
use std::net::{SocketAddr, IpAddr, SocketAddrV4, Shutdown};
|
use std::net::{SocketAddr, IpAddr, SocketAddrV4, Shutdown};
|
||||||
@@ -38,7 +39,7 @@ impl Network {
|
|||||||
// Starting server socket
|
// Starting server socket
|
||||||
let addr = listen_addr.parse().expect("Error parsing listen address");
|
let addr = listen_addr.parse().expect("Error parsing listen address");
|
||||||
let mut server = TcpListener::bind(addr).expect("Can't bind to address");
|
let mut server = TcpListener::bind(addr).expect("Can't bind to address");
|
||||||
println!("Started node listener on {}", server.local_addr().unwrap());
|
debug!("Started node listener on {}", server.local_addr().unwrap());
|
||||||
|
|
||||||
let mut events = Events::with_capacity(64);
|
let mut events = Events::with_capacity(64);
|
||||||
let mut poll = Poll::new().expect("Unable to create poll");
|
let mut poll = Poll::new().expect("Unable to create poll");
|
||||||
@@ -60,7 +61,7 @@ impl Network {
|
|||||||
|
|
||||||
// Process each event.
|
// Process each event.
|
||||||
for event in events.iter() {
|
for event in events.iter() {
|
||||||
println!("Event for socket {} is {:?}", event.token().0, &event);
|
trace!("Event for socket {} is {:?}", event.token().0, &event);
|
||||||
// We can use the token we previously provided to `register` to determine for which socket the event is.
|
// We can use the token we previously provided to `register` to determine for which socket the event is.
|
||||||
match event.token() {
|
match event.token() {
|
||||||
SERVER => {
|
SERVER => {
|
||||||
@@ -77,7 +78,7 @@ impl Network {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("Accepted connection from: {}", address);
|
info!("Accepted connection from: {}", address);
|
||||||
let token = next(&mut unique_token);
|
let token = next(&mut unique_token);
|
||||||
poll.registry().register(&mut stream, token, Interest::READABLE).expect("Error registering poll");
|
poll.registry().register(&mut stream, token, Interest::READABLE).expect("Error registering poll");
|
||||||
peers.add_peer(token, Peer::new(address, stream, State::Connected, true));
|
peers.add_peer(token, Peer::new(address, stream, State::Connected, true));
|
||||||
@@ -98,7 +99,7 @@ impl Network {
|
|||||||
let stream = peer.get_stream();
|
let stream = peer.get_stream();
|
||||||
let _ = poll.registry().deregister(stream);
|
let _ = poll.registry().deregister(stream);
|
||||||
let _ = stream.shutdown(Shutdown::Both);
|
let _ = stream.shutdown(Shutdown::Both);
|
||||||
println!("Peer connection {:?} has shut down", &peer.get_addr());
|
info!("Peer connection {:?} has shut down", &peer.get_addr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,7 +109,7 @@ impl Network {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => { println!("Odd event from poll"); }
|
None => { warn!("Odd event from poll"); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,7 +142,7 @@ fn handle_connection_event(context: Arc<Mutex<Context>>, peers: &mut Peers, regi
|
|||||||
let data = data.unwrap();
|
let data = data.unwrap();
|
||||||
match Message::from_bytes(data) {
|
match Message::from_bytes(data) {
|
||||||
Ok(message) => {
|
Ok(message) => {
|
||||||
println!("Got message from socket {}: {:?}", &event.token().0, &message);
|
debug!("Got message from socket {}: {:?}", &event.token().0, &message);
|
||||||
let new_state = handle_message(context.clone(), message, peers, &event.token());
|
let new_state = handle_message(context.clone(), message, peers, &event.token());
|
||||||
let peer = peers.get_mut_peer(&event.token()).unwrap();
|
let peer = peers.get_mut_peer(&event.token()).unwrap();
|
||||||
let stream = peer.get_stream();
|
let stream = peer.get_stream();
|
||||||
@@ -179,28 +180,28 @@ fn handle_connection_event(context: Arc<Mutex<Context>>, peers: &mut Peers, regi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if event.is_writable() {
|
if event.is_writable() {
|
||||||
//println!("Socket {} is writable", event.token().0);
|
trace!("Socket {} is writable", event.token().0);
|
||||||
match peers.get_mut_peer(&event.token()) {
|
match peers.get_mut_peer(&event.token()) {
|
||||||
None => {}
|
None => {}
|
||||||
Some(peer) => {
|
Some(peer) => {
|
||||||
match peer.get_state().clone() {
|
match peer.get_state().clone() {
|
||||||
State::Connecting => {
|
State::Connecting => {
|
||||||
println!("Sending hello to socket {}", event.token().0);
|
debug!("Sending hello to socket {}", event.token().0);
|
||||||
let data: String = {
|
let data: String = {
|
||||||
let c = context.lock().unwrap();
|
let c = context.lock().unwrap();
|
||||||
let message = Message::hand(&c.settings.origin, c.settings.version, c.settings.public);
|
let message = Message::hand(&c.settings.origin, c.settings.version, c.settings.public);
|
||||||
serde_json::to_string(&message).unwrap()
|
serde_json::to_string(&message).unwrap()
|
||||||
};
|
};
|
||||||
send_message(peer.get_stream(), &data.into_bytes());
|
send_message(peer.get_stream(), &data.into_bytes());
|
||||||
//println!("Sent hello through socket {}", event.token().0);
|
debug!("Sent hello through socket {}", event.token().0);
|
||||||
}
|
}
|
||||||
State::Message { data } => {
|
State::Message { data } => {
|
||||||
println!("Sending data to socket {}: {}", event.token().0, &String::from_utf8(data.clone()).unwrap());
|
debug!("Sending data to socket {}: {}", event.token().0, &String::from_utf8(data.clone()).unwrap());
|
||||||
send_message(peer.get_stream(), &data);
|
send_message(peer.get_stream(), &data);
|
||||||
}
|
}
|
||||||
State::Connected => {}
|
State::Connected => {}
|
||||||
State::Idle { from } => {
|
State::Idle { from } => {
|
||||||
println!("Odd version of pings :)");
|
debug!("Odd version of pings :)");
|
||||||
if from.elapsed().as_secs() >= 30 {
|
if from.elapsed().as_secs() >= 30 {
|
||||||
let data: String = {
|
let data: String = {
|
||||||
let c = context.lock().unwrap();
|
let c = context.lock().unwrap();
|
||||||
@@ -227,11 +228,11 @@ fn read_message(stream: &mut TcpStream) -> Result<Vec<u8>, ()> {
|
|||||||
let data_size = match stream.read_u32::<BigEndian>() {
|
let data_size = match stream.read_u32::<BigEndian>() {
|
||||||
Ok(size) => { size as usize }
|
Ok(size) => { size as usize }
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("Error reading from socket! {}", e);
|
error!("Error reading from socket! {}", e);
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
println!("Payload size is {}", data_size);
|
trace!("Payload size is {}", data_size);
|
||||||
if data_size > MAX_PACKET_SIZE {
|
if data_size > MAX_PACKET_SIZE {
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
@@ -255,7 +256,7 @@ fn read_message(stream: &mut TcpStream) -> Result<Vec<u8>, ()> {
|
|||||||
Err(ref err) if interrupted(err) => continue,
|
Err(ref err) if interrupted(err) => continue,
|
||||||
// Other errors we'll consider fatal.
|
// Other errors we'll consider fatal.
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
println!("Error reading message, only {} bytes read", bytes_read);
|
debug!("Error reading message, only {} bytes read", bytes_read);
|
||||||
return Err(())
|
return Err(())
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -286,7 +287,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
|
|||||||
peer.set_public(public);
|
peer.set_public(public);
|
||||||
State::message(Message::shake(&origin, version, true, my_height))
|
State::message(Message::shake(&origin, version, true, my_height))
|
||||||
} else {
|
} else {
|
||||||
println!("Handshake from unsupported chain or version");
|
warn!("Handshake from unsupported chain or version");
|
||||||
State::Error
|
State::Error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -335,7 +336,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Message::Block { index, block } => {
|
Message::Block { index, block } => {
|
||||||
println!("Received block {}", index);
|
info!("Received block {}", index);
|
||||||
let block: Block = match serde_json::from_str(&block) {
|
let block: Block = match serde_json::from_str(&block) {
|
||||||
Ok(block) => block,
|
Ok(block) => block,
|
||||||
Err(_) => return State::Error
|
Err(_) => return State::Error
|
||||||
@@ -346,7 +347,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
|
|||||||
let mut context = context.lock().unwrap();
|
let mut context = context.lock().unwrap();
|
||||||
match context.blockchain.add_block(block) {
|
match context.blockchain.add_block(block) {
|
||||||
Ok(_) => { context.bus.post(crate::event::Event::BlockchainChanged); }
|
Ok(_) => { context.bus.post(crate::event::Event::BlockchainChanged); }
|
||||||
Err(_) => { println!("Error adding received block"); }
|
Err(_) => { warn!("Error adding received block"); }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
State::idle()
|
State::idle()
|
||||||
@@ -360,7 +361,7 @@ fn connect_peers(peers_addrs: Vec<String>, poll: &mut Poll, peers: &mut Peers, u
|
|||||||
let addr: SocketAddr = peer.parse().expect(&format!("Error parsing peer address {}", &peer));
|
let addr: SocketAddr = peer.parse().expect(&format!("Error parsing peer address {}", &peer));
|
||||||
match TcpStream::connect(addr.clone()) {
|
match TcpStream::connect(addr.clone()) {
|
||||||
Ok(mut stream) => {
|
Ok(mut stream) => {
|
||||||
println!("Created connection to peer {}", &peer);
|
info!("Created connection to peer {}", &peer);
|
||||||
let token = next(unique_token);
|
let token = next(unique_token);
|
||||||
poll.registry().register(&mut stream, token, Interest::WRITABLE).unwrap();
|
poll.registry().register(&mut stream, token, Interest::WRITABLE).unwrap();
|
||||||
let mut peer = Peer::new(addr, stream, State::Connecting, false);
|
let mut peer = Peer::new(addr, stream, State::Connecting, false);
|
||||||
@@ -368,7 +369,7 @@ fn connect_peers(peers_addrs: Vec<String>, poll: &mut Poll, peers: &mut Peers, u
|
|||||||
peers.add_peer(token, peer);
|
peers.add_peer(token, peer);
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("Error connecting to peer {}: {}", &peer, e);
|
error!("Error connecting to peer {}: {}", &peer, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -6,6 +6,7 @@ use crate::p2p::{Peer, State, Message};
|
|||||||
use crate::p2p::network::LISTEN_PORT;
|
use crate::p2p::network::LISTEN_PORT;
|
||||||
use crate::p2p::network::next;
|
use crate::p2p::network::next;
|
||||||
use rand::random;
|
use rand::random;
|
||||||
|
use log::{trace, debug, info, warn, error};
|
||||||
|
|
||||||
pub struct Peers {
|
pub struct Peers {
|
||||||
peers: HashMap<Token, Peer>,
|
peers: HashMap<Token, Peer>,
|
||||||
@@ -36,7 +37,7 @@ impl Peers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_peers_from_exchange(&mut self, peers: Vec<String>) {
|
pub fn add_peers_from_exchange(&mut self, peers: Vec<String>) {
|
||||||
println!("Got peers: {:?}", &peers);
|
info!("Got peers: {:?}", &peers);
|
||||||
// TODO make it return error if these peers are wrong and seem like an attack
|
// TODO make it return error if these peers are wrong and seem like an attack
|
||||||
for peer in peers.iter() {
|
for peer in peers.iter() {
|
||||||
let addr: SocketAddr = peer.parse().expect(&format!("Error parsing peer {}", peer));
|
let addr: SocketAddr = peer.parse().expect(&format!("Error parsing peer {}", peer));
|
||||||
@@ -109,7 +110,7 @@ impl Peers {
|
|||||||
for addr in self.new_peers.iter() {
|
for addr in self.new_peers.iter() {
|
||||||
match TcpStream::connect(addr.clone()) {
|
match TcpStream::connect(addr.clone()) {
|
||||||
Ok(mut stream) => {
|
Ok(mut stream) => {
|
||||||
println!("Created connection to peer {}", &addr);
|
info!("Created connection to peer {}", &addr);
|
||||||
let token = next(unique_token);
|
let token = next(unique_token);
|
||||||
registry.register(&mut stream, token, Interest::WRITABLE).unwrap();
|
registry.register(&mut stream, token, Interest::WRITABLE).unwrap();
|
||||||
let mut peer = Peer::new(addr.clone(), stream, State::Connecting, false);
|
let mut peer = Peer::new(addr.clone(), stream, State::Connecting, false);
|
||||||
@@ -117,7 +118,7 @@ impl Peers {
|
|||||||
self.peers.insert(token, peer);
|
self.peers.insert(token, peer);
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("Error connecting to peer {}: {}", &addr, e);
|
error!("Error connecting to peer {}: {}", &addr, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user