respect minimal protocol version, fixed #141
This commit is contained in:
parent
cf85285112
commit
fe9828dbdc
|
@ -6,10 +6,6 @@ use net::Config as NetConfig;
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
/// Number of threads used by p2p thread pool.
|
/// Number of threads used by p2p thread pool.
|
||||||
pub threads: usize,
|
pub threads: usize,
|
||||||
/// Lowest supported protocol version.
|
|
||||||
pub protocol_minimum: u32,
|
|
||||||
/// Highest supported protocol version.
|
|
||||||
pub protocol_maximum: u32,
|
|
||||||
/// Number of inbound connections.
|
/// Number of inbound connections.
|
||||||
pub inbound_connections: u32,
|
pub inbound_connections: u32,
|
||||||
/// Number of outbound connections.
|
/// Number of outbound connections.
|
||||||
|
|
|
@ -1,19 +1,20 @@
|
||||||
use std::{io, cmp};
|
use std::{io, cmp};
|
||||||
use futures::{Future, Poll, Async};
|
use futures::{Future, Poll, Async};
|
||||||
use message::{Message, MessageResult};
|
use message::{Message, MessageResult, Error};
|
||||||
use message::types::{Version, Verack};
|
use message::types::{Version, Verack};
|
||||||
use message::common::Magic;
|
use message::common::Magic;
|
||||||
use io::{write_message, WriteMessage, ReadMessage, read_message};
|
use io::{write_message, WriteMessage, ReadMessage, read_message};
|
||||||
|
|
||||||
pub fn handshake<A>(a: A, magic: Magic, version: Version) -> Handshake<A> where A: io::Write + io::Read {
|
pub fn handshake<A>(a: A, magic: Magic, version: Version, min_version: u32) -> Handshake<A> where A: io::Write + io::Read {
|
||||||
Handshake {
|
Handshake {
|
||||||
version: version.version(),
|
version: version.version(),
|
||||||
state: HandshakeState::SendVersion(write_message(a, version_message(magic, version))),
|
state: HandshakeState::SendVersion(write_message(a, version_message(magic, version))),
|
||||||
magic: magic,
|
magic: magic,
|
||||||
|
min_version: min_version,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn accept_handshake<A>(a: A, magic: Magic, version: Version) -> AcceptHandshake<A> where A: io::Write + io::Read {
|
pub fn accept_handshake<A>(a: A, magic: Magic, version: Version, min_version: u32) -> AcceptHandshake<A> where A: io::Write + io::Read {
|
||||||
AcceptHandshake {
|
AcceptHandshake {
|
||||||
version: version.version(),
|
version: version.version(),
|
||||||
state: AcceptHandshakeState::ReceiveVersion {
|
state: AcceptHandshakeState::ReceiveVersion {
|
||||||
|
@ -21,6 +22,7 @@ pub fn accept_handshake<A>(a: A, magic: Magic, version: Version) -> AcceptHandsh
|
||||||
future: read_message(a, magic, 0),
|
future: read_message(a, magic, 0),
|
||||||
},
|
},
|
||||||
magic: magic,
|
magic: magic,
|
||||||
|
min_version: min_version,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,12 +74,14 @@ pub struct Handshake<A> {
|
||||||
state: HandshakeState<A>,
|
state: HandshakeState<A>,
|
||||||
magic: Magic,
|
magic: Magic,
|
||||||
version: u32,
|
version: u32,
|
||||||
|
min_version: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct AcceptHandshake<A> {
|
pub struct AcceptHandshake<A> {
|
||||||
state: AcceptHandshakeState<A>,
|
state: AcceptHandshakeState<A>,
|
||||||
magic: Magic,
|
magic: Magic,
|
||||||
version: u32,
|
version: u32,
|
||||||
|
min_version: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<A> Future for Handshake<A> where A: io::Read + io::Write {
|
impl<A> Future for Handshake<A> where A: io::Read + io::Write {
|
||||||
|
@ -97,6 +101,10 @@ impl<A> Future for Handshake<A> where A: io::Read + io::Write {
|
||||||
Err(err) => return Ok((stream, Err(err.into())).into()),
|
Err(err) => return Ok((stream, Err(err.into())).into()),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if version.version() < self.min_version {
|
||||||
|
return Ok((stream, Err(Error::InvalidVersion)).into());
|
||||||
|
}
|
||||||
|
|
||||||
let next = HandshakeState::ReceiveVerack {
|
let next = HandshakeState::ReceiveVerack {
|
||||||
version: Some(version),
|
version: Some(version),
|
||||||
future: read_message(stream, self.magic, 0),
|
future: read_message(stream, self.magic, 0),
|
||||||
|
@ -140,6 +148,10 @@ impl<A> Future for AcceptHandshake<A> where A: io::Read + io::Write {
|
||||||
Err(err) => return Ok((stream, Err(err.into())).into()),
|
Err(err) => return Ok((stream, Err(err.into())).into()),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if version.version() < self.min_version {
|
||||||
|
return Ok((stream, Err(Error::InvalidVersion)).into());
|
||||||
|
}
|
||||||
|
|
||||||
let local_version = local_version.take().expect("local version must be set");
|
let local_version = local_version.take().expect("local version must be set");
|
||||||
let next = AcceptHandshakeState::SendVersion {
|
let next = AcceptHandshakeState::SendVersion {
|
||||||
version: Some(version),
|
version: Some(version),
|
||||||
|
|
|
@ -25,9 +25,6 @@ mod config;
|
||||||
mod event_loop;
|
mod event_loop;
|
||||||
mod p2p;
|
mod p2p;
|
||||||
|
|
||||||
pub const VERSION: u32 = 70_014;
|
|
||||||
pub const USER_AGENT: &'static str = "pbtc";
|
|
||||||
|
|
||||||
pub use primitives::{hash, bytes};
|
pub use primitives::{hash, bytes};
|
||||||
|
|
||||||
pub use config::Config;
|
pub use config::Config;
|
||||||
|
|
|
@ -9,7 +9,7 @@ use net::{Config, Connection};
|
||||||
|
|
||||||
pub fn accept_connection(stream: TcpStream, handle: &Handle, config: &Config, address: net::SocketAddr) -> Deadline<AcceptConnection> {
|
pub fn accept_connection(stream: TcpStream, handle: &Handle, config: &Config, address: net::SocketAddr) -> Deadline<AcceptConnection> {
|
||||||
let accept = AcceptConnection {
|
let accept = AcceptConnection {
|
||||||
handshake: accept_handshake(stream, config.magic, config.version(&address)),
|
handshake: accept_handshake(stream, config.magic, config.version(&address), config.protocol_minimum),
|
||||||
magic: config.magic,
|
magic: config.magic,
|
||||||
address: address,
|
address: address,
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,10 +3,11 @@ use message::common::{Magic, Services, NetAddress};
|
||||||
use message::types::version::{Version, V0, V106, V70001};
|
use message::types::version::{Version, V0, V106, V70001};
|
||||||
use util::time::{Time, RealTime};
|
use util::time::{Time, RealTime};
|
||||||
use util::nonce::{NonceGenerator, RandomNonce};
|
use util::nonce::{NonceGenerator, RandomNonce};
|
||||||
use VERSION;
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
|
pub protocol_version: u32,
|
||||||
|
pub protocol_minimum: u32,
|
||||||
pub magic: Magic,
|
pub magic: Magic,
|
||||||
pub local_address: SocketAddr,
|
pub local_address: SocketAddr,
|
||||||
pub services: Services,
|
pub services: Services,
|
||||||
|
@ -18,7 +19,7 @@ pub struct Config {
|
||||||
impl Config {
|
impl Config {
|
||||||
pub fn version(&self, to: &SocketAddr) -> Version {
|
pub fn version(&self, to: &SocketAddr) -> Version {
|
||||||
Version::V70001(V0 {
|
Version::V70001(V0 {
|
||||||
version: VERSION,
|
version: self.protocol_version,
|
||||||
services: self.services,
|
services: self.services,
|
||||||
timestamp: RealTime.get().sec,
|
timestamp: RealTime.get().sec,
|
||||||
receiver: NetAddress {
|
receiver: NetAddress {
|
||||||
|
|
|
@ -18,6 +18,7 @@ pub fn connect(address: &SocketAddr, handle: &Handle, config: &Config) -> Deadli
|
||||||
},
|
},
|
||||||
magic: config.magic,
|
magic: config.magic,
|
||||||
address: *address,
|
address: *address,
|
||||||
|
protocol_minimum: config.protocol_minimum,
|
||||||
};
|
};
|
||||||
|
|
||||||
deadline(Duration::new(5, 0), handle, connect).expect("Failed to create timeout")
|
deadline(Duration::new(5, 0), handle, connect).expect("Failed to create timeout")
|
||||||
|
@ -36,6 +37,7 @@ pub struct Connect {
|
||||||
state: ConnectState,
|
state: ConnectState,
|
||||||
magic: Magic,
|
magic: Magic,
|
||||||
address: SocketAddr,
|
address: SocketAddr,
|
||||||
|
protocol_minimum: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Future for Connect {
|
impl Future for Connect {
|
||||||
|
@ -47,7 +49,7 @@ impl Future for Connect {
|
||||||
ConnectState::TcpConnect { ref mut future, ref mut version } => {
|
ConnectState::TcpConnect { ref mut future, ref mut version } => {
|
||||||
let stream = try_ready!(future.poll());
|
let stream = try_ready!(future.poll());
|
||||||
let version = version.take().expect("state TcpConnect must have version");
|
let version = version.take().expect("state TcpConnect must have version");
|
||||||
let handshake = handshake(stream, self.magic, version);
|
let handshake = handshake(stream, self.magic, version, self.protocol_minimum);
|
||||||
(ConnectState::Handshake(handshake), Async::NotReady)
|
(ConnectState::Handshake(handshake), Async::NotReady)
|
||||||
},
|
},
|
||||||
ConnectState::Handshake(ref mut future) => {
|
ConnectState::Handshake(ref mut future) => {
|
||||||
|
|
|
@ -2,7 +2,7 @@ use std::net::SocketAddr;
|
||||||
use sync::create_sync_connection_factory;
|
use sync::create_sync_connection_factory;
|
||||||
use message::Services;
|
use message::Services;
|
||||||
use util::{open_db, init_db, node_table_path};
|
use util::{open_db, init_db, node_table_path};
|
||||||
use {config, p2p};
|
use {config, p2p, PROTOCOL_VERSION, PROTOCOL_MINIMUM, USER_AGENT};
|
||||||
|
|
||||||
pub fn start(cfg: config::Config) -> Result<(), String> {
|
pub fn start(cfg: config::Config) -> Result<(), String> {
|
||||||
let mut el = p2p::event_loop();
|
let mut el = p2p::event_loop();
|
||||||
|
@ -12,15 +12,15 @@ pub fn start(cfg: config::Config) -> Result<(), String> {
|
||||||
|
|
||||||
let p2p_cfg = p2p::Config {
|
let p2p_cfg = p2p::Config {
|
||||||
threads: 4,
|
threads: 4,
|
||||||
protocol_minimum: 70001,
|
|
||||||
protocol_maximum: 70017,
|
|
||||||
inbound_connections: 10,
|
inbound_connections: 10,
|
||||||
outbound_connections: 10,
|
outbound_connections: 10,
|
||||||
connection: p2p::NetConfig {
|
connection: p2p::NetConfig {
|
||||||
|
protocol_version: PROTOCOL_VERSION,
|
||||||
|
protocol_minimum: PROTOCOL_MINIMUM,
|
||||||
magic: cfg.magic,
|
magic: cfg.magic,
|
||||||
local_address: SocketAddr::new("127.0.0.1".parse().unwrap(), cfg.port),
|
local_address: SocketAddr::new("127.0.0.1".parse().unwrap(), cfg.port),
|
||||||
services: Services::default().with_network(true),
|
services: Services::default().with_network(true),
|
||||||
user_agent: "pbtc".into(),
|
user_agent: USER_AGENT.into(),
|
||||||
start_height: 0,
|
start_height: 0,
|
||||||
relay: false,
|
relay: false,
|
||||||
},
|
},
|
||||||
|
|
|
@ -23,6 +23,9 @@ mod util;
|
||||||
use app_dirs::AppInfo;
|
use app_dirs::AppInfo;
|
||||||
|
|
||||||
pub const APP_INFO: AppInfo = AppInfo { name: "pbtc", author: "Parity" };
|
pub const APP_INFO: AppInfo = AppInfo { name: "pbtc", author: "Parity" };
|
||||||
|
pub const PROTOCOL_VERSION: u32 = 70_014;
|
||||||
|
pub const PROTOCOL_MINIMUM: u32 = 70_001;
|
||||||
|
pub const USER_AGENT: &'static str = "pbtc";
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
env_logger::init().unwrap();
|
env_logger::init().unwrap();
|
||||||
|
|
Loading…
Reference in New Issue