Send unspecified addresses and client services for isolated connections

This commit is contained in:
teor 2021-05-14 15:29:18 +10:00
parent 9160365d06
commit f541f85792
1 changed files with 21 additions and 13 deletions

View File

@ -13,14 +13,13 @@ use futures::{
channel::{mpsc, oneshot}, channel::{mpsc, oneshot},
future, FutureExt, SinkExt, StreamExt, future, FutureExt, SinkExt, StreamExt,
}; };
use lazy_static::lazy_static;
use tokio::{net::TcpStream, sync::broadcast, task::JoinError, time::timeout}; use tokio::{net::TcpStream, sync::broadcast, task::JoinError, time::timeout};
use tokio_util::codec::Framed; use tokio_util::codec::Framed;
use tower::Service; use tower::Service;
use tracing::{span, Level, Span}; use tracing::{span, Level, Span};
use tracing_futures::Instrument; use tracing_futures::Instrument;
use zebra_chain::block; use zebra_chain::{block, parameters::Network};
use crate::{ use crate::{
constants, constants,
@ -101,10 +100,9 @@ pub enum ConnectedAddr {
// TODO: handle Tor onion addresses // TODO: handle Tor onion addresses
} }
lazy_static! { /// Get an unspecified IPv4 address for `network`
/// An unspecified IPv4 address pub fn get_unspecified_ipv4_addr(network: Network) -> SocketAddr {
pub static ref UNSPECIFIED_IPV4_ADDR: SocketAddr = (Ipv4Addr::UNSPECIFIED, network.default_port()).into()
(Ipv4Addr::UNSPECIFIED, 0).into();
} }
use ConnectedAddr::*; use ConnectedAddr::*;
@ -414,18 +412,28 @@ pub async fn negotiate_version(
let now = Utc::now().timestamp(); let now = Utc::now().timestamp();
let timestamp = Utc.timestamp(now - now.rem_euclid(5 * 60), 0); let timestamp = Utc.timestamp(now - now.rem_euclid(5 * 60), 0);
let (their_addr, our_services, our_listen_addr) = match connected_addr {
// Version messages require an address, so we use
// an unspecified address for Isolated connections
Isolated => {
let unspec_ipv4 = get_unspecified_ipv4_addr(config.network);
(unspec_ipv4, PeerServices::empty(), unspec_ipv4)
}
_ => {
let their_addr = connected_addr
.get_transient_addr()
.expect("non-Isolated connections have a remote addr");
(their_addr, our_services, config.listen_addr)
}
};
let our_version = Message::Version { let our_version = Message::Version {
version: constants::CURRENT_VERSION, version: constants::CURRENT_VERSION,
services: our_services, services: our_services,
timestamp, timestamp,
address_recv: ( address_recv: (PeerServices::NODE_NETWORK, their_addr),
PeerServices::NODE_NETWORK,
connected_addr
.get_transient_addr()
.unwrap_or_else(|| *UNSPECIFIED_IPV4_ADDR),
),
// TODO: detect external address (#1893) // TODO: detect external address (#1893)
address_from: (our_services, config.listen_addr), address_from: (our_services, our_listen_addr),
nonce: local_nonce, nonce: local_nonce,
user_agent: user_agent.clone(), user_agent: user_agent.clone(),
// The protocol works fine if we don't reveal our current block height, // The protocol works fine if we don't reveal our current block height,