mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 22:11:06 +00:00
Upgrade to libp2p 0.51.3 (#13587)
* client/network: upgrade to libp2p 0.51.0 * make discovery.rs compile * make peer_info.rs compile * changes to notifications and request-response proto * make service.rs compile * towards making request_responses.rs compile * make request_responses.rs compile * make request_responses.rs compile * fix notifications/behaviour.rs tests * fix warnings * remove old code * allow deprecated code (temporary) * upgrade to libp2p 0.51.1 * add TODO for behaviour tests * return empty vec if peer_id is absent https://github.com/paritytech/substrate/pull/13587#discussion_r1141695167 fyi: I don't really know what the old behaviour was. * update comment to reflect new defaults Closes #13338 * Revert "update comment to reflect new defaults" This reverts commit 7a981abd69308e9d522ec94905f181439a1b1dba. * remove config.rs (from wrong merge) * upgrade to libp2p 0.51.2 * fix formatting * use handle_pending_outbound_connection in networt_state RPC * update deps * use re-exports when we use other libp2p packages * Apply suggestions from code review Co-authored-by: Dmitry Markin <dmitry@markin.tech> * format code * handle potential errors in network_state RPC * only update libp2p crate * update libp2p-core * fix docs * use libp2p-identity instead of libp2p where it's possible. libp2p-identity is much smaller, hence makes sense to use it instead of larger libp2p crate. * Update client/network/src/discovery.rs Co-authored-by: Aaro Altonen <48052676+altonen@users.noreply.github.com> * update Cargo.lock * add comment for per_connection_event_buffer_size current value is somewhat arbitrary and needs to be tweaked depending on memory usage and network worker sleep stats. * fix link format * update Cargo.lock * upgrade to libp2p 0.51.3 * deprecate mplex * Revert "deprecate mplex" This reverts commit 9e25820e706e464a0e962a8604861fcb2a7641eb. * Revert "upgrade to libp2p 0.51.3" This reverts commit 6544dd4138e2f89517bd7c7281fc78a638ec7040. * use new libp2p version in `statement` crate * pin version temporarily * libp2p 0.51.3 * deprecate mplex * deprecate legacy noise handshake * fix build error * update libp2p-identity * enable libp2p-identity:ed25519 feature in sc-consensus * enable ed25519 for peerset as well --------- Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Aaro Altonen <48052676+altonen@users.noreply.github.com> Co-authored-by: parity-processbot <>
This commit is contained in:
@@ -52,17 +52,19 @@ use crate::{
|
||||
ReputationChange,
|
||||
};
|
||||
|
||||
use either::Either;
|
||||
use futures::{channel::oneshot, prelude::*};
|
||||
#[allow(deprecated)]
|
||||
use libp2p::{
|
||||
core::{either::EitherError, upgrade, ConnectedPoint},
|
||||
connection_limits::Exceeded,
|
||||
core::{upgrade, ConnectedPoint, Endpoint},
|
||||
identify::Info as IdentifyInfo,
|
||||
kad::record::Key as KademliaKey,
|
||||
multiaddr,
|
||||
ping::Failure as PingFailure,
|
||||
swarm::{
|
||||
AddressScore, ConnectionError, ConnectionHandler, ConnectionLimits, DialError, Executor,
|
||||
IntoConnectionHandler, NetworkBehaviour, PendingConnectionError, Swarm, SwarmBuilder,
|
||||
SwarmEvent,
|
||||
AddressScore, ConnectionError, ConnectionId, ConnectionLimits, DialError, Executor,
|
||||
ListenError, NetworkBehaviour, Swarm, SwarmBuilder, SwarmEvent, THandlerErr,
|
||||
},
|
||||
Multiaddr, PeerId,
|
||||
};
|
||||
@@ -90,7 +92,7 @@ use std::{
|
||||
};
|
||||
|
||||
pub use behaviour::{InboundFailure, OutboundFailure, ResponseFailure};
|
||||
pub use libp2p::identity::{error::DecodingError, Keypair, PublicKey};
|
||||
pub use libp2p::identity::{DecodingError, Keypair, PublicKey};
|
||||
pub use protocol::NotificationsSink;
|
||||
|
||||
mod metrics;
|
||||
@@ -99,12 +101,6 @@ mod out_events;
|
||||
pub mod signature;
|
||||
pub mod traits;
|
||||
|
||||
/// Custom error that can be produced by the [`ConnectionHandler`] of the [`NetworkBehaviour`].
|
||||
/// Used as a template parameter of [`SwarmEvent`] below.
|
||||
type ConnectionHandlerErr<TBehaviour> =
|
||||
<<<TBehaviour as NetworkBehaviour>::ConnectionHandler as IntoConnectionHandler>
|
||||
::Handler as ConnectionHandler>::Error;
|
||||
|
||||
/// Substrate network service. Handles network IO and manages connectivity.
|
||||
pub struct NetworkService<B: BlockT + 'static, H: ExHashT> {
|
||||
/// Number of peers we're connected to.
|
||||
@@ -311,7 +307,7 @@ where
|
||||
format!("{} ({})", network_config.client_version, network_config.node_name);
|
||||
|
||||
let discovery_config = {
|
||||
let mut config = DiscoveryConfig::new(local_public.clone());
|
||||
let mut config = DiscoveryConfig::new(local_public.to_peer_id());
|
||||
config.with_permanent_addresses(known_addresses);
|
||||
config.discovery_limit(u64::from(network_config.default_peers_set.out_peers) + 15);
|
||||
config.with_kademlia(
|
||||
@@ -374,6 +370,7 @@ where
|
||||
SpawnImpl(params.executor),
|
||||
)
|
||||
};
|
||||
#[allow(deprecated)]
|
||||
let builder = builder
|
||||
.connection_limits(
|
||||
ConnectionLimits::default()
|
||||
@@ -384,7 +381,9 @@ where
|
||||
)
|
||||
.substream_upgrade_protocol_override(upgrade::Version::V1Lazy)
|
||||
.notify_handler_buffer_size(NonZeroUsize::new(32).expect("32 != 0; qed"))
|
||||
.connection_event_buffer_size(1024)
|
||||
// NOTE: 24 is somewhat arbitrary and should be tuned in the future if necessary.
|
||||
// See <https://github.com/paritytech/substrate/pull/6080>
|
||||
.per_connection_event_buffer_size(24)
|
||||
.max_negotiating_inbound_streams(2048);
|
||||
|
||||
(builder.build(), bandwidth)
|
||||
@@ -509,15 +508,23 @@ where
|
||||
pub fn network_state(&mut self) -> NetworkState {
|
||||
let swarm = &mut self.network_service;
|
||||
let open = swarm.behaviour_mut().user_protocol().open_peers().cloned().collect::<Vec<_>>();
|
||||
|
||||
let connected_peers = {
|
||||
let swarm = &mut *swarm;
|
||||
open.iter()
|
||||
.filter_map(move |peer_id| {
|
||||
let known_addresses =
|
||||
NetworkBehaviour::addresses_of_peer(swarm.behaviour_mut(), peer_id)
|
||||
.into_iter()
|
||||
.collect();
|
||||
let known_addresses = if let Ok(addrs) =
|
||||
NetworkBehaviour::handle_pending_outbound_connection(
|
||||
swarm.behaviour_mut(),
|
||||
ConnectionId::new_unchecked(0), // dummy value
|
||||
Some(*peer_id),
|
||||
&vec![],
|
||||
Endpoint::Listener,
|
||||
) {
|
||||
addrs.into_iter().collect()
|
||||
} else {
|
||||
error!(target: "sub-libp2p", "Was not able to get known addresses for {:?}", peer_id);
|
||||
return None
|
||||
};
|
||||
|
||||
let endpoint = if let Some(e) =
|
||||
swarm.behaviour_mut().node(peer_id).and_then(|i| i.endpoint())
|
||||
@@ -556,6 +563,20 @@ where
|
||||
.into_iter()
|
||||
.filter(|p| open.iter().all(|n| n != p))
|
||||
.map(move |peer_id| {
|
||||
let known_addresses = if let Ok(addrs) =
|
||||
NetworkBehaviour::handle_pending_outbound_connection(
|
||||
swarm.behaviour_mut(),
|
||||
ConnectionId::new_unchecked(0), // dummy value
|
||||
Some(peer_id),
|
||||
&vec![],
|
||||
Endpoint::Listener,
|
||||
) {
|
||||
addrs.into_iter().collect()
|
||||
} else {
|
||||
error!(target: "sub-libp2p", "Was not able to get known addresses for {:?}", peer_id);
|
||||
Default::default()
|
||||
};
|
||||
|
||||
(
|
||||
peer_id.to_base58(),
|
||||
NetworkStateNotConnectedPeer {
|
||||
@@ -567,12 +588,7 @@ where
|
||||
.behaviour_mut()
|
||||
.node(&peer_id)
|
||||
.and_then(|i| i.latest_ping()),
|
||||
known_addresses: NetworkBehaviour::addresses_of_peer(
|
||||
swarm.behaviour_mut(),
|
||||
&peer_id,
|
||||
)
|
||||
.into_iter()
|
||||
.collect(),
|
||||
known_addresses,
|
||||
},
|
||||
)
|
||||
})
|
||||
@@ -1340,10 +1356,7 @@ where
|
||||
}
|
||||
|
||||
/// Process the next event coming from `Swarm`.
|
||||
fn handle_swarm_event(
|
||||
&mut self,
|
||||
event: SwarmEvent<BehaviourOut, ConnectionHandlerErr<Behaviour<B>>>,
|
||||
) {
|
||||
fn handle_swarm_event(&mut self, event: SwarmEvent<BehaviourOut, THandlerErr<Behaviour<B>>>) {
|
||||
match event {
|
||||
SwarmEvent::Behaviour(BehaviourOut::InboundRequest { protocol, result, .. }) => {
|
||||
if let Some(metrics) = self.metrics.as_ref() {
|
||||
@@ -1572,6 +1585,7 @@ where
|
||||
endpoint,
|
||||
num_established,
|
||||
concurrent_dial_errors,
|
||||
..
|
||||
} => {
|
||||
if let Some(errors) = concurrent_dial_errors {
|
||||
debug!(target: "sub-libp2p", "Libp2p => Connected({:?}) with errors: {:?}", peer_id, errors);
|
||||
@@ -1600,11 +1614,11 @@ where
|
||||
};
|
||||
let reason = match cause {
|
||||
Some(ConnectionError::IO(_)) => "transport-error",
|
||||
Some(ConnectionError::Handler(EitherError::A(EitherError::A(
|
||||
EitherError::B(EitherError::A(PingFailure::Timeout)),
|
||||
Some(ConnectionError::Handler(Either::Left(Either::Left(
|
||||
Either::Right(Either::Left(PingFailure::Timeout)),
|
||||
)))) => "ping-timeout",
|
||||
Some(ConnectionError::Handler(EitherError::A(EitherError::A(
|
||||
EitherError::A(NotifsHandlerError::SyncNotificationsClogged),
|
||||
Some(ConnectionError::Handler(Either::Left(Either::Left(
|
||||
Either::Left(NotifsHandlerError::SyncNotificationsClogged),
|
||||
)))) => "sync-notifications-clogged",
|
||||
Some(ConnectionError::Handler(_)) => "protocol-error",
|
||||
Some(ConnectionError::KeepAliveTimeout) => "keep-alive-timeout",
|
||||
@@ -1653,16 +1667,22 @@ where
|
||||
}
|
||||
|
||||
if let Some(metrics) = self.metrics.as_ref() {
|
||||
#[allow(deprecated)]
|
||||
let reason = match error {
|
||||
DialError::Denied { cause } =>
|
||||
if cause.downcast::<Exceeded>().is_ok() {
|
||||
Some("limit-reached")
|
||||
} else {
|
||||
None
|
||||
},
|
||||
DialError::ConnectionLimit(_) => Some("limit-reached"),
|
||||
DialError::InvalidPeerId(_) => Some("invalid-peer-id"),
|
||||
DialError::Transport(_) | DialError::ConnectionIo(_) =>
|
||||
Some("transport-error"),
|
||||
DialError::InvalidPeerId(_) |
|
||||
DialError::WrongPeerId { .. } |
|
||||
DialError::LocalPeerId { .. } => Some("invalid-peer-id"),
|
||||
DialError::Transport(_) => Some("transport-error"),
|
||||
DialError::Banned |
|
||||
DialError::LocalPeerId |
|
||||
DialError::NoAddresses |
|
||||
DialError::DialPeerConditionFalse(_) |
|
||||
DialError::WrongPeerId { .. } |
|
||||
DialError::Aborted => None, // ignore them
|
||||
};
|
||||
if let Some(reason) = reason {
|
||||
@@ -1687,12 +1707,19 @@ where
|
||||
local_addr, send_back_addr, error,
|
||||
);
|
||||
if let Some(metrics) = self.metrics.as_ref() {
|
||||
#[allow(deprecated)]
|
||||
let reason = match error {
|
||||
PendingConnectionError::ConnectionLimit(_) => Some("limit-reached"),
|
||||
PendingConnectionError::WrongPeerId { .. } => Some("invalid-peer-id"),
|
||||
PendingConnectionError::Transport(_) | PendingConnectionError::IO(_) =>
|
||||
Some("transport-error"),
|
||||
PendingConnectionError::Aborted => None, // ignore it
|
||||
ListenError::Denied { cause } =>
|
||||
if cause.downcast::<Exceeded>().is_ok() {
|
||||
Some("limit-reached")
|
||||
} else {
|
||||
None
|
||||
},
|
||||
ListenError::ConnectionLimit(_) => Some("limit-reached"),
|
||||
ListenError::WrongPeerId { .. } | ListenError::LocalPeerId { .. } =>
|
||||
Some("invalid-peer-id"),
|
||||
ListenError::Transport(_) => Some("transport-error"),
|
||||
ListenError::Aborted => None, // ignore it
|
||||
};
|
||||
|
||||
if let Some(reason) = reason {
|
||||
@@ -1703,6 +1730,7 @@ where
|
||||
}
|
||||
}
|
||||
},
|
||||
#[allow(deprecated)]
|
||||
SwarmEvent::BannedPeer { peer_id, endpoint } => {
|
||||
debug!(
|
||||
target: "sub-libp2p",
|
||||
|
||||
Reference in New Issue
Block a user