mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 21:01:02 +00:00
chore: update libp2p to 0.52.1 (#14429)
* update libp2p to 0.52.0 * proto name now must implement `AsRef<str>` * update libp2p version everywhere * ToSwarm, FromBehaviour, ToBehaviour also LocalProtocolsChange and RemoteProtocolsChange * new NetworkBehaviour invariants * replace `Vec<u8>` with `StreamProtocol` * rename ConnectionHandlerEvent::Custom to NotifyBehaviour * remove DialError & ListenError invariants also fix pending_events * use connection_limits::Behaviour See https://github.com/libp2p/rust-libp2p/pull/3885 * impl `void::Void` for `BehaviourOut` also use `Behaviour::with_codec` * KademliaHandler no longer public * fix StreamProtocol construction * update libp2p-identify to 0.2.0 * remove non-existing methods from PollParameters rename ConnectionHandlerUpgrErr to StreamUpgradeError * `P2p` now contains `PeerId`, not `Multihash` * use multihash-codetable crate * update Cargo.lock * reformat text * comment out tests for now * remove `.into()` from P2p * confirm observed addr manually See https://github.com/libp2p/rust-libp2p/blob/master/protocols/identify/CHANGELOG.md#0430 * remove SwarmEvent::Banned since we're not using `ban_peer_id`, this can be safely removed. we may want to introduce `libp2p::allow_block_list` module in the future. * fix imports * replace `libp2p` with smaller deps in network-gossip * bring back tests * finish rewriting tests * uncomment handler tests * Revert "uncomment handler tests" This reverts commit 720a06815887f4e10767c62b58864a7ec3a48e50. * add a fixme * update Cargo.lock * remove extra From * make void uninhabited * fix discovery test * use autonat protocols confirming external addresses manually is unsafe in open networks * fix SyncNotificationsClogged invariant * only set server mode manually in tests doubt that we need to set it on node since we're adding public addresses * address @dmitry-markin comments * remove autonat * removed unused var * fix EOL * update smallvec and sha2 in attempt to compile polkadot * bump k256 in attempt to build cumulus --------- Co-authored-by: parity-processbot <>
This commit is contained in:
Generated
+269
-1202
File diff suppressed because it is too large
Load Diff
@@ -21,8 +21,8 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features =
|
|||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
futures-timer = "3.0.1"
|
futures-timer = "3.0.1"
|
||||||
ip_network = "0.4.1"
|
ip_network = "0.4.1"
|
||||||
libp2p = { version = "0.51.3", features = ["kad", "ed25519"] }
|
libp2p = { version = "0.52.1", features = ["kad", "ed25519"] }
|
||||||
multihash = { version = "0.17.0", default-features = false, features = ["std", "sha2"] }
|
multihash-codetable = { version = "0.1.0", features = ["sha2", "digest"] }
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
prost = "0.11"
|
prost = "0.11"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ fn get_addresses_and_authority_id() {
|
|||||||
let remote_addr = "/ip6/2001:db8:0:0:0:0:0:2/tcp/30333"
|
let remote_addr = "/ip6/2001:db8:0:0:0:0:0:2/tcp/30333"
|
||||||
.parse::<Multiaddr>()
|
.parse::<Multiaddr>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with(Protocol::P2p(remote_peer_id.into()));
|
.with(Protocol::P2p(remote_peer_id));
|
||||||
|
|
||||||
let test_api = Arc::new(TestApi { authorities: vec![] });
|
let test_api = Arc::new(TestApi { authorities: vec![] });
|
||||||
|
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ use futures::{channel::mpsc, future, stream::Fuse, FutureExt, Stream, StreamExt}
|
|||||||
use addr_cache::AddrCache;
|
use addr_cache::AddrCache;
|
||||||
use codec::{Decode, Encode};
|
use codec::{Decode, Encode};
|
||||||
use ip_network::IpNetwork;
|
use ip_network::IpNetwork;
|
||||||
use libp2p::{core::multiaddr, identity::PublicKey, multihash::Multihash, Multiaddr, PeerId};
|
use libp2p::{core::multiaddr, identity::PublicKey, Multiaddr};
|
||||||
use multihash::{Code, MultihashDigest};
|
use multihash_codetable::{Code, MultihashDigest};
|
||||||
|
|
||||||
use log::{debug, error, log_enabled};
|
use log::{debug, error, log_enabled};
|
||||||
use prometheus_endpoint::{register, Counter, CounterVec, Gauge, Opts, U64};
|
use prometheus_endpoint::{register, Counter, CounterVec, Gauge, Opts, U64};
|
||||||
@@ -304,7 +304,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn addresses_to_publish(&self) -> impl Iterator<Item = Multiaddr> {
|
fn addresses_to_publish(&self) -> impl Iterator<Item = Multiaddr> {
|
||||||
let peer_id: Multihash = self.network.local_peer_id().into();
|
let peer_id = self.network.local_peer_id();
|
||||||
let publish_non_global_ips = self.publish_non_global_ips;
|
let publish_non_global_ips = self.publish_non_global_ips;
|
||||||
self.network
|
self.network
|
||||||
.external_addresses()
|
.external_addresses()
|
||||||
@@ -529,7 +529,7 @@ where
|
|||||||
.map_err(Error::ParsingMultiaddress)?;
|
.map_err(Error::ParsingMultiaddress)?;
|
||||||
|
|
||||||
let get_peer_id = |a: &Multiaddr| match a.iter().last() {
|
let get_peer_id = |a: &Multiaddr| match a.iter().last() {
|
||||||
Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key).ok(),
|
Some(multiaddr::Protocol::P2p(peer_id)) => Some(peer_id),
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -162,8 +162,8 @@ impl AddrCache {
|
|||||||
|
|
||||||
fn peer_id_from_multiaddr(addr: &Multiaddr) -> Option<PeerId> {
|
fn peer_id_from_multiaddr(addr: &Multiaddr) -> Option<PeerId> {
|
||||||
addr.iter().last().and_then(|protocol| {
|
addr.iter().last().and_then(|protocol| {
|
||||||
if let Protocol::P2p(multihash) = protocol {
|
if let Protocol::P2p(peer_id) = protocol {
|
||||||
PeerId::from_multihash(multihash).ok()
|
Some(peer_id)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
@@ -178,7 +178,8 @@ fn addresses_to_peer_ids(addresses: &HashSet<Multiaddr>) -> HashSet<PeerId> {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
use libp2p::multihash::{self, Multihash};
|
use libp2p::multihash::Multihash;
|
||||||
|
use multihash_codetable::Code;
|
||||||
use quickcheck::{Arbitrary, Gen, QuickCheck, TestResult};
|
use quickcheck::{Arbitrary, Gen, QuickCheck, TestResult};
|
||||||
|
|
||||||
use sp_authority_discovery::{AuthorityId, AuthorityPair};
|
use sp_authority_discovery::{AuthorityId, AuthorityPair};
|
||||||
@@ -200,14 +201,13 @@ mod tests {
|
|||||||
impl Arbitrary for TestMultiaddr {
|
impl Arbitrary for TestMultiaddr {
|
||||||
fn arbitrary(g: &mut Gen) -> Self {
|
fn arbitrary(g: &mut Gen) -> Self {
|
||||||
let seed = (0..32).map(|_| u8::arbitrary(g)).collect::<Vec<_>>();
|
let seed = (0..32).map(|_| u8::arbitrary(g)).collect::<Vec<_>>();
|
||||||
let peer_id = PeerId::from_multihash(
|
let peer_id =
|
||||||
Multihash::wrap(multihash::Code::Sha2_256.into(), &seed).unwrap(),
|
PeerId::from_multihash(Multihash::wrap(Code::Sha2_256.into(), &seed).unwrap())
|
||||||
)
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let multiaddr = "/ip6/2001:db8:0:0:0:0:0:2/tcp/30333"
|
let multiaddr = "/ip6/2001:db8:0:0:0:0:0:2/tcp/30333"
|
||||||
.parse::<Multiaddr>()
|
.parse::<Multiaddr>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with(Protocol::P2p(peer_id.into()));
|
.with(Protocol::P2p(peer_id));
|
||||||
|
|
||||||
TestMultiaddr(multiaddr)
|
TestMultiaddr(multiaddr)
|
||||||
}
|
}
|
||||||
@@ -219,18 +219,17 @@ mod tests {
|
|||||||
impl Arbitrary for TestMultiaddrsSamePeerCombo {
|
impl Arbitrary for TestMultiaddrsSamePeerCombo {
|
||||||
fn arbitrary(g: &mut Gen) -> Self {
|
fn arbitrary(g: &mut Gen) -> Self {
|
||||||
let seed = (0..32).map(|_| u8::arbitrary(g)).collect::<Vec<_>>();
|
let seed = (0..32).map(|_| u8::arbitrary(g)).collect::<Vec<_>>();
|
||||||
let peer_id = PeerId::from_multihash(
|
let peer_id =
|
||||||
Multihash::wrap(multihash::Code::Sha2_256.into(), &seed).unwrap(),
|
PeerId::from_multihash(Multihash::wrap(Code::Sha2_256.into(), &seed).unwrap())
|
||||||
)
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let multiaddr1 = "/ip6/2001:db8:0:0:0:0:0:2/tcp/30333"
|
let multiaddr1 = "/ip6/2001:db8:0:0:0:0:0:2/tcp/30333"
|
||||||
.parse::<Multiaddr>()
|
.parse::<Multiaddr>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with(Protocol::P2p(peer_id.into()));
|
.with(Protocol::P2p(peer_id));
|
||||||
let multiaddr2 = "/ip6/2002:db8:0:0:0:0:0:2/tcp/30133"
|
let multiaddr2 = "/ip6/2002:db8:0:0:0:0:0:2/tcp/30133"
|
||||||
.parse::<Multiaddr>()
|
.parse::<Multiaddr>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with(Protocol::P2p(peer_id.into()));
|
.with(Protocol::P2p(peer_id));
|
||||||
TestMultiaddrsSamePeerCombo(multiaddr1, multiaddr2)
|
TestMultiaddrsSamePeerCombo(multiaddr1, multiaddr2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -367,7 +366,7 @@ mod tests {
|
|||||||
let mut addr_cache = AddrCache::new();
|
let mut addr_cache = AddrCache::new();
|
||||||
|
|
||||||
let peer_id = PeerId::random();
|
let peer_id = PeerId::random();
|
||||||
let addr = Multiaddr::empty().with(Protocol::P2p(peer_id.into()));
|
let addr = Multiaddr::empty().with(Protocol::P2p(peer_id));
|
||||||
|
|
||||||
let authority_id0 = AuthorityPair::generate().0.public();
|
let authority_id0 = AuthorityPair::generate().0.public();
|
||||||
let authority_id1 = AuthorityPair::generate().0.public();
|
let authority_id1 = AuthorityPair::generate().0.public();
|
||||||
|
|||||||
@@ -415,7 +415,7 @@ fn dont_stop_polling_dht_event_stream_after_bogus_event() {
|
|||||||
let peer_id = PeerId::random();
|
let peer_id = PeerId::random();
|
||||||
let address: Multiaddr = "/ip6/2001:db8:0:0:0:0:0:1/tcp/30333".parse().unwrap();
|
let address: Multiaddr = "/ip6/2001:db8:0:0:0:0:0:1/tcp/30333".parse().unwrap();
|
||||||
|
|
||||||
address.with(multiaddr::Protocol::P2p(peer_id.into()))
|
address.with(multiaddr::Protocol::P2p(peer_id))
|
||||||
};
|
};
|
||||||
let remote_key_store = MemoryKeystore::new();
|
let remote_key_store = MemoryKeystore::new();
|
||||||
let remote_public_key: AuthorityId = remote_key_store
|
let remote_public_key: AuthorityId = remote_key_store
|
||||||
@@ -526,7 +526,7 @@ impl DhtValueFoundTester {
|
|||||||
let address: Multiaddr =
|
let address: Multiaddr =
|
||||||
format!("/ip6/2001:db8:0:0:0:0:0:{:x}/tcp/30333", idx).parse().unwrap();
|
format!("/ip6/2001:db8:0:0:0:0:0:{:x}/tcp/30333", idx).parse().unwrap();
|
||||||
|
|
||||||
address.with(multiaddr::Protocol::P2p(peer_id.into()))
|
address.with(multiaddr::Protocol::P2p(peer_id))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process_value_found(
|
fn process_value_found(
|
||||||
@@ -749,7 +749,7 @@ fn lookup_throttling() {
|
|||||||
let peer_id = PeerId::random();
|
let peer_id = PeerId::random();
|
||||||
let address: Multiaddr = "/ip6/2001:db8:0:0:0:0:0:1/tcp/30333".parse().unwrap();
|
let address: Multiaddr = "/ip6/2001:db8:0:0:0:0:0:1/tcp/30333".parse().unwrap();
|
||||||
|
|
||||||
address.with(multiaddr::Protocol::P2p(peer_id.into()))
|
address.with(multiaddr::Protocol::P2p(peer_id))
|
||||||
};
|
};
|
||||||
let remote_key_store = MemoryKeystore::new();
|
let remote_key_store = MemoryKeystore::new();
|
||||||
let remote_public_keys: Vec<AuthorityId> = (0..20)
|
let remote_public_keys: Vec<AuthorityId> = (0..20)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ chrono = "0.4.10"
|
|||||||
clap = { version = "4.2.5", features = ["derive", "string"] }
|
clap = { version = "4.2.5", features = ["derive", "string"] }
|
||||||
fdlimit = "0.2.1"
|
fdlimit = "0.2.1"
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
libp2p-identity = { version = "0.1.2", features = ["peerid", "ed25519"]}
|
libp2p-identity = { version = "0.2.0", features = ["peerid", "ed25519"]}
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
names = { version = "0.13.0", default-features = false }
|
names = { version = "0.13.0", default-features = false }
|
||||||
parity-scale-codec = "3.6.1"
|
parity-scale-codec = "3.6.1"
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"]
|
|||||||
async-trait = "0.1.57"
|
async-trait = "0.1.57"
|
||||||
futures = { version = "0.3.21", features = ["thread-pool"] }
|
futures = { version = "0.3.21", features = ["thread-pool"] }
|
||||||
futures-timer = "3.0.1"
|
futures-timer = "3.0.1"
|
||||||
libp2p-identity = { version = "0.1.2", features = ["peerid", "ed25519"] }
|
libp2p-identity = { version = "0.2.0", features = ["peerid", "ed25519"] }
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
mockall = "0.11.3"
|
mockall = "0.11.3"
|
||||||
parking_lot = "0.12.1"
|
parking_lot = "0.12.1"
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"]
|
|||||||
ahash = "0.8.2"
|
ahash = "0.8.2"
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
futures-timer = "3.0.1"
|
futures-timer = "3.0.1"
|
||||||
libp2p = "0.51.3"
|
libp2p-identity = { version = "0.2.0", features = ["peerid", "ed25519"]}
|
||||||
|
multiaddr = "0.18.0"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
schnellru = "0.2.1"
|
schnellru = "0.2.1"
|
||||||
tracing = "0.1.29"
|
tracing = "0.1.29"
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ use futures::{
|
|||||||
channel::mpsc::{channel, Receiver, Sender},
|
channel::mpsc::{channel, Receiver, Sender},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
};
|
};
|
||||||
use libp2p::PeerId;
|
use libp2p_identity::PeerId;
|
||||||
use log::trace;
|
use log::trace;
|
||||||
use prometheus_endpoint::Registry;
|
use prometheus_endpoint::Registry;
|
||||||
use sp_runtime::traits::Block as BlockT;
|
use sp_runtime::traits::Block as BlockT;
|
||||||
@@ -330,12 +330,13 @@ impl<B: BlockT> futures::future::FusedFuture for GossipEngine<B> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::{multiaddr::Multiaddr, ValidationResult, ValidatorContext};
|
use crate::{ValidationResult, ValidatorContext};
|
||||||
use futures::{
|
use futures::{
|
||||||
channel::mpsc::{unbounded, UnboundedSender},
|
channel::mpsc::{unbounded, UnboundedSender},
|
||||||
executor::{block_on, block_on_stream},
|
executor::{block_on, block_on_stream},
|
||||||
future::poll_fn,
|
future::poll_fn,
|
||||||
};
|
};
|
||||||
|
use multiaddr::Multiaddr;
|
||||||
use quickcheck::{Arbitrary, Gen, QuickCheck};
|
use quickcheck::{Arbitrary, Gen, QuickCheck};
|
||||||
use sc_network::{
|
use sc_network::{
|
||||||
config::MultiaddrWithPeerId, NetworkBlock, NetworkEventStream, NetworkNotification,
|
config::MultiaddrWithPeerId, NetworkBlock, NetworkEventStream, NetworkNotification,
|
||||||
|
|||||||
@@ -67,7 +67,8 @@ pub use self::{
|
|||||||
validator::{DiscardAll, MessageIntent, ValidationResult, Validator, ValidatorContext},
|
validator::{DiscardAll, MessageIntent, ValidationResult, Validator, ValidatorContext},
|
||||||
};
|
};
|
||||||
|
|
||||||
use libp2p::{multiaddr, PeerId};
|
use libp2p_identity::PeerId;
|
||||||
|
use multiaddr::{Multiaddr, Protocol};
|
||||||
use sc_network::{
|
use sc_network::{
|
||||||
types::ProtocolName, NetworkBlock, NetworkEventStream, NetworkNotification, NetworkPeers,
|
types::ProtocolName, NetworkBlock, NetworkEventStream, NetworkNotification, NetworkPeers,
|
||||||
};
|
};
|
||||||
@@ -82,8 +83,7 @@ mod validator;
|
|||||||
/// Abstraction over a network.
|
/// Abstraction over a network.
|
||||||
pub trait Network<B: BlockT>: NetworkPeers + NetworkEventStream + NetworkNotification {
|
pub trait Network<B: BlockT>: NetworkPeers + NetworkEventStream + NetworkNotification {
|
||||||
fn add_set_reserved(&self, who: PeerId, protocol: ProtocolName) {
|
fn add_set_reserved(&self, who: PeerId, protocol: ProtocolName) {
|
||||||
let addr =
|
let addr = Multiaddr::empty().with(Protocol::P2p(who));
|
||||||
iter::once(multiaddr::Protocol::P2p(who.into())).collect::<multiaddr::Multiaddr>();
|
|
||||||
let result = self.add_peers_to_reserved_set(protocol, iter::once(addr).collect());
|
let result = self.add_peers_to_reserved_set(protocol, iter::once(addr).collect());
|
||||||
if let Err(err) = result {
|
if let Err(err) = result {
|
||||||
log::error!(target: "gossip", "add_set_reserved failed: {}", err);
|
log::error!(target: "gossip", "add_set_reserved failed: {}", err);
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
use crate::{MessageIntent, Network, ValidationResult, Validator, ValidatorContext};
|
use crate::{MessageIntent, Network, ValidationResult, Validator, ValidatorContext};
|
||||||
|
|
||||||
use ahash::AHashSet;
|
use ahash::AHashSet;
|
||||||
use libp2p::PeerId;
|
use libp2p_identity::PeerId;
|
||||||
use schnellru::{ByLength, LruMap};
|
use schnellru::{ByLength, LruMap};
|
||||||
|
|
||||||
use prometheus_endpoint::{register, Counter, PrometheusError, Registry, U64};
|
use prometheus_endpoint::{register, Counter, PrometheusError, Registry, U64};
|
||||||
@@ -521,8 +521,8 @@ impl Metrics {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::multiaddr::Multiaddr;
|
|
||||||
use futures::prelude::*;
|
use futures::prelude::*;
|
||||||
|
use multiaddr::Multiaddr;
|
||||||
use sc_network::{
|
use sc_network::{
|
||||||
config::MultiaddrWithPeerId, event::Event, NetworkBlock, NetworkEventStream,
|
config::MultiaddrWithPeerId, event::Event, NetworkBlock, NetworkEventStream,
|
||||||
NetworkNotification, NetworkPeers, NotificationSenderError,
|
NetworkNotification, NetworkPeers, NotificationSenderError,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use libp2p::PeerId;
|
use libp2p_identity::PeerId;
|
||||||
use sc_network_common::role::ObservedRole;
|
use sc_network_common::role::ObservedRole;
|
||||||
use sp_runtime::traits::Block as BlockT;
|
use sp_runtime::traits::Block as BlockT;
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ fnv = "1.0.6"
|
|||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
futures-timer = "3.0.2"
|
futures-timer = "3.0.2"
|
||||||
ip_network = "0.4.1"
|
ip_network = "0.4.1"
|
||||||
libp2p = { version = "0.51.3", features = ["dns", "identify", "kad", "macros", "mdns", "noise", "ping", "tcp", "tokio", "yamux", "websocket", "request-response"] }
|
libp2p = { version = "0.52.1", features = ["dns", "identify", "kad", "macros", "mdns", "noise", "ping", "tcp", "tokio", "yamux", "websocket", "request-response"] }
|
||||||
|
libp2p-kad = { version = "0.44.2" }
|
||||||
linked_hash_set = "0.1.3"
|
linked_hash_set = "0.1.3"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
mockall = "0.11.3"
|
mockall = "0.11.3"
|
||||||
@@ -35,9 +36,10 @@ pin-project = "1.0.12"
|
|||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
serde = { version = "1.0.163", features = ["derive"] }
|
serde = { version = "1.0.163", features = ["derive"] }
|
||||||
serde_json = "1.0.85"
|
serde_json = "1.0.85"
|
||||||
smallvec = "1.8.0"
|
smallvec = "1.11.0"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
unsigned-varint = { version = "0.7.1", features = ["futures", "asynchronous_codec"] }
|
unsigned-varint = { version = "0.7.1", features = ["futures", "asynchronous_codec"] }
|
||||||
|
void = "1"
|
||||||
zeroize = "1.4.3"
|
zeroize = "1.4.3"
|
||||||
prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../utils/prometheus" }
|
prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../utils/prometheus" }
|
||||||
sc-client-api = { version = "4.0.0-dev", path = "../api" }
|
sc-client-api = { version = "4.0.0-dev", path = "../api" }
|
||||||
@@ -52,7 +54,7 @@ wasm-timer = "0.2"
|
|||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_matches = "1.3"
|
assert_matches = "1.3"
|
||||||
mockall = "0.11.3"
|
mockall = "0.11.3"
|
||||||
multistream-select = "0.12.1"
|
multistream-select = "0.13.0"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
tempfile = "3.1.0"
|
tempfile = "3.1.0"
|
||||||
tokio = { version = "1.22.0", features = ["macros"] }
|
tokio = { version = "1.22.0", features = ["macros"] }
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ prost-build = "0.11"
|
|||||||
async-channel = "1.8.0"
|
async-channel = "1.8.0"
|
||||||
cid = "0.9.0"
|
cid = "0.9.0"
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
libp2p-identity = { version = "0.1.2", features = ["peerid"] }
|
libp2p-identity = { version = "0.2.0", features = ["peerid"] }
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
prost = "0.11"
|
prost = "0.11"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", features = [
|
|||||||
"derive",
|
"derive",
|
||||||
] }
|
] }
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
libp2p-identity = { version = "0.1.2", features = ["peerid"] }
|
libp2p-identity = { version = "0.2.0", features = ["peerid"] }
|
||||||
sc-consensus = { version = "0.10.0-dev", path = "../../consensus/common" }
|
sc-consensus = { version = "0.10.0-dev", path = "../../consensus/common" }
|
||||||
sp-consensus = { version = "0.10.0-dev", path = "../../../primitives/consensus/common" }
|
sp-consensus = { version = "0.10.0-dev", path = "../../../primitives/consensus/common" }
|
||||||
sp-consensus-grandpa = { version = "4.0.0-dev", path = "../../../primitives/consensus/grandpa" }
|
sp-consensus-grandpa = { version = "4.0.0-dev", path = "../../../primitives/consensus/grandpa" }
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", features = [
|
|||||||
"derive",
|
"derive",
|
||||||
] }
|
] }
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
libp2p-identity = { version = "0.1.2", features = ["peerid"] }
|
libp2p-identity = { version = "0.2.0", features = ["peerid"] }
|
||||||
log = "0.4.16"
|
log = "0.4.16"
|
||||||
prost = "0.11"
|
prost = "0.11"
|
||||||
sp-blockchain = { version = "4.0.0-dev", path = "../../../primitives/blockchain" }
|
sp-blockchain = { version = "4.0.0-dev", path = "../../../primitives/blockchain" }
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ use crate::{
|
|||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use futures::channel::oneshot;
|
use futures::channel::oneshot;
|
||||||
use libp2p::{
|
use libp2p::{
|
||||||
core::Multiaddr, identify::Info as IdentifyInfo, identity::PublicKey, kad::RecordKey,
|
connection_limits::ConnectionLimits, core::Multiaddr, identify::Info as IdentifyInfo,
|
||||||
swarm::NetworkBehaviour, PeerId,
|
identity::PublicKey, kad::RecordKey, swarm::NetworkBehaviour, PeerId,
|
||||||
};
|
};
|
||||||
|
|
||||||
use sc_network_common::role::{ObservedRole, Roles};
|
use sc_network_common::role::{ObservedRole, Roles};
|
||||||
@@ -42,7 +42,7 @@ pub use crate::request_responses::{InboundFailure, OutboundFailure, RequestId, R
|
|||||||
|
|
||||||
/// General behaviour of the network. Combines all protocols together.
|
/// General behaviour of the network. Combines all protocols together.
|
||||||
#[derive(NetworkBehaviour)]
|
#[derive(NetworkBehaviour)]
|
||||||
#[behaviour(out_event = "BehaviourOut")]
|
#[behaviour(to_swarm = "BehaviourOut")]
|
||||||
pub struct Behaviour<B: BlockT> {
|
pub struct Behaviour<B: BlockT> {
|
||||||
/// All the substrate-specific protocols.
|
/// All the substrate-specific protocols.
|
||||||
substrate: Protocol<B>,
|
substrate: Protocol<B>,
|
||||||
@@ -51,6 +51,8 @@ pub struct Behaviour<B: BlockT> {
|
|||||||
peer_info: peer_info::PeerInfoBehaviour,
|
peer_info: peer_info::PeerInfoBehaviour,
|
||||||
/// Discovers nodes of the network.
|
/// Discovers nodes of the network.
|
||||||
discovery: DiscoveryBehaviour,
|
discovery: DiscoveryBehaviour,
|
||||||
|
/// Connection limits.
|
||||||
|
connection_limits: libp2p::connection_limits::Behaviour,
|
||||||
/// Generic request-response protocols.
|
/// Generic request-response protocols.
|
||||||
request_responses: request_responses::RequestResponsesBehaviour,
|
request_responses: request_responses::RequestResponsesBehaviour,
|
||||||
}
|
}
|
||||||
@@ -171,11 +173,13 @@ impl<B: BlockT> Behaviour<B> {
|
|||||||
disco_config: DiscoveryConfig,
|
disco_config: DiscoveryConfig,
|
||||||
request_response_protocols: Vec<ProtocolConfig>,
|
request_response_protocols: Vec<ProtocolConfig>,
|
||||||
peerset: PeersetHandle,
|
peerset: PeersetHandle,
|
||||||
|
connection_limits: ConnectionLimits,
|
||||||
) -> Result<Self, request_responses::RegisterError> {
|
) -> Result<Self, request_responses::RegisterError> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
substrate,
|
substrate,
|
||||||
peer_info: peer_info::PeerInfoBehaviour::new(user_agent, local_public_key),
|
peer_info: peer_info::PeerInfoBehaviour::new(user_agent, local_public_key),
|
||||||
discovery: disco_config.finish(),
|
discovery: disco_config.finish(),
|
||||||
|
connection_limits: libp2p::connection_limits::Behaviour::new(connection_limits),
|
||||||
request_responses: request_responses::RequestResponsesBehaviour::new(
|
request_responses: request_responses::RequestResponsesBehaviour::new(
|
||||||
request_response_protocols.into_iter(),
|
request_response_protocols.into_iter(),
|
||||||
peerset,
|
peerset,
|
||||||
@@ -247,7 +251,7 @@ impl<B: BlockT> Behaviour<B> {
|
|||||||
pub fn add_self_reported_address_to_dht(
|
pub fn add_self_reported_address_to_dht(
|
||||||
&mut self,
|
&mut self,
|
||||||
peer_id: &PeerId,
|
peer_id: &PeerId,
|
||||||
supported_protocols: &[impl AsRef<[u8]>],
|
supported_protocols: &[impl AsRef<str>],
|
||||||
addr: Multiaddr,
|
addr: Multiaddr,
|
||||||
) {
|
) {
|
||||||
self.discovery.add_self_reported_address(peer_id, supported_protocols, addr);
|
self.discovery.add_self_reported_address(peer_id, supported_protocols, addr);
|
||||||
@@ -351,3 +355,9 @@ impl From<DiscoveryOut> for BehaviourOut {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<void::Void> for BehaviourOut {
|
||||||
|
fn from(e: void::Void) -> Self {
|
||||||
|
void::unreachable(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -109,8 +109,7 @@ pub fn parse_str_addr(addr_str: &str) -> Result<(PeerId, Multiaddr), ParseErr> {
|
|||||||
/// Splits a Multiaddress into a Multiaddress and PeerId.
|
/// Splits a Multiaddress into a Multiaddress and PeerId.
|
||||||
pub fn parse_addr(mut addr: Multiaddr) -> Result<(PeerId, Multiaddr), ParseErr> {
|
pub fn parse_addr(mut addr: Multiaddr) -> Result<(PeerId, Multiaddr), ParseErr> {
|
||||||
let who = match addr.pop() {
|
let who = match addr.pop() {
|
||||||
Some(multiaddr::Protocol::P2p(key)) =>
|
Some(multiaddr::Protocol::P2p(peer_id)) => peer_id,
|
||||||
PeerId::from_multihash(key).map_err(|_| ParseErr::InvalidPeerId)?,
|
|
||||||
_ => return Err(ParseErr::PeerIdMissing),
|
_ => return Err(ParseErr::PeerIdMissing),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -143,7 +142,7 @@ pub struct MultiaddrWithPeerId {
|
|||||||
impl MultiaddrWithPeerId {
|
impl MultiaddrWithPeerId {
|
||||||
/// Concatenates the multiaddress and peer ID into one multiaddress containing both.
|
/// Concatenates the multiaddress and peer ID into one multiaddress containing both.
|
||||||
pub fn concat(&self) -> Multiaddr {
|
pub fn concat(&self) -> Multiaddr {
|
||||||
let proto = multiaddr::Protocol::P2p(From::from(self.peer_id));
|
let proto = multiaddr::Protocol::P2p(self.peer_id);
|
||||||
self.multiaddr.clone().with(proto)
|
self.multiaddr.clone().with(proto)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,8 +180,6 @@ impl TryFrom<String> for MultiaddrWithPeerId {
|
|||||||
pub enum ParseErr {
|
pub enum ParseErr {
|
||||||
/// Error while parsing the multiaddress.
|
/// Error while parsing the multiaddress.
|
||||||
MultiaddrParse(multiaddr::Error),
|
MultiaddrParse(multiaddr::Error),
|
||||||
/// Multihash of the peer ID is invalid.
|
|
||||||
InvalidPeerId,
|
|
||||||
/// The peer ID is missing from the address.
|
/// The peer ID is missing from the address.
|
||||||
PeerIdMissing,
|
PeerIdMissing,
|
||||||
}
|
}
|
||||||
@@ -191,7 +188,6 @@ impl fmt::Display for ParseErr {
|
|||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
Self::MultiaddrParse(err) => write!(f, "{}", err),
|
Self::MultiaddrParse(err) => write!(f, "{}", err),
|
||||||
Self::InvalidPeerId => write!(f, "Peer id at the end of the address is invalid"),
|
|
||||||
Self::PeerIdMissing => write!(f, "Peer id is missing from the address"),
|
Self::PeerIdMissing => write!(f, "Peer id is missing from the address"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,7 +197,6 @@ impl std::error::Error for ParseErr {
|
|||||||
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
|
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
|
||||||
match self {
|
match self {
|
||||||
Self::MultiaddrParse(err) => Some(err),
|
Self::MultiaddrParse(err) => Some(err),
|
||||||
Self::InvalidPeerId => None,
|
|
||||||
Self::PeerIdMissing => None,
|
Self::PeerIdMissing => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ use ip_network::IpNetwork;
|
|||||||
use libp2p::{
|
use libp2p::{
|
||||||
core::{Endpoint, Multiaddr},
|
core::{Endpoint, Multiaddr},
|
||||||
kad::{
|
kad::{
|
||||||
handler::KademliaHandler,
|
|
||||||
record::store::{MemoryStore, RecordStore},
|
record::store::{MemoryStore, RecordStore},
|
||||||
GetClosestPeersError, GetRecordOk, Kademlia, KademliaBucketInserts, KademliaConfig,
|
GetClosestPeersError, GetRecordOk, Kademlia, KademliaBucketInserts, KademliaConfig,
|
||||||
KademliaEvent, QueryId, QueryResult, Quorum, Record, RecordKey,
|
KademliaEvent, QueryId, QueryResult, Quorum, Record, RecordKey,
|
||||||
@@ -65,10 +64,10 @@ use libp2p::{
|
|||||||
swarm::{
|
swarm::{
|
||||||
behaviour::{
|
behaviour::{
|
||||||
toggle::{Toggle, ToggleConnectionHandler},
|
toggle::{Toggle, ToggleConnectionHandler},
|
||||||
DialFailure, FromSwarm, NewExternalAddr,
|
DialFailure, ExternalAddrConfirmed, FromSwarm,
|
||||||
},
|
},
|
||||||
ConnectionDenied, ConnectionId, DialError, NetworkBehaviour, PollParameters, THandler,
|
ConnectionDenied, ConnectionId, DialError, NetworkBehaviour, PollParameters,
|
||||||
THandlerInEvent, THandlerOutEvent, ToSwarm,
|
StreamProtocol, THandler, THandlerInEvent, THandlerOutEvent, ToSwarm,
|
||||||
},
|
},
|
||||||
PeerId,
|
PeerId,
|
||||||
};
|
};
|
||||||
@@ -104,7 +103,7 @@ pub struct DiscoveryConfig {
|
|||||||
discovery_only_if_under_num: u64,
|
discovery_only_if_under_num: u64,
|
||||||
enable_mdns: bool,
|
enable_mdns: bool,
|
||||||
kademlia_disjoint_query_paths: bool,
|
kademlia_disjoint_query_paths: bool,
|
||||||
kademlia_protocols: Vec<Vec<u8>>,
|
kademlia_protocols: Vec<StreamProtocol>,
|
||||||
kademlia_replication_factor: NonZeroUsize,
|
kademlia_replication_factor: NonZeroUsize,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,7 +352,7 @@ impl DiscoveryBehaviour {
|
|||||||
pub fn add_self_reported_address(
|
pub fn add_self_reported_address(
|
||||||
&mut self,
|
&mut self,
|
||||||
peer_id: &PeerId,
|
peer_id: &PeerId,
|
||||||
supported_protocols: &[impl AsRef<[u8]>],
|
supported_protocols: &[impl AsRef<str>],
|
||||||
addr: Multiaddr,
|
addr: Multiaddr,
|
||||||
) {
|
) {
|
||||||
if let Some(kademlia) = self.kademlia.as_mut() {
|
if let Some(kademlia) = self.kademlia.as_mut() {
|
||||||
@@ -372,7 +371,7 @@ impl DiscoveryBehaviour {
|
|||||||
trace!(
|
trace!(
|
||||||
target: "sub-libp2p",
|
target: "sub-libp2p",
|
||||||
"Adding self-reported address {} from {} to Kademlia DHT {}.",
|
"Adding self-reported address {} from {} to Kademlia DHT {}.",
|
||||||
addr, peer_id, String::from_utf8_lossy(matching_protocol.as_ref()),
|
addr, peer_id, matching_protocol.as_ref(),
|
||||||
);
|
);
|
||||||
kademlia.add_address(peer_id, addr.clone());
|
kademlia.add_address(peer_id, addr.clone());
|
||||||
} else {
|
} else {
|
||||||
@@ -498,8 +497,9 @@ pub enum DiscoveryOut {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl NetworkBehaviour for DiscoveryBehaviour {
|
impl NetworkBehaviour for DiscoveryBehaviour {
|
||||||
type ConnectionHandler = ToggleConnectionHandler<KademliaHandler<QueryId>>;
|
type ConnectionHandler =
|
||||||
type OutEvent = DiscoveryOut;
|
ToggleConnectionHandler<<Kademlia<MemoryStore> as NetworkBehaviour>::ConnectionHandler>;
|
||||||
|
type ToSwarm = DiscoveryOut;
|
||||||
|
|
||||||
fn handle_established_inbound_connection(
|
fn handle_established_inbound_connection(
|
||||||
&mut self,
|
&mut self,
|
||||||
@@ -629,11 +629,11 @@ impl NetworkBehaviour for DiscoveryBehaviour {
|
|||||||
FromSwarm::ListenerError(e) => {
|
FromSwarm::ListenerError(e) => {
|
||||||
self.kademlia.on_swarm_event(FromSwarm::ListenerError(e));
|
self.kademlia.on_swarm_event(FromSwarm::ListenerError(e));
|
||||||
},
|
},
|
||||||
FromSwarm::ExpiredExternalAddr(e) => {
|
FromSwarm::ExternalAddrExpired(e) => {
|
||||||
// We intentionally don't remove the element from `known_external_addresses` in
|
// We intentionally don't remove the element from `known_external_addresses` in
|
||||||
// order to not print the log line again.
|
// order to not print the log line again.
|
||||||
|
|
||||||
self.kademlia.on_swarm_event(FromSwarm::ExpiredExternalAddr(e));
|
self.kademlia.on_swarm_event(FromSwarm::ExternalAddrExpired(e));
|
||||||
},
|
},
|
||||||
FromSwarm::NewListener(e) => {
|
FromSwarm::NewListener(e) => {
|
||||||
self.kademlia.on_swarm_event(FromSwarm::NewListener(e));
|
self.kademlia.on_swarm_event(FromSwarm::NewListener(e));
|
||||||
@@ -641,8 +641,21 @@ impl NetworkBehaviour for DiscoveryBehaviour {
|
|||||||
FromSwarm::ExpiredListenAddr(e) => {
|
FromSwarm::ExpiredListenAddr(e) => {
|
||||||
self.kademlia.on_swarm_event(FromSwarm::ExpiredListenAddr(e));
|
self.kademlia.on_swarm_event(FromSwarm::ExpiredListenAddr(e));
|
||||||
},
|
},
|
||||||
FromSwarm::NewExternalAddr(e @ NewExternalAddr { addr }) => {
|
FromSwarm::NewExternalAddrCandidate(e) => {
|
||||||
let new_addr = addr.clone().with(Protocol::P2p(self.local_peer_id.into()));
|
self.kademlia.on_swarm_event(FromSwarm::NewExternalAddrCandidate(e));
|
||||||
|
},
|
||||||
|
FromSwarm::AddressChange(e) => {
|
||||||
|
self.kademlia.on_swarm_event(FromSwarm::AddressChange(e));
|
||||||
|
},
|
||||||
|
FromSwarm::NewListenAddr(e) => {
|
||||||
|
self.kademlia.on_swarm_event(FromSwarm::NewListenAddr(e));
|
||||||
|
|
||||||
|
if let Some(ref mut mdns) = self.mdns {
|
||||||
|
mdns.on_swarm_event(FromSwarm::NewListenAddr(e));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
FromSwarm::ExternalAddrConfirmed(e @ ExternalAddrConfirmed { addr }) => {
|
||||||
|
let new_addr = addr.clone().with(Protocol::P2p(self.local_peer_id));
|
||||||
|
|
||||||
if Self::can_add_to_dht(addr) {
|
if Self::can_add_to_dht(addr) {
|
||||||
// NOTE: we might re-discover the same address multiple times
|
// NOTE: we might re-discover the same address multiple times
|
||||||
@@ -656,17 +669,7 @@ impl NetworkBehaviour for DiscoveryBehaviour {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.kademlia.on_swarm_event(FromSwarm::NewExternalAddr(e));
|
self.kademlia.on_swarm_event(FromSwarm::ExternalAddrConfirmed(e));
|
||||||
},
|
|
||||||
FromSwarm::AddressChange(e) => {
|
|
||||||
self.kademlia.on_swarm_event(FromSwarm::AddressChange(e));
|
|
||||||
},
|
|
||||||
FromSwarm::NewListenAddr(e) => {
|
|
||||||
self.kademlia.on_swarm_event(FromSwarm::NewListenAddr(e));
|
|
||||||
|
|
||||||
if let Some(ref mut mdns) = self.mdns {
|
|
||||||
mdns.on_swarm_event(FromSwarm::NewListenAddr(e));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -684,7 +687,7 @@ impl NetworkBehaviour for DiscoveryBehaviour {
|
|||||||
&mut self,
|
&mut self,
|
||||||
cx: &mut Context,
|
cx: &mut Context,
|
||||||
params: &mut impl PollParameters,
|
params: &mut impl PollParameters,
|
||||||
) -> Poll<ToSwarm<Self::OutEvent, THandlerInEvent<Self>>> {
|
) -> Poll<ToSwarm<Self::ToSwarm, THandlerInEvent<Self>>> {
|
||||||
// Immediately process the content of `discovered`.
|
// Immediately process the content of `discovered`.
|
||||||
if let Some(ev) = self.pending_events.pop_front() {
|
if let Some(ev) = self.pending_events.pop_front() {
|
||||||
return Poll::Ready(ToSwarm::GenerateEvent(ev))
|
return Poll::Ready(ToSwarm::GenerateEvent(ev))
|
||||||
@@ -895,10 +898,17 @@ impl NetworkBehaviour for DiscoveryBehaviour {
|
|||||||
ToSwarm::Dial { opts } => return Poll::Ready(ToSwarm::Dial { opts }),
|
ToSwarm::Dial { opts } => return Poll::Ready(ToSwarm::Dial { opts }),
|
||||||
ToSwarm::NotifyHandler { peer_id, handler, event } =>
|
ToSwarm::NotifyHandler { peer_id, handler, event } =>
|
||||||
return Poll::Ready(ToSwarm::NotifyHandler { peer_id, handler, event }),
|
return Poll::Ready(ToSwarm::NotifyHandler { peer_id, handler, event }),
|
||||||
ToSwarm::ReportObservedAddr { address, score } =>
|
|
||||||
return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }),
|
|
||||||
ToSwarm::CloseConnection { peer_id, connection } =>
|
ToSwarm::CloseConnection { peer_id, connection } =>
|
||||||
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
||||||
|
ToSwarm::NewExternalAddrCandidate(observed) =>
|
||||||
|
return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)),
|
||||||
|
ToSwarm::ExternalAddrConfirmed(addr) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)),
|
||||||
|
ToSwarm::ExternalAddrExpired(addr) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)),
|
||||||
|
ToSwarm::ListenOn { opts } => return Poll::Ready(ToSwarm::ListenOn { opts }),
|
||||||
|
ToSwarm::RemoveListener { id } =>
|
||||||
|
return Poll::Ready(ToSwarm::RemoveListener { id }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -912,8 +922,10 @@ impl NetworkBehaviour for DiscoveryBehaviour {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
self.pending_events
|
self.pending_events.extend(
|
||||||
.extend(list.map(|(peer_id, _)| DiscoveryOut::Discovered(peer_id)));
|
list.into_iter()
|
||||||
|
.map(|(peer_id, _)| DiscoveryOut::Discovered(peer_id)),
|
||||||
|
);
|
||||||
if let Some(ev) = self.pending_events.pop_front() {
|
if let Some(ev) = self.pending_events.pop_front() {
|
||||||
return Poll::Ready(ToSwarm::GenerateEvent(ev))
|
return Poll::Ready(ToSwarm::GenerateEvent(ev))
|
||||||
}
|
}
|
||||||
@@ -926,10 +938,17 @@ impl NetworkBehaviour for DiscoveryBehaviour {
|
|||||||
ToSwarm::NotifyHandler { event, .. } => match event {}, /* `event` is an */
|
ToSwarm::NotifyHandler { event, .. } => match event {}, /* `event` is an */
|
||||||
// enum with no
|
// enum with no
|
||||||
// variant
|
// variant
|
||||||
ToSwarm::ReportObservedAddr { address, score } =>
|
|
||||||
return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }),
|
|
||||||
ToSwarm::CloseConnection { peer_id, connection } =>
|
ToSwarm::CloseConnection { peer_id, connection } =>
|
||||||
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
||||||
|
ToSwarm::NewExternalAddrCandidate(observed) =>
|
||||||
|
return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)),
|
||||||
|
ToSwarm::ExternalAddrConfirmed(addr) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)),
|
||||||
|
ToSwarm::ExternalAddrExpired(addr) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)),
|
||||||
|
ToSwarm::ListenOn { opts } => return Poll::Ready(ToSwarm::ListenOn { opts }),
|
||||||
|
ToSwarm::RemoveListener { id } =>
|
||||||
|
return Poll::Ready(ToSwarm::RemoveListener { id }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -939,21 +958,23 @@ impl NetworkBehaviour for DiscoveryBehaviour {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Legacy (fallback) Kademlia protocol name based on `protocol_id`.
|
/// Legacy (fallback) Kademlia protocol name based on `protocol_id`.
|
||||||
fn legacy_kademlia_protocol_name(id: &ProtocolId) -> Vec<u8> {
|
fn legacy_kademlia_protocol_name(id: &ProtocolId) -> StreamProtocol {
|
||||||
let mut v = vec![b'/'];
|
let name = format!("/{}/kad", id.as_ref());
|
||||||
v.extend_from_slice(id.as_ref().as_bytes());
|
StreamProtocol::try_from_owned(name).expect("protocol name is valid. qed")
|
||||||
v.extend_from_slice(b"/kad");
|
|
||||||
v
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Kademlia protocol name based on `genesis_hash` and `fork_id`.
|
/// Kademlia protocol name based on `genesis_hash` and `fork_id`.
|
||||||
fn kademlia_protocol_name<Hash: AsRef<[u8]>>(genesis_hash: Hash, fork_id: Option<&str>) -> Vec<u8> {
|
fn kademlia_protocol_name<Hash: AsRef<[u8]>>(
|
||||||
|
genesis_hash: Hash,
|
||||||
|
fork_id: Option<&str>,
|
||||||
|
) -> StreamProtocol {
|
||||||
let genesis_hash_hex = bytes2hex("", genesis_hash.as_ref());
|
let genesis_hash_hex = bytes2hex("", genesis_hash.as_ref());
|
||||||
if let Some(fork_id) = fork_id {
|
let name = if let Some(fork_id) = fork_id {
|
||||||
format!("/{}/{}/kad", genesis_hash_hex, fork_id).as_bytes().into()
|
format!("/{}/{}/kad", genesis_hash_hex, fork_id)
|
||||||
} else {
|
} else {
|
||||||
format!("/{}/kad", genesis_hash_hex).as_bytes().into()
|
format!("/{}/kad", genesis_hash_hex)
|
||||||
}
|
};
|
||||||
|
StreamProtocol::try_from_owned(name).expect("protocol name is valid. qed")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -969,7 +990,7 @@ mod tests {
|
|||||||
upgrade,
|
upgrade,
|
||||||
},
|
},
|
||||||
identity::Keypair,
|
identity::Keypair,
|
||||||
noise,
|
kad, noise,
|
||||||
swarm::{Executor, Swarm, SwarmBuilder, SwarmEvent},
|
swarm::{Executor, Swarm, SwarmBuilder, SwarmEvent},
|
||||||
yamux, Multiaddr,
|
yamux, Multiaddr,
|
||||||
};
|
};
|
||||||
@@ -1023,6 +1044,18 @@ mod tests {
|
|||||||
TokioExecutor(runtime),
|
TokioExecutor(runtime),
|
||||||
)
|
)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
// Set the Kademlia mode to server so that it can accept incoming requests.
|
||||||
|
//
|
||||||
|
// Note: the server mode is set automatically when the node learns its external
|
||||||
|
// address, but that does not happen in tests => hence we set it manually.
|
||||||
|
swarm
|
||||||
|
.behaviour_mut()
|
||||||
|
.kademlia
|
||||||
|
.as_mut()
|
||||||
|
.unwrap()
|
||||||
|
.set_mode(Some(kad::Mode::Server));
|
||||||
|
|
||||||
let listen_addr: Multiaddr =
|
let listen_addr: Multiaddr =
|
||||||
format!("/memory/{}", rand::random::<u64>()).parse().unwrap();
|
format!("/memory/{}", rand::random::<u64>()).parse().unwrap();
|
||||||
|
|
||||||
@@ -1083,7 +1116,7 @@ mod tests {
|
|||||||
.add_self_reported_address(
|
.add_self_reported_address(
|
||||||
&other,
|
&other,
|
||||||
&[protocol_name],
|
&[protocol_name],
|
||||||
addr,
|
addr.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
to_discover[swarm_n].remove(&other);
|
to_discover[swarm_n].remove(&other);
|
||||||
|
|||||||
@@ -31,13 +31,13 @@ use libp2p::{
|
|||||||
Info as IdentifyInfo,
|
Info as IdentifyInfo,
|
||||||
},
|
},
|
||||||
identity::PublicKey,
|
identity::PublicKey,
|
||||||
ping::{Behaviour as Ping, Config as PingConfig, Event as PingEvent, Success as PingSuccess},
|
ping::{Behaviour as Ping, Config as PingConfig, Event as PingEvent},
|
||||||
swarm::{
|
swarm::{
|
||||||
behaviour::{
|
behaviour::{
|
||||||
AddressChange, ConnectionClosed, ConnectionEstablished, DialFailure, FromSwarm,
|
AddressChange, ConnectionClosed, ConnectionEstablished, DialFailure, FromSwarm,
|
||||||
ListenFailure,
|
ListenFailure,
|
||||||
},
|
},
|
||||||
ConnectionDenied, ConnectionHandler, ConnectionId, IntoConnectionHandlerSelect,
|
ConnectionDenied, ConnectionHandler, ConnectionHandlerSelect, ConnectionId,
|
||||||
NetworkBehaviour, PollParameters, THandler, THandlerInEvent, THandlerOutEvent, ToSwarm,
|
NetworkBehaviour, PollParameters, THandler, THandlerInEvent, THandlerOutEvent, ToSwarm,
|
||||||
},
|
},
|
||||||
Multiaddr, PeerId,
|
Multiaddr, PeerId,
|
||||||
@@ -121,13 +121,18 @@ impl PeerInfoBehaviour {
|
|||||||
|
|
||||||
/// Inserts a ping time in the cache. Has no effect if we don't have any entry for that node,
|
/// Inserts a ping time in the cache. Has no effect if we don't have any entry for that node,
|
||||||
/// which shouldn't happen.
|
/// which shouldn't happen.
|
||||||
fn handle_ping_report(&mut self, peer_id: &PeerId, ping_time: Duration) {
|
fn handle_ping_report(
|
||||||
trace!(target: "sub-libp2p", "Ping time with {:?}: {:?}", peer_id, ping_time);
|
&mut self,
|
||||||
|
peer_id: &PeerId,
|
||||||
|
ping_time: Duration,
|
||||||
|
connection: ConnectionId,
|
||||||
|
) {
|
||||||
|
trace!(target: "sub-libp2p", "Ping time with {:?} via {:?}: {:?}", peer_id, connection, ping_time);
|
||||||
if let Some(entry) = self.nodes_info.get_mut(peer_id) {
|
if let Some(entry) = self.nodes_info.get_mut(peer_id) {
|
||||||
entry.latest_ping = Some(ping_time);
|
entry.latest_ping = Some(ping_time);
|
||||||
} else {
|
} else {
|
||||||
error!(target: "sub-libp2p",
|
error!(target: "sub-libp2p",
|
||||||
"Received ping from node we're not connected to {:?}", peer_id);
|
"Received ping from node we're not connected to {:?} via {:?}", peer_id, connection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,11 +186,11 @@ pub enum PeerInfoEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl NetworkBehaviour for PeerInfoBehaviour {
|
impl NetworkBehaviour for PeerInfoBehaviour {
|
||||||
type ConnectionHandler = IntoConnectionHandlerSelect<
|
type ConnectionHandler = ConnectionHandlerSelect<
|
||||||
<Ping as NetworkBehaviour>::ConnectionHandler,
|
<Ping as NetworkBehaviour>::ConnectionHandler,
|
||||||
<Identify as NetworkBehaviour>::ConnectionHandler,
|
<Identify as NetworkBehaviour>::ConnectionHandler,
|
||||||
>;
|
>;
|
||||||
type OutEvent = PeerInfoEvent;
|
type ToSwarm = PeerInfoEvent;
|
||||||
|
|
||||||
fn handle_pending_inbound_connection(
|
fn handle_pending_inbound_connection(
|
||||||
&mut self,
|
&mut self,
|
||||||
@@ -351,9 +356,9 @@ impl NetworkBehaviour for PeerInfoBehaviour {
|
|||||||
self.ping.on_swarm_event(FromSwarm::ListenerError(e));
|
self.ping.on_swarm_event(FromSwarm::ListenerError(e));
|
||||||
self.identify.on_swarm_event(FromSwarm::ListenerError(e));
|
self.identify.on_swarm_event(FromSwarm::ListenerError(e));
|
||||||
},
|
},
|
||||||
FromSwarm::ExpiredExternalAddr(e) => {
|
FromSwarm::ExternalAddrExpired(e) => {
|
||||||
self.ping.on_swarm_event(FromSwarm::ExpiredExternalAddr(e));
|
self.ping.on_swarm_event(FromSwarm::ExternalAddrExpired(e));
|
||||||
self.identify.on_swarm_event(FromSwarm::ExpiredExternalAddr(e));
|
self.identify.on_swarm_event(FromSwarm::ExternalAddrExpired(e));
|
||||||
},
|
},
|
||||||
FromSwarm::NewListener(e) => {
|
FromSwarm::NewListener(e) => {
|
||||||
self.ping.on_swarm_event(FromSwarm::NewListener(e));
|
self.ping.on_swarm_event(FromSwarm::NewListener(e));
|
||||||
@@ -363,9 +368,13 @@ impl NetworkBehaviour for PeerInfoBehaviour {
|
|||||||
self.ping.on_swarm_event(FromSwarm::ExpiredListenAddr(e));
|
self.ping.on_swarm_event(FromSwarm::ExpiredListenAddr(e));
|
||||||
self.identify.on_swarm_event(FromSwarm::ExpiredListenAddr(e));
|
self.identify.on_swarm_event(FromSwarm::ExpiredListenAddr(e));
|
||||||
},
|
},
|
||||||
FromSwarm::NewExternalAddr(e) => {
|
FromSwarm::NewExternalAddrCandidate(e) => {
|
||||||
self.ping.on_swarm_event(FromSwarm::NewExternalAddr(e));
|
self.ping.on_swarm_event(FromSwarm::NewExternalAddrCandidate(e));
|
||||||
self.identify.on_swarm_event(FromSwarm::NewExternalAddr(e));
|
self.identify.on_swarm_event(FromSwarm::NewExternalAddrCandidate(e));
|
||||||
|
},
|
||||||
|
FromSwarm::ExternalAddrConfirmed(e) => {
|
||||||
|
self.ping.on_swarm_event(FromSwarm::ExternalAddrConfirmed(e));
|
||||||
|
self.identify.on_swarm_event(FromSwarm::ExternalAddrConfirmed(e));
|
||||||
},
|
},
|
||||||
FromSwarm::AddressChange(e @ AddressChange { peer_id, old, new, .. }) => {
|
FromSwarm::AddressChange(e @ AddressChange { peer_id, old, new, .. }) => {
|
||||||
self.ping.on_swarm_event(FromSwarm::AddressChange(e));
|
self.ping.on_swarm_event(FromSwarm::AddressChange(e));
|
||||||
@@ -408,13 +417,13 @@ impl NetworkBehaviour for PeerInfoBehaviour {
|
|||||||
&mut self,
|
&mut self,
|
||||||
cx: &mut Context,
|
cx: &mut Context,
|
||||||
params: &mut impl PollParameters,
|
params: &mut impl PollParameters,
|
||||||
) -> Poll<ToSwarm<Self::OutEvent, THandlerInEvent<Self>>> {
|
) -> Poll<ToSwarm<Self::ToSwarm, THandlerInEvent<Self>>> {
|
||||||
loop {
|
loop {
|
||||||
match self.ping.poll(cx, params) {
|
match self.ping.poll(cx, params) {
|
||||||
Poll::Pending => break,
|
Poll::Pending => break,
|
||||||
Poll::Ready(ToSwarm::GenerateEvent(ev)) => {
|
Poll::Ready(ToSwarm::GenerateEvent(ev)) => {
|
||||||
if let PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) } = ev {
|
if let PingEvent { peer, result: Ok(rtt), connection } = ev {
|
||||||
self.handle_ping_report(&peer, rtt)
|
self.handle_ping_report(&peer, rtt, connection)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Poll::Ready(ToSwarm::Dial { opts }) => return Poll::Ready(ToSwarm::Dial { opts }),
|
Poll::Ready(ToSwarm::Dial { opts }) => return Poll::Ready(ToSwarm::Dial { opts }),
|
||||||
@@ -424,10 +433,18 @@ impl NetworkBehaviour for PeerInfoBehaviour {
|
|||||||
handler,
|
handler,
|
||||||
event: Either::Left(event),
|
event: Either::Left(event),
|
||||||
}),
|
}),
|
||||||
Poll::Ready(ToSwarm::ReportObservedAddr { address, score }) =>
|
|
||||||
return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }),
|
|
||||||
Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }) =>
|
Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }) =>
|
||||||
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
||||||
|
Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)) =>
|
||||||
|
return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)),
|
||||||
|
Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)),
|
||||||
|
Poll::Ready(ToSwarm::ExternalAddrExpired(addr)) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)),
|
||||||
|
Poll::Ready(ToSwarm::ListenOn { opts }) =>
|
||||||
|
return Poll::Ready(ToSwarm::ListenOn { opts }),
|
||||||
|
Poll::Ready(ToSwarm::RemoveListener { id }) =>
|
||||||
|
return Poll::Ready(ToSwarm::RemoveListener { id }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -453,10 +470,18 @@ impl NetworkBehaviour for PeerInfoBehaviour {
|
|||||||
handler,
|
handler,
|
||||||
event: Either::Right(event),
|
event: Either::Right(event),
|
||||||
}),
|
}),
|
||||||
Poll::Ready(ToSwarm::ReportObservedAddr { address, score }) =>
|
|
||||||
return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }),
|
|
||||||
Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }) =>
|
Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }) =>
|
||||||
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
||||||
|
Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)) =>
|
||||||
|
return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)),
|
||||||
|
Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)),
|
||||||
|
Poll::Ready(ToSwarm::ExternalAddrExpired(addr)) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)),
|
||||||
|
Poll::Ready(ToSwarm::ListenOn { opts }) =>
|
||||||
|
return Poll::Ready(ToSwarm::ListenOn { opts }),
|
||||||
|
Poll::Ready(ToSwarm::RemoveListener { id }) =>
|
||||||
|
return Poll::Ready(ToSwarm::RemoveListener { id }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -353,7 +353,7 @@ pub enum CustomMessageOutcome {
|
|||||||
|
|
||||||
impl<B: BlockT> NetworkBehaviour for Protocol<B> {
|
impl<B: BlockT> NetworkBehaviour for Protocol<B> {
|
||||||
type ConnectionHandler = <Notifications as NetworkBehaviour>::ConnectionHandler;
|
type ConnectionHandler = <Notifications as NetworkBehaviour>::ConnectionHandler;
|
||||||
type OutEvent = CustomMessageOutcome;
|
type ToSwarm = CustomMessageOutcome;
|
||||||
|
|
||||||
fn handle_established_inbound_connection(
|
fn handle_established_inbound_connection(
|
||||||
&mut self,
|
&mut self,
|
||||||
@@ -414,7 +414,7 @@ impl<B: BlockT> NetworkBehaviour for Protocol<B> {
|
|||||||
&mut self,
|
&mut self,
|
||||||
cx: &mut std::task::Context,
|
cx: &mut std::task::Context,
|
||||||
params: &mut impl PollParameters,
|
params: &mut impl PollParameters,
|
||||||
) -> Poll<ToSwarm<Self::OutEvent, THandlerInEvent<Self>>> {
|
) -> Poll<ToSwarm<Self::ToSwarm, THandlerInEvent<Self>>> {
|
||||||
while let Poll::Ready(Some(validation_result)) =
|
while let Poll::Ready(Some(validation_result)) =
|
||||||
self.sync_substream_validations.poll_next_unpin(cx)
|
self.sync_substream_validations.poll_next_unpin(cx)
|
||||||
{
|
{
|
||||||
@@ -438,10 +438,18 @@ impl<B: BlockT> NetworkBehaviour for Protocol<B> {
|
|||||||
Poll::Ready(ToSwarm::Dial { opts }) => return Poll::Ready(ToSwarm::Dial { opts }),
|
Poll::Ready(ToSwarm::Dial { opts }) => return Poll::Ready(ToSwarm::Dial { opts }),
|
||||||
Poll::Ready(ToSwarm::NotifyHandler { peer_id, handler, event }) =>
|
Poll::Ready(ToSwarm::NotifyHandler { peer_id, handler, event }) =>
|
||||||
return Poll::Ready(ToSwarm::NotifyHandler { peer_id, handler, event }),
|
return Poll::Ready(ToSwarm::NotifyHandler { peer_id, handler, event }),
|
||||||
Poll::Ready(ToSwarm::ReportObservedAddr { address, score }) =>
|
|
||||||
return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }),
|
|
||||||
Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }) =>
|
Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }) =>
|
||||||
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
||||||
|
Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)) =>
|
||||||
|
return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)),
|
||||||
|
Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)),
|
||||||
|
Poll::Ready(ToSwarm::ExternalAddrExpired(addr)) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)),
|
||||||
|
Poll::Ready(ToSwarm::ListenOn { opts }) =>
|
||||||
|
return Poll::Ready(ToSwarm::ListenOn { opts }),
|
||||||
|
Poll::Ready(ToSwarm::RemoveListener { id }) =>
|
||||||
|
return Poll::Ready(ToSwarm::RemoveListener { id }),
|
||||||
};
|
};
|
||||||
|
|
||||||
let outcome = match event {
|
let outcome = match event {
|
||||||
|
|||||||
@@ -999,7 +999,7 @@ impl Notifications {
|
|||||||
|
|
||||||
impl NetworkBehaviour for Notifications {
|
impl NetworkBehaviour for Notifications {
|
||||||
type ConnectionHandler = NotifsHandler;
|
type ConnectionHandler = NotifsHandler;
|
||||||
type OutEvent = NotificationsOut;
|
type ToSwarm = NotificationsOut;
|
||||||
|
|
||||||
fn handle_pending_inbound_connection(
|
fn handle_pending_inbound_connection(
|
||||||
&mut self,
|
&mut self,
|
||||||
@@ -1468,10 +1468,11 @@ impl NetworkBehaviour for Notifications {
|
|||||||
FromSwarm::ListenerClosed(_) => {},
|
FromSwarm::ListenerClosed(_) => {},
|
||||||
FromSwarm::ListenFailure(_) => {},
|
FromSwarm::ListenFailure(_) => {},
|
||||||
FromSwarm::ListenerError(_) => {},
|
FromSwarm::ListenerError(_) => {},
|
||||||
FromSwarm::ExpiredExternalAddr(_) => {},
|
FromSwarm::ExternalAddrExpired(_) => {},
|
||||||
FromSwarm::NewListener(_) => {},
|
FromSwarm::NewListener(_) => {},
|
||||||
FromSwarm::ExpiredListenAddr(_) => {},
|
FromSwarm::ExpiredListenAddr(_) => {},
|
||||||
FromSwarm::NewExternalAddr(_) => {},
|
FromSwarm::NewExternalAddrCandidate(_) => {},
|
||||||
|
FromSwarm::ExternalAddrConfirmed(_) => {},
|
||||||
FromSwarm::AddressChange(_) => {},
|
FromSwarm::AddressChange(_) => {},
|
||||||
FromSwarm::NewListenAddr(_) => {},
|
FromSwarm::NewListenAddr(_) => {},
|
||||||
}
|
}
|
||||||
@@ -2008,7 +2009,7 @@ impl NetworkBehaviour for Notifications {
|
|||||||
&mut self,
|
&mut self,
|
||||||
cx: &mut Context,
|
cx: &mut Context,
|
||||||
_params: &mut impl PollParameters,
|
_params: &mut impl PollParameters,
|
||||||
) -> Poll<ToSwarm<Self::OutEvent, THandlerInEvent<Self>>> {
|
) -> Poll<ToSwarm<Self::ToSwarm, THandlerInEvent<Self>>> {
|
||||||
if let Some(event) = self.events.pop_front() {
|
if let Some(event) = self.events.pop_front() {
|
||||||
return Poll::Ready(event)
|
return Poll::Ready(event)
|
||||||
}
|
}
|
||||||
@@ -2108,7 +2109,6 @@ impl NetworkBehaviour for Notifications {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::{peerset::IncomingIndex, protocol::notifications::handler::tests::*};
|
use crate::{peerset::IncomingIndex, protocol::notifications::handler::tests::*};
|
||||||
use libp2p::swarm::AddressRecord;
|
|
||||||
use std::{collections::HashSet, iter};
|
use std::{collections::HashSet, iter};
|
||||||
|
|
||||||
impl PartialEq for ConnectionState {
|
impl PartialEq for ConnectionState {
|
||||||
@@ -2127,31 +2127,14 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct MockPollParams {
|
struct MockPollParams {}
|
||||||
peer_id: PeerId,
|
|
||||||
addr: Multiaddr,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl PollParameters for MockPollParams {
|
impl PollParameters for MockPollParams {
|
||||||
type SupportedProtocolsIter = std::vec::IntoIter<Vec<u8>>;
|
type SupportedProtocolsIter = std::vec::IntoIter<Vec<u8>>;
|
||||||
type ListenedAddressesIter = std::vec::IntoIter<Multiaddr>;
|
|
||||||
type ExternalAddressesIter = std::vec::IntoIter<AddressRecord>;
|
|
||||||
|
|
||||||
fn supported_protocols(&self) -> Self::SupportedProtocolsIter {
|
fn supported_protocols(&self) -> Self::SupportedProtocolsIter {
|
||||||
vec![].into_iter()
|
vec![].into_iter()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn listened_addresses(&self) -> Self::ListenedAddressesIter {
|
|
||||||
vec![self.addr.clone()].into_iter()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn external_addresses(&self) -> Self::ExternalAddressesIter {
|
|
||||||
vec![].into_iter()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn local_peer_id(&self) -> &PeerId {
|
|
||||||
&self.peer_id
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn development_notifs() -> (Notifications, crate::peerset::PeersetHandle) {
|
fn development_notifs() -> (Notifications, crate::peerset::PeersetHandle) {
|
||||||
@@ -3015,7 +2998,7 @@ mod tests {
|
|||||||
|
|
||||||
notif.on_swarm_event(FromSwarm::DialFailure(libp2p::swarm::behaviour::DialFailure {
|
notif.on_swarm_event(FromSwarm::DialFailure(libp2p::swarm::behaviour::DialFailure {
|
||||||
peer_id: Some(peer),
|
peer_id: Some(peer),
|
||||||
error: &libp2p::swarm::DialError::Banned,
|
error: &libp2p::swarm::DialError::Aborted,
|
||||||
connection_id: ConnectionId::new_unchecked(1337),
|
connection_id: ConnectionId::new_unchecked(1337),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -3552,7 +3535,7 @@ mod tests {
|
|||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
notif.on_swarm_event(FromSwarm::DialFailure(libp2p::swarm::behaviour::DialFailure {
|
notif.on_swarm_event(FromSwarm::DialFailure(libp2p::swarm::behaviour::DialFailure {
|
||||||
peer_id: Some(peer),
|
peer_id: Some(peer),
|
||||||
error: &libp2p::swarm::DialError::Banned,
|
error: &libp2p::swarm::DialError::Aborted,
|
||||||
connection_id: ConnectionId::new_unchecked(0),
|
connection_id: ConnectionId::new_unchecked(0),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -3672,7 +3655,7 @@ mod tests {
|
|||||||
assert!(notif.peers.get(&(peer, set_id)).is_some());
|
assert!(notif.peers.get(&(peer, set_id)).is_some());
|
||||||
|
|
||||||
if tokio::time::timeout(Duration::from_secs(5), async {
|
if tokio::time::timeout(Duration::from_secs(5), async {
|
||||||
let mut params = MockPollParams { peer_id: PeerId::random(), addr: Multiaddr::empty() };
|
let mut params = MockPollParams {};
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
futures::future::poll_fn(|cx| {
|
futures::future::poll_fn(|cx| {
|
||||||
@@ -3781,7 +3764,7 @@ mod tests {
|
|||||||
// verify that the code continues to keep the peer disabled by resetting the timer
|
// verify that the code continues to keep the peer disabled by resetting the timer
|
||||||
// after the first one expired.
|
// after the first one expired.
|
||||||
if tokio::time::timeout(Duration::from_secs(5), async {
|
if tokio::time::timeout(Duration::from_secs(5), async {
|
||||||
let mut params = MockPollParams { peer_id: PeerId::random(), addr: Multiaddr::empty() };
|
let mut params = MockPollParams {};
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
futures::future::poll_fn(|cx| {
|
futures::future::poll_fn(|cx| {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -151,7 +151,7 @@ impl std::ops::DerefMut for CustomProtoWithAddr {
|
|||||||
|
|
||||||
impl NetworkBehaviour for CustomProtoWithAddr {
|
impl NetworkBehaviour for CustomProtoWithAddr {
|
||||||
type ConnectionHandler = <Notifications as NetworkBehaviour>::ConnectionHandler;
|
type ConnectionHandler = <Notifications as NetworkBehaviour>::ConnectionHandler;
|
||||||
type OutEvent = <Notifications as NetworkBehaviour>::OutEvent;
|
type ToSwarm = <Notifications as NetworkBehaviour>::ToSwarm;
|
||||||
|
|
||||||
fn handle_pending_inbound_connection(
|
fn handle_pending_inbound_connection(
|
||||||
&mut self,
|
&mut self,
|
||||||
@@ -229,7 +229,7 @@ impl NetworkBehaviour for CustomProtoWithAddr {
|
|||||||
&mut self,
|
&mut self,
|
||||||
cx: &mut Context,
|
cx: &mut Context,
|
||||||
params: &mut impl PollParameters,
|
params: &mut impl PollParameters,
|
||||||
) -> Poll<ToSwarm<Self::OutEvent, THandlerInEvent<Self>>> {
|
) -> Poll<ToSwarm<Self::ToSwarm, THandlerInEvent<Self>>> {
|
||||||
self.inner.poll(cx, params)
|
self.inner.poll(cx, params)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use futures::prelude::*;
|
use futures::prelude::*;
|
||||||
use libp2p::core::upgrade::{InboundUpgrade, ProtocolName, UpgradeInfo};
|
use libp2p::core::upgrade::{InboundUpgrade, UpgradeInfo};
|
||||||
use std::{
|
use std::{
|
||||||
iter::FromIterator,
|
iter::FromIterator,
|
||||||
pin::Pin,
|
pin::Pin,
|
||||||
@@ -76,9 +76,9 @@ where
|
|||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct ProtoNameWithUsize<T>(T, usize);
|
pub struct ProtoNameWithUsize<T>(T, usize);
|
||||||
|
|
||||||
impl<T: ProtocolName> ProtocolName for ProtoNameWithUsize<T> {
|
impl<T: AsRef<str>> AsRef<str> for ProtoNameWithUsize<T> {
|
||||||
fn protocol_name(&self) -> &[u8] {
|
fn as_ref(&self) -> &str {
|
||||||
self.0.protocol_name()
|
self.0.as_ref()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,13 +104,13 @@ impl<T: Future<Output = Result<O, E>>, O, E> Future for FutWithUsize<T> {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::types::ProtocolName as ProtoName;
|
use crate::types::ProtocolName as ProtoName;
|
||||||
use libp2p::core::upgrade::{ProtocolName, UpgradeInfo};
|
use libp2p::core::upgrade::UpgradeInfo;
|
||||||
|
|
||||||
// TODO: move to mocks
|
// TODO: move to mocks
|
||||||
mockall::mock! {
|
mockall::mock! {
|
||||||
pub ProtocolUpgrade<T> {}
|
pub ProtocolUpgrade<T> {}
|
||||||
|
|
||||||
impl<T: Clone + ProtocolName> UpgradeInfo for ProtocolUpgrade<T> {
|
impl<T: Clone + AsRef<str>> UpgradeInfo for ProtocolUpgrade<T> {
|
||||||
type Info = T;
|
type Info = T;
|
||||||
type InfoIter = vec::IntoIter<T>;
|
type InfoIter = vec::IntoIter<T>;
|
||||||
fn protocol_info(&self) -> vec::IntoIter<T>;
|
fn protocol_info(&self) -> vec::IntoIter<T>;
|
||||||
|
|||||||
@@ -114,13 +114,6 @@ pub struct NotificationsOutSubstream<TSubstream> {
|
|||||||
socket: Framed<TSubstream, UviBytes<io::Cursor<Vec<u8>>>>,
|
socket: Framed<TSubstream, UviBytes<io::Cursor<Vec<u8>>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
impl<TSubstream> NotificationsOutSubstream<TSubstream> {
|
|
||||||
pub fn new(socket: Framed<TSubstream, UviBytes<io::Cursor<Vec<u8>>>>) -> Self {
|
|
||||||
Self { socket }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl NotificationsIn {
|
impl NotificationsIn {
|
||||||
/// Builds a new potential upgrade.
|
/// Builds a new potential upgrade.
|
||||||
pub fn new(
|
pub fn new(
|
||||||
@@ -203,13 +196,13 @@ impl<TSubstream> NotificationsInSubstream<TSubstream>
|
|||||||
where
|
where
|
||||||
TSubstream: AsyncRead + AsyncWrite + Unpin,
|
TSubstream: AsyncRead + AsyncWrite + Unpin,
|
||||||
{
|
{
|
||||||
#[cfg(test)]
|
// #[cfg(test)]
|
||||||
pub fn new(
|
// pub fn new(
|
||||||
socket: Framed<TSubstream, UviBytes<io::Cursor<Vec<u8>>>>,
|
// socket: Framed<TSubstream, UviBytes<io::Cursor<Vec<u8>>>>,
|
||||||
handshake: NotificationsInSubstreamHandshake,
|
// handshake: NotificationsInSubstreamHandshake,
|
||||||
) -> Self {
|
// ) -> Self {
|
||||||
Self { socket, handshake }
|
// Self { socket, handshake }
|
||||||
}
|
// }
|
||||||
|
|
||||||
/// Sends the handshake in order to inform the remote that we accept the substream.
|
/// Sends the handshake in order to inform the remote that we accept the substream.
|
||||||
pub fn send_handshake(&mut self, message: impl Into<Vec<u8>>) {
|
pub fn send_handshake(&mut self, message: impl Into<Vec<u8>>) {
|
||||||
@@ -498,41 +491,92 @@ pub enum NotificationsOutError {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::{NotificationsIn, NotificationsInOpen, NotificationsOut, NotificationsOutOpen};
|
use super::*;
|
||||||
use futures::{channel::oneshot, prelude::*};
|
use futures::channel::oneshot;
|
||||||
use libp2p::core::upgrade;
|
use libp2p::core::{upgrade, InboundUpgrade, OutboundUpgrade, UpgradeInfo};
|
||||||
use tokio::net::{TcpListener, TcpStream};
|
use tokio::net::{TcpListener, TcpStream};
|
||||||
use tokio_util::compat::TokioAsyncReadCompatExt;
|
use tokio_util::compat::TokioAsyncReadCompatExt;
|
||||||
|
|
||||||
#[tokio::test]
|
/// Opens a substream to the given address, negotiates the protocol, and returns the substream
|
||||||
async fn basic_works() {
|
/// along with the handshake message.
|
||||||
const PROTO_NAME: &str = "/test/proto/1";
|
async fn dial(
|
||||||
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
addr: std::net::SocketAddr,
|
||||||
|
handshake: impl Into<Vec<u8>>,
|
||||||
let client = tokio::spawn(async move {
|
) -> Result<
|
||||||
let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap();
|
(
|
||||||
let NotificationsOutOpen { handshake, mut substream, .. } = upgrade::apply_outbound(
|
Vec<u8>,
|
||||||
|
NotificationsOutSubstream<
|
||||||
|
multistream_select::Negotiated<tokio_util::compat::Compat<TcpStream>>,
|
||||||
|
>,
|
||||||
|
),
|
||||||
|
NotificationsHandshakeError,
|
||||||
|
> {
|
||||||
|
let socket = TcpStream::connect(addr).await.unwrap();
|
||||||
|
let notifs_out = NotificationsOut::new("/test/proto/1", Vec::new(), handshake, 1024 * 1024);
|
||||||
|
let (_, substream) = multistream_select::dialer_select_proto(
|
||||||
socket.compat(),
|
socket.compat(),
|
||||||
NotificationsOut::new(PROTO_NAME, Vec::new(), &b"initial message"[..], 1024 * 1024),
|
notifs_out.protocol_info().into_iter(),
|
||||||
upgrade::Version::V1,
|
upgrade::Version::V1,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
let NotificationsOutOpen { handshake, substream, .. } =
|
||||||
|
<NotificationsOut as OutboundUpgrade<_>>::upgrade_outbound(
|
||||||
|
notifs_out,
|
||||||
|
substream,
|
||||||
|
"/test/proto/1".into(),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
Ok((handshake, substream))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Listens on a localhost, negotiates the protocol, and returns the substream along with the
|
||||||
|
/// handshake message.
|
||||||
|
///
|
||||||
|
/// Also sends the listener address through the given channel.
|
||||||
|
async fn listen_on_localhost(
|
||||||
|
listener_addr_tx: oneshot::Sender<std::net::SocketAddr>,
|
||||||
|
) -> Result<
|
||||||
|
(
|
||||||
|
Vec<u8>,
|
||||||
|
NotificationsInSubstream<
|
||||||
|
multistream_select::Negotiated<tokio_util::compat::Compat<TcpStream>>,
|
||||||
|
>,
|
||||||
|
),
|
||||||
|
NotificationsHandshakeError,
|
||||||
|
> {
|
||||||
|
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
|
||||||
|
listener_addr_tx.send(listener.local_addr().unwrap()).unwrap();
|
||||||
|
|
||||||
|
let (socket, _) = listener.accept().await.unwrap();
|
||||||
|
let notifs_in = NotificationsIn::new("/test/proto/1", Vec::new(), 1024 * 1024);
|
||||||
|
let (_, substream) =
|
||||||
|
multistream_select::listener_select_proto(socket.compat(), notifs_in.protocol_info())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
let NotificationsInOpen { handshake, substream, .. } =
|
||||||
|
<NotificationsIn as InboundUpgrade<_>>::upgrade_inbound(
|
||||||
|
notifs_in,
|
||||||
|
substream,
|
||||||
|
"/test/proto/1".into(),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
Ok((handshake, substream))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn basic_works() {
|
||||||
|
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
||||||
|
|
||||||
|
let client = tokio::spawn(async move {
|
||||||
|
let (handshake, mut substream) =
|
||||||
|
dial(listener_addr_rx.await.unwrap(), &b"initial message"[..]).await.unwrap();
|
||||||
|
|
||||||
assert_eq!(handshake, b"hello world");
|
assert_eq!(handshake, b"hello world");
|
||||||
substream.send(b"test message".to_vec()).await.unwrap();
|
substream.send(b"test message".to_vec()).await.unwrap();
|
||||||
});
|
});
|
||||||
|
|
||||||
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
|
let (handshake, mut substream) = listen_on_localhost(listener_addr_tx).await.unwrap();
|
||||||
listener_addr_tx.send(listener.local_addr().unwrap()).unwrap();
|
|
||||||
|
|
||||||
let (socket, _) = listener.accept().await.unwrap();
|
|
||||||
let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound(
|
|
||||||
socket.compat(),
|
|
||||||
NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024),
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert_eq!(handshake, b"initial message");
|
assert_eq!(handshake, b"initial message");
|
||||||
substream.send_handshake(&b"hello world"[..]);
|
substream.send_handshake(&b"hello world"[..]);
|
||||||
@@ -547,33 +591,17 @@ mod tests {
|
|||||||
async fn empty_handshake() {
|
async fn empty_handshake() {
|
||||||
// Check that everything still works when the handshake messages are empty.
|
// Check that everything still works when the handshake messages are empty.
|
||||||
|
|
||||||
const PROTO_NAME: &str = "/test/proto/1";
|
|
||||||
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
||||||
|
|
||||||
let client = tokio::spawn(async move {
|
let client = tokio::spawn(async move {
|
||||||
let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap();
|
let (handshake, mut substream) =
|
||||||
let NotificationsOutOpen { handshake, mut substream, .. } = upgrade::apply_outbound(
|
dial(listener_addr_rx.await.unwrap(), vec![]).await.unwrap();
|
||||||
socket.compat(),
|
|
||||||
NotificationsOut::new(PROTO_NAME, Vec::new(), vec![], 1024 * 1024),
|
|
||||||
upgrade::Version::V1,
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert!(handshake.is_empty());
|
assert!(handshake.is_empty());
|
||||||
substream.send(Default::default()).await.unwrap();
|
substream.send(Default::default()).await.unwrap();
|
||||||
});
|
});
|
||||||
|
|
||||||
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
|
let (handshake, mut substream) = listen_on_localhost(listener_addr_tx).await.unwrap();
|
||||||
listener_addr_tx.send(listener.local_addr().unwrap()).unwrap();
|
|
||||||
|
|
||||||
let (socket, _) = listener.accept().await.unwrap();
|
|
||||||
let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound(
|
|
||||||
socket.compat(),
|
|
||||||
NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024),
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert!(handshake.is_empty());
|
assert!(handshake.is_empty());
|
||||||
substream.send_handshake(vec![]);
|
substream.send_handshake(vec![]);
|
||||||
@@ -586,17 +614,10 @@ mod tests {
|
|||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn refused() {
|
async fn refused() {
|
||||||
const PROTO_NAME: &str = "/test/proto/1";
|
|
||||||
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
||||||
|
|
||||||
let client = tokio::spawn(async move {
|
let client = tokio::spawn(async move {
|
||||||
let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap();
|
let outcome = dial(listener_addr_rx.await.unwrap(), &b"hello"[..]).await;
|
||||||
let outcome = upgrade::apply_outbound(
|
|
||||||
socket.compat(),
|
|
||||||
NotificationsOut::new(PROTO_NAME, Vec::new(), &b"hello"[..], 1024 * 1024),
|
|
||||||
upgrade::Version::V1,
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
|
|
||||||
// Despite the protocol negotiation being successfully conducted on the listener
|
// Despite the protocol negotiation being successfully conducted on the listener
|
||||||
// side, we have to receive an error here because the listener didn't send the
|
// side, we have to receive an error here because the listener didn't send the
|
||||||
@@ -604,16 +625,7 @@ mod tests {
|
|||||||
assert!(outcome.is_err());
|
assert!(outcome.is_err());
|
||||||
});
|
});
|
||||||
|
|
||||||
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
|
let (handshake, substream) = listen_on_localhost(listener_addr_tx).await.unwrap();
|
||||||
listener_addr_tx.send(listener.local_addr().unwrap()).unwrap();
|
|
||||||
|
|
||||||
let (socket, _) = listener.accept().await.unwrap();
|
|
||||||
let NotificationsInOpen { handshake, substream, .. } = upgrade::apply_inbound(
|
|
||||||
socket.compat(),
|
|
||||||
NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024),
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert_eq!(handshake, b"hello");
|
assert_eq!(handshake, b"hello");
|
||||||
|
|
||||||
@@ -625,35 +637,16 @@ mod tests {
|
|||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn large_initial_message_refused() {
|
async fn large_initial_message_refused() {
|
||||||
const PROTO_NAME: &str = "/test/proto/1";
|
|
||||||
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
||||||
|
|
||||||
let client = tokio::spawn(async move {
|
let client = tokio::spawn(async move {
|
||||||
let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap();
|
let ret =
|
||||||
let ret = upgrade::apply_outbound(
|
dial(listener_addr_rx.await.unwrap(), (0..32768).map(|_| 0).collect::<Vec<_>>())
|
||||||
socket.compat(),
|
|
||||||
// We check that an initial message that is too large gets refused.
|
|
||||||
NotificationsOut::new(
|
|
||||||
PROTO_NAME,
|
|
||||||
Vec::new(),
|
|
||||||
(0..32768).map(|_| 0).collect::<Vec<_>>(),
|
|
||||||
1024 * 1024,
|
|
||||||
),
|
|
||||||
upgrade::Version::V1,
|
|
||||||
)
|
|
||||||
.await;
|
.await;
|
||||||
assert!(ret.is_err());
|
assert!(ret.is_err());
|
||||||
});
|
});
|
||||||
|
|
||||||
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
|
let ret = listen_on_localhost(listener_addr_tx).await;
|
||||||
listener_addr_tx.send(listener.local_addr().unwrap()).unwrap();
|
|
||||||
|
|
||||||
let (socket, _) = listener.accept().await.unwrap();
|
|
||||||
let ret = upgrade::apply_inbound(
|
|
||||||
socket.compat(),
|
|
||||||
NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024),
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
assert!(ret.is_err());
|
assert!(ret.is_err());
|
||||||
|
|
||||||
client.await.unwrap();
|
client.await.unwrap();
|
||||||
@@ -661,30 +654,14 @@ mod tests {
|
|||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn large_handshake_refused() {
|
async fn large_handshake_refused() {
|
||||||
const PROTO_NAME: &str = "/test/proto/1";
|
|
||||||
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
let (listener_addr_tx, listener_addr_rx) = oneshot::channel();
|
||||||
|
|
||||||
let client = tokio::spawn(async move {
|
let client = tokio::spawn(async move {
|
||||||
let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap();
|
let ret = dial(listener_addr_rx.await.unwrap(), &b"initial message"[..]).await;
|
||||||
let ret = upgrade::apply_outbound(
|
|
||||||
socket.compat(),
|
|
||||||
NotificationsOut::new(PROTO_NAME, Vec::new(), &b"initial message"[..], 1024 * 1024),
|
|
||||||
upgrade::Version::V1,
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
assert!(ret.is_err());
|
assert!(ret.is_err());
|
||||||
});
|
});
|
||||||
|
|
||||||
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
|
let (handshake, mut substream) = listen_on_localhost(listener_addr_tx).await.unwrap();
|
||||||
listener_addr_tx.send(listener.local_addr().unwrap()).unwrap();
|
|
||||||
|
|
||||||
let (socket, _) = listener.accept().await.unwrap();
|
|
||||||
let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound(
|
|
||||||
socket.compat(),
|
|
||||||
NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024),
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(handshake, b"initial message");
|
assert_eq!(handshake, b"initial message");
|
||||||
|
|
||||||
// We check that a handshake that is too large gets refused.
|
// We check that a handshake that is too large gets refused.
|
||||||
|
|||||||
@@ -331,13 +331,13 @@ impl RequestResponsesBehaviour {
|
|||||||
ProtocolSupport::Outbound
|
ProtocolSupport::Outbound
|
||||||
};
|
};
|
||||||
|
|
||||||
let rq_rp = Behaviour::new(
|
let rq_rp = Behaviour::with_codec(
|
||||||
GenericCodec {
|
GenericCodec {
|
||||||
max_request_size: protocol.max_request_size,
|
max_request_size: protocol.max_request_size,
|
||||||
max_response_size: protocol.max_response_size,
|
max_response_size: protocol.max_response_size,
|
||||||
},
|
},
|
||||||
iter::once(protocol.name.as_bytes().to_vec())
|
iter::once(protocol.name.clone())
|
||||||
.chain(protocol.fallback_names.iter().map(|name| name.as_bytes().to_vec()))
|
.chain(protocol.fallback_names)
|
||||||
.zip(iter::repeat(protocol_support)),
|
.zip(iter::repeat(protocol_support)),
|
||||||
cfg,
|
cfg,
|
||||||
);
|
);
|
||||||
@@ -405,7 +405,7 @@ impl RequestResponsesBehaviour {
|
|||||||
impl NetworkBehaviour for RequestResponsesBehaviour {
|
impl NetworkBehaviour for RequestResponsesBehaviour {
|
||||||
type ConnectionHandler =
|
type ConnectionHandler =
|
||||||
MultiHandler<String, <Behaviour<GenericCodec> as NetworkBehaviour>::ConnectionHandler>;
|
MultiHandler<String, <Behaviour<GenericCodec> as NetworkBehaviour>::ConnectionHandler>;
|
||||||
type OutEvent = Event;
|
type ToSwarm = Event;
|
||||||
|
|
||||||
fn handle_pending_inbound_connection(
|
fn handle_pending_inbound_connection(
|
||||||
&mut self,
|
&mut self,
|
||||||
@@ -521,9 +521,9 @@ impl NetworkBehaviour for RequestResponsesBehaviour {
|
|||||||
for (p, _) in self.protocols.values_mut() {
|
for (p, _) in self.protocols.values_mut() {
|
||||||
NetworkBehaviour::on_swarm_event(p, FromSwarm::ListenerError(e));
|
NetworkBehaviour::on_swarm_event(p, FromSwarm::ListenerError(e));
|
||||||
},
|
},
|
||||||
FromSwarm::ExpiredExternalAddr(e) =>
|
FromSwarm::ExternalAddrExpired(e) =>
|
||||||
for (p, _) in self.protocols.values_mut() {
|
for (p, _) in self.protocols.values_mut() {
|
||||||
NetworkBehaviour::on_swarm_event(p, FromSwarm::ExpiredExternalAddr(e));
|
NetworkBehaviour::on_swarm_event(p, FromSwarm::ExternalAddrExpired(e));
|
||||||
},
|
},
|
||||||
FromSwarm::NewListener(e) =>
|
FromSwarm::NewListener(e) =>
|
||||||
for (p, _) in self.protocols.values_mut() {
|
for (p, _) in self.protocols.values_mut() {
|
||||||
@@ -533,9 +533,13 @@ impl NetworkBehaviour for RequestResponsesBehaviour {
|
|||||||
for (p, _) in self.protocols.values_mut() {
|
for (p, _) in self.protocols.values_mut() {
|
||||||
NetworkBehaviour::on_swarm_event(p, FromSwarm::ExpiredListenAddr(e));
|
NetworkBehaviour::on_swarm_event(p, FromSwarm::ExpiredListenAddr(e));
|
||||||
},
|
},
|
||||||
FromSwarm::NewExternalAddr(e) =>
|
FromSwarm::NewExternalAddrCandidate(e) =>
|
||||||
for (p, _) in self.protocols.values_mut() {
|
for (p, _) in self.protocols.values_mut() {
|
||||||
NetworkBehaviour::on_swarm_event(p, FromSwarm::NewExternalAddr(e));
|
NetworkBehaviour::on_swarm_event(p, FromSwarm::NewExternalAddrCandidate(e));
|
||||||
|
},
|
||||||
|
FromSwarm::ExternalAddrConfirmed(e) =>
|
||||||
|
for (p, _) in self.protocols.values_mut() {
|
||||||
|
NetworkBehaviour::on_swarm_event(p, FromSwarm::ExternalAddrConfirmed(e));
|
||||||
},
|
},
|
||||||
FromSwarm::AddressChange(e) =>
|
FromSwarm::AddressChange(e) =>
|
||||||
for (p, _) in self.protocols.values_mut() {
|
for (p, _) in self.protocols.values_mut() {
|
||||||
@@ -570,7 +574,7 @@ impl NetworkBehaviour for RequestResponsesBehaviour {
|
|||||||
&mut self,
|
&mut self,
|
||||||
cx: &mut Context,
|
cx: &mut Context,
|
||||||
params: &mut impl PollParameters,
|
params: &mut impl PollParameters,
|
||||||
) -> Poll<ToSwarm<Self::OutEvent, THandlerInEvent<Self>>> {
|
) -> Poll<ToSwarm<Self::ToSwarm, THandlerInEvent<Self>>> {
|
||||||
'poll_all: loop {
|
'poll_all: loop {
|
||||||
if let Some(message_request) = self.message_request.take() {
|
if let Some(message_request) = self.message_request.take() {
|
||||||
// Now we can can poll `MessageRequest` until we get the reputation
|
// Now we can can poll `MessageRequest` until we get the reputation
|
||||||
@@ -729,10 +733,18 @@ impl NetworkBehaviour for RequestResponsesBehaviour {
|
|||||||
handler,
|
handler,
|
||||||
event: ((*protocol).to_string(), event),
|
event: ((*protocol).to_string(), event),
|
||||||
}),
|
}),
|
||||||
ToSwarm::ReportObservedAddr { address, score } =>
|
|
||||||
return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }),
|
|
||||||
ToSwarm::CloseConnection { peer_id, connection } =>
|
ToSwarm::CloseConnection { peer_id, connection } =>
|
||||||
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }),
|
||||||
|
ToSwarm::NewExternalAddrCandidate(observed) =>
|
||||||
|
return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)),
|
||||||
|
ToSwarm::ExternalAddrConfirmed(addr) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)),
|
||||||
|
ToSwarm::ExternalAddrExpired(addr) =>
|
||||||
|
return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)),
|
||||||
|
ToSwarm::ListenOn { opts } =>
|
||||||
|
return Poll::Ready(ToSwarm::ListenOn { opts }),
|
||||||
|
ToSwarm::RemoveListener { id } =>
|
||||||
|
return Poll::Ready(ToSwarm::RemoveListener { id }),
|
||||||
};
|
};
|
||||||
|
|
||||||
match ev {
|
match ev {
|
||||||
@@ -934,7 +946,7 @@ pub struct GenericCodec {
|
|||||||
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
impl Codec for GenericCodec {
|
impl Codec for GenericCodec {
|
||||||
type Protocol = Vec<u8>;
|
type Protocol = ProtocolName;
|
||||||
type Request = Vec<u8>;
|
type Request = Vec<u8>;
|
||||||
type Response = Result<Vec<u8>, ()>;
|
type Response = Result<Vec<u8>, ()>;
|
||||||
|
|
||||||
|
|||||||
@@ -55,17 +55,15 @@ use crate::{
|
|||||||
|
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use futures::{channel::oneshot, prelude::*};
|
use futures::{channel::oneshot, prelude::*};
|
||||||
#[allow(deprecated)]
|
|
||||||
use libp2p::{
|
use libp2p::{
|
||||||
connection_limits::Exceeded,
|
connection_limits::{ConnectionLimits, Exceeded},
|
||||||
core::{upgrade, ConnectedPoint, Endpoint},
|
core::{upgrade, ConnectedPoint, Endpoint},
|
||||||
identify::Info as IdentifyInfo,
|
identify::Info as IdentifyInfo,
|
||||||
kad::record::Key as KademliaKey,
|
kad::record::Key as KademliaKey,
|
||||||
multiaddr,
|
multiaddr,
|
||||||
ping::Failure as PingFailure,
|
|
||||||
swarm::{
|
swarm::{
|
||||||
AddressScore, ConnectionError, ConnectionId, ConnectionLimits, DialError, Executor,
|
ConnectionError, ConnectionId, DialError, Executor, ListenError, NetworkBehaviour, Swarm,
|
||||||
ListenError, NetworkBehaviour, Swarm, SwarmBuilder, SwarmEvent, THandlerErr,
|
SwarmBuilder, SwarmEvent, THandlerErr,
|
||||||
},
|
},
|
||||||
Multiaddr, PeerId,
|
Multiaddr, PeerId,
|
||||||
};
|
};
|
||||||
@@ -351,6 +349,11 @@ where
|
|||||||
discovery_config,
|
discovery_config,
|
||||||
request_response_protocols,
|
request_response_protocols,
|
||||||
peerset_handle.clone(),
|
peerset_handle.clone(),
|
||||||
|
ConnectionLimits::default()
|
||||||
|
.with_max_established_per_peer(Some(crate::MAX_CONNECTIONS_PER_PEER as u32))
|
||||||
|
.with_max_established_incoming(Some(
|
||||||
|
crate::MAX_CONNECTIONS_ESTABLISHED_INCOMING,
|
||||||
|
)),
|
||||||
);
|
);
|
||||||
|
|
||||||
match result {
|
match result {
|
||||||
@@ -374,15 +377,7 @@ where
|
|||||||
SpawnImpl(params.executor),
|
SpawnImpl(params.executor),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
#[allow(deprecated)]
|
|
||||||
let builder = builder
|
let builder = builder
|
||||||
.connection_limits(
|
|
||||||
ConnectionLimits::default()
|
|
||||||
.with_max_established_per_peer(Some(crate::MAX_CONNECTIONS_PER_PEER as u32))
|
|
||||||
.with_max_established_incoming(Some(
|
|
||||||
crate::MAX_CONNECTIONS_ESTABLISHED_INCOMING,
|
|
||||||
)),
|
|
||||||
)
|
|
||||||
.substream_upgrade_protocol_override(upgrade::Version::V1Lazy)
|
.substream_upgrade_protocol_override(upgrade::Version::V1Lazy)
|
||||||
.notify_handler_buffer_size(NonZeroUsize::new(32).expect("32 != 0; qed"))
|
.notify_handler_buffer_size(NonZeroUsize::new(32).expect("32 != 0; qed"))
|
||||||
// NOTE: 24 is somewhat arbitrary and should be tuned in the future if necessary.
|
// NOTE: 24 is somewhat arbitrary and should be tuned in the future if necessary.
|
||||||
@@ -414,11 +409,7 @@ where
|
|||||||
|
|
||||||
// Add external addresses.
|
// Add external addresses.
|
||||||
for addr in &network_config.public_addresses {
|
for addr in &network_config.public_addresses {
|
||||||
Swarm::<Behaviour<B>>::add_external_address(
|
Swarm::<Behaviour<B>>::add_external_address(&mut swarm, addr.clone());
|
||||||
&mut swarm,
|
|
||||||
addr.clone(),
|
|
||||||
AddressScore::Infinite,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let external_addresses = Arc::new(Mutex::new(Vec::new()));
|
let external_addresses = Arc::new(Mutex::new(Vec::new()));
|
||||||
@@ -602,7 +593,7 @@ where
|
|||||||
|
|
||||||
let peer_id = Swarm::<Behaviour<B>>::local_peer_id(swarm).to_base58();
|
let peer_id = Swarm::<Behaviour<B>>::local_peer_id(swarm).to_base58();
|
||||||
let listened_addresses = swarm.listeners().cloned().collect();
|
let listened_addresses = swarm.listeners().cloned().collect();
|
||||||
let external_addresses = swarm.external_addresses().map(|r| &r.addr).cloned().collect();
|
let external_addresses = swarm.external_addresses().cloned().collect();
|
||||||
|
|
||||||
NetworkState {
|
NetworkState {
|
||||||
peer_id,
|
peer_id,
|
||||||
@@ -680,8 +671,7 @@ impl<B: BlockT + 'static, H: ExHashT> NetworkService<B, H> {
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|mut addr| {
|
.map(|mut addr| {
|
||||||
let peer = match addr.pop() {
|
let peer = match addr.pop() {
|
||||||
Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key)
|
Some(multiaddr::Protocol::P2p(peer_id)) => peer_id,
|
||||||
.map_err(|_| "Invalid PeerId format".to_string())?,
|
|
||||||
_ => return Err("Missing PeerId from address".to_string()),
|
_ => return Err("Missing PeerId from address".to_string()),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1197,8 +1187,7 @@ where
|
|||||||
self.network_service.behaviour_mut().user_protocol_mut().num_connected_peers();
|
self.network_service.behaviour_mut().user_protocol_mut().num_connected_peers();
|
||||||
self.num_connected.store(num_connected_peers, Ordering::Relaxed);
|
self.num_connected.store(num_connected_peers, Ordering::Relaxed);
|
||||||
{
|
{
|
||||||
let external_addresses =
|
let external_addresses = self.network_service.external_addresses().cloned().collect();
|
||||||
self.network_service.external_addresses().map(|r| &r.addr).cloned().collect();
|
|
||||||
*self.external_addresses.lock() = external_addresses;
|
*self.external_addresses.lock() = external_addresses;
|
||||||
|
|
||||||
let listen_addresses =
|
let listen_addresses =
|
||||||
@@ -1401,7 +1390,12 @@ where
|
|||||||
peer_id,
|
peer_id,
|
||||||
info:
|
info:
|
||||||
IdentifyInfo {
|
IdentifyInfo {
|
||||||
protocol_version, agent_version, mut listen_addrs, protocols, ..
|
protocol_version,
|
||||||
|
agent_version,
|
||||||
|
mut listen_addrs,
|
||||||
|
protocols,
|
||||||
|
observed_addr,
|
||||||
|
..
|
||||||
},
|
},
|
||||||
}) => {
|
}) => {
|
||||||
if listen_addrs.len() > 30 {
|
if listen_addrs.len() > 30 {
|
||||||
@@ -1413,11 +1407,17 @@ where
|
|||||||
listen_addrs.truncate(30);
|
listen_addrs.truncate(30);
|
||||||
}
|
}
|
||||||
for addr in listen_addrs {
|
for addr in listen_addrs {
|
||||||
self.network_service
|
self.network_service.behaviour_mut().add_self_reported_address_to_dht(
|
||||||
.behaviour_mut()
|
&peer_id,
|
||||||
.add_self_reported_address_to_dht(&peer_id, &protocols, addr);
|
&protocols,
|
||||||
|
addr.clone(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
self.network_service.behaviour_mut().user_protocol_mut().add_known_peer(peer_id);
|
self.network_service.behaviour_mut().user_protocol_mut().add_known_peer(peer_id);
|
||||||
|
// Confirm the observed address manually since they are no longer trusted by
|
||||||
|
// default (libp2p >= 0.52)
|
||||||
|
// TODO: remove this when/if AutoNAT is implemented.
|
||||||
|
self.network_service.add_external_address(observed_addr);
|
||||||
},
|
},
|
||||||
SwarmEvent::Behaviour(BehaviourOut::Discovered(peer_id)) => {
|
SwarmEvent::Behaviour(BehaviourOut::Discovered(peer_id)) => {
|
||||||
self.network_service.behaviour_mut().user_protocol_mut().add_known_peer(peer_id);
|
self.network_service.behaviour_mut().user_protocol_mut().add_known_peer(peer_id);
|
||||||
@@ -1562,8 +1562,14 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
SwarmEvent::ConnectionClosed { peer_id, cause, endpoint, num_established } => {
|
SwarmEvent::ConnectionClosed {
|
||||||
debug!(target: "sub-libp2p", "Libp2p => Disconnected({:?}, {:?})", peer_id, cause);
|
connection_id,
|
||||||
|
peer_id,
|
||||||
|
cause,
|
||||||
|
endpoint,
|
||||||
|
num_established,
|
||||||
|
} => {
|
||||||
|
debug!(target: "sub-libp2p", "Libp2p => Disconnected({:?} via {:?}: {:?})", peer_id, connection_id, cause);
|
||||||
if let Some(metrics) = self.metrics.as_ref() {
|
if let Some(metrics) = self.metrics.as_ref() {
|
||||||
let direction = match endpoint {
|
let direction = match endpoint {
|
||||||
ConnectedPoint::Dialer { .. } => "out",
|
ConnectedPoint::Dialer { .. } => "out",
|
||||||
@@ -1572,10 +1578,12 @@ where
|
|||||||
let reason = match cause {
|
let reason = match cause {
|
||||||
Some(ConnectionError::IO(_)) => "transport-error",
|
Some(ConnectionError::IO(_)) => "transport-error",
|
||||||
Some(ConnectionError::Handler(Either::Left(Either::Left(
|
Some(ConnectionError::Handler(Either::Left(Either::Left(
|
||||||
Either::Right(Either::Left(PingFailure::Timeout)),
|
Either::Left(Either::Right(_)),
|
||||||
)))) => "ping-timeout",
|
)))) => "ping-timeout",
|
||||||
Some(ConnectionError::Handler(Either::Left(Either::Left(
|
Some(ConnectionError::Handler(Either::Left(Either::Left(
|
||||||
Either::Left(NotifsHandlerError::SyncNotificationsClogged),
|
Either::Left(Either::Left(
|
||||||
|
NotifsHandlerError::SyncNotificationsClogged,
|
||||||
|
)),
|
||||||
)))) => "sync-notifications-clogged",
|
)))) => "sync-notifications-clogged",
|
||||||
Some(ConnectionError::Handler(_)) => "protocol-error",
|
Some(ConnectionError::Handler(_)) => "protocol-error",
|
||||||
Some(ConnectionError::KeepAliveTimeout) => "keep-alive-timeout",
|
Some(ConnectionError::KeepAliveTimeout) => "keep-alive-timeout",
|
||||||
@@ -1601,12 +1609,12 @@ where
|
|||||||
metrics.listeners_local_addresses.dec();
|
metrics.listeners_local_addresses.dec();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
SwarmEvent::OutgoingConnectionError { peer_id, error } => {
|
SwarmEvent::OutgoingConnectionError { connection_id, peer_id, error } => {
|
||||||
if let Some(peer_id) = peer_id {
|
if let Some(peer_id) = peer_id {
|
||||||
trace!(
|
trace!(
|
||||||
target: "sub-libp2p",
|
target: "sub-libp2p",
|
||||||
"Libp2p => Failed to reach {:?}: {}",
|
"Libp2p => Failed to reach {:?} via {:?}: {}",
|
||||||
peer_id, error,
|
peer_id, connection_id, error,
|
||||||
);
|
);
|
||||||
|
|
||||||
let not_reported = !self.reported_invalid_boot_nodes.contains(&peer_id);
|
let not_reported = !self.reported_invalid_boot_nodes.contains(&peer_id);
|
||||||
@@ -1644,12 +1652,9 @@ where
|
|||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
},
|
},
|
||||||
DialError::ConnectionLimit(_) => Some("limit-reached"),
|
DialError::WrongPeerId { .. } | DialError::LocalPeerId { .. } =>
|
||||||
DialError::InvalidPeerId(_) |
|
Some("invalid-peer-id"),
|
||||||
DialError::WrongPeerId { .. } |
|
|
||||||
DialError::LocalPeerId { .. } => Some("invalid-peer-id"),
|
|
||||||
DialError::Transport(_) => Some("transport-error"),
|
DialError::Transport(_) => Some("transport-error"),
|
||||||
DialError::Banned |
|
|
||||||
DialError::NoAddresses |
|
DialError::NoAddresses |
|
||||||
DialError::DialPeerConditionFalse(_) |
|
DialError::DialPeerConditionFalse(_) |
|
||||||
DialError::Aborted => None, // ignore them
|
DialError::Aborted => None, // ignore them
|
||||||
@@ -1659,21 +1664,26 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
SwarmEvent::Dialing(peer_id) => {
|
SwarmEvent::Dialing { peer_id, connection_id } => {
|
||||||
trace!(target: "sub-libp2p", "Libp2p => Dialing({:?})", peer_id)
|
trace!(target: "sub-libp2p", "Libp2p => Dialing({:?} via {:?})", peer_id, connection_id)
|
||||||
},
|
},
|
||||||
SwarmEvent::IncomingConnection { local_addr, send_back_addr } => {
|
SwarmEvent::IncomingConnection { connection_id, local_addr, send_back_addr } => {
|
||||||
trace!(target: "sub-libp2p", "Libp2p => IncomingConnection({},{}))",
|
trace!(target: "sub-libp2p", "Libp2p => IncomingConnection({},{} via {:?}))",
|
||||||
local_addr, send_back_addr);
|
local_addr, send_back_addr, connection_id);
|
||||||
if let Some(metrics) = self.metrics.as_ref() {
|
if let Some(metrics) = self.metrics.as_ref() {
|
||||||
metrics.incoming_connections_total.inc();
|
metrics.incoming_connections_total.inc();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
SwarmEvent::IncomingConnectionError { local_addr, send_back_addr, error } => {
|
SwarmEvent::IncomingConnectionError {
|
||||||
|
connection_id,
|
||||||
|
local_addr,
|
||||||
|
send_back_addr,
|
||||||
|
error,
|
||||||
|
} => {
|
||||||
debug!(
|
debug!(
|
||||||
target: "sub-libp2p",
|
target: "sub-libp2p",
|
||||||
"Libp2p => IncomingConnectionError({},{}): {}",
|
"Libp2p => IncomingConnectionError({},{} via {:?}): {}",
|
||||||
local_addr, send_back_addr, error,
|
local_addr, send_back_addr, connection_id, error,
|
||||||
);
|
);
|
||||||
if let Some(metrics) = self.metrics.as_ref() {
|
if let Some(metrics) = self.metrics.as_ref() {
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
@@ -1684,7 +1694,6 @@ where
|
|||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
},
|
},
|
||||||
ListenError::ConnectionLimit(_) => Some("limit-reached"),
|
|
||||||
ListenError::WrongPeerId { .. } | ListenError::LocalPeerId { .. } =>
|
ListenError::WrongPeerId { .. } | ListenError::LocalPeerId { .. } =>
|
||||||
Some("invalid-peer-id"),
|
Some("invalid-peer-id"),
|
||||||
ListenError::Transport(_) => Some("transport-error"),
|
ListenError::Transport(_) => Some("transport-error"),
|
||||||
@@ -1699,17 +1708,6 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
#[allow(deprecated)]
|
|
||||||
SwarmEvent::BannedPeer { peer_id, endpoint } => {
|
|
||||||
debug!(
|
|
||||||
target: "sub-libp2p",
|
|
||||||
"Libp2p => BannedPeer({}). Connected via {:?}.",
|
|
||||||
peer_id, endpoint,
|
|
||||||
);
|
|
||||||
if let Some(metrics) = self.metrics.as_ref() {
|
|
||||||
metrics.incoming_connections_errors_total.with_label_values(&["banned"]).inc();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
SwarmEvent::ListenerClosed { reason, addresses, .. } => {
|
SwarmEvent::ListenerClosed { reason, addresses, .. } => {
|
||||||
if let Some(metrics) = self.metrics.as_ref() {
|
if let Some(metrics) = self.metrics.as_ref() {
|
||||||
metrics.listeners_local_addresses.sub(addresses.len() as u64);
|
metrics.listeners_local_addresses.sub(addresses.len() as u64);
|
||||||
|
|||||||
@@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
//! `sc-network` type definitions
|
//! `sc-network` type definitions
|
||||||
|
|
||||||
use libp2p::core::upgrade;
|
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
borrow::Borrow,
|
borrow::Borrow,
|
||||||
fmt,
|
fmt,
|
||||||
@@ -92,9 +90,9 @@ impl fmt::Display for ProtocolName {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl upgrade::ProtocolName for ProtocolName {
|
impl AsRef<str> for ProtocolName {
|
||||||
fn protocol_name(&self) -> &[u8] {
|
fn as_ref(&self) -> &str {
|
||||||
(self as &str).as_bytes()
|
self as &str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ array-bytes = "6.1"
|
|||||||
async-channel = "1.8.0"
|
async-channel = "1.8.0"
|
||||||
codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] }
|
codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] }
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
libp2p = "0.51.3"
|
libp2p = "0.52.1"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../../utils/prometheus" }
|
prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../../utils/prometheus" }
|
||||||
sc-network-common = { version = "0.10.0-dev", path = "../common" }
|
sc-network-common = { version = "0.10.0-dev", path = "../common" }
|
||||||
|
|||||||
@@ -286,8 +286,8 @@ where
|
|||||||
fn handle_sync_event(&mut self, event: SyncEvent) {
|
fn handle_sync_event(&mut self, event: SyncEvent) {
|
||||||
match event {
|
match event {
|
||||||
SyncEvent::PeerConnected(remote) => {
|
SyncEvent::PeerConnected(remote) => {
|
||||||
let addr = iter::once(multiaddr::Protocol::P2p(remote.into()))
|
let addr =
|
||||||
.collect::<multiaddr::Multiaddr>();
|
iter::once(multiaddr::Protocol::P2p(remote)).collect::<multiaddr::Multiaddr>();
|
||||||
let result = self.network.add_peers_to_reserved_set(
|
let result = self.network.add_peers_to_reserved_set(
|
||||||
self.protocol_name.clone(),
|
self.protocol_name.clone(),
|
||||||
iter::once(addr).collect(),
|
iter::once(addr).collect(),
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ async-trait = "0.1.58"
|
|||||||
codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] }
|
codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] }
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
futures-timer = "3.0.2"
|
futures-timer = "3.0.2"
|
||||||
libp2p = "0.51.3"
|
libp2p = "0.52.1"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
mockall = "0.11.3"
|
mockall = "0.11.3"
|
||||||
prost = "0.11"
|
prost = "0.11"
|
||||||
schnellru = "0.2.1"
|
schnellru = "0.2.1"
|
||||||
smallvec = "1.8.0"
|
smallvec = "1.11.0"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
fork-tree = { version = "3.0.0", path = "../../../utils/fork-tree" }
|
fork-tree = { version = "3.0.0", path = "../../../utils/fork-tree" }
|
||||||
prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../../utils/prometheus" }
|
prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../../utils/prometheus" }
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ tokio = "1.22.0"
|
|||||||
async-trait = "0.1.57"
|
async-trait = "0.1.57"
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
futures-timer = "3.0.1"
|
futures-timer = "3.0.1"
|
||||||
libp2p = "0.51.3"
|
libp2p = "0.52.1"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
parking_lot = "0.12.1"
|
parking_lot = "0.12.1"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"]
|
|||||||
array-bytes = "6.1"
|
array-bytes = "6.1"
|
||||||
codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] }
|
codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] }
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
libp2p = "0.51.3"
|
libp2p = "0.52.1"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../../utils/prometheus" }
|
prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../../utils/prometheus" }
|
||||||
sc-network = { version = "0.10.0-dev", path = "../" }
|
sc-network = { version = "0.10.0-dev", path = "../" }
|
||||||
|
|||||||
@@ -327,8 +327,8 @@ where
|
|||||||
fn handle_sync_event(&mut self, event: SyncEvent) {
|
fn handle_sync_event(&mut self, event: SyncEvent) {
|
||||||
match event {
|
match event {
|
||||||
SyncEvent::PeerConnected(remote) => {
|
SyncEvent::PeerConnected(remote) => {
|
||||||
let addr = iter::once(multiaddr::Protocol::P2p(remote.into()))
|
let addr =
|
||||||
.collect::<multiaddr::Multiaddr>();
|
iter::once(multiaddr::Protocol::P2p(remote)).collect::<multiaddr::Multiaddr>();
|
||||||
let result = self.network.add_peers_to_reserved_set(
|
let result = self.network.add_peers_to_reserved_set(
|
||||||
self.protocol_name.clone(),
|
self.protocol_name.clone(),
|
||||||
iter::once(addr).collect(),
|
iter::once(addr).collect(),
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ futures = "0.3.21"
|
|||||||
futures-timer = "3.0.2"
|
futures-timer = "3.0.2"
|
||||||
hyper = { version = "0.14.16", features = ["stream", "http2"] }
|
hyper = { version = "0.14.16", features = ["stream", "http2"] }
|
||||||
hyper-rustls = { version = "0.24.0", features = ["http2"] }
|
hyper-rustls = { version = "0.24.0", features = ["http2"] }
|
||||||
libp2p = "0.51.3"
|
libp2p = "0.52.1"
|
||||||
num_cpus = "1.13"
|
num_cpus = "1.13"
|
||||||
once_cell = "1.8"
|
once_cell = "1.8"
|
||||||
parking_lot = "0.12.1"
|
parking_lot = "0.12.1"
|
||||||
|
|||||||
@@ -255,7 +255,7 @@ pub async fn build_system_rpc_future<
|
|||||||
let _ = sender.send(network_service.local_peer_id().to_base58());
|
let _ = sender.send(network_service.local_peer_id().to_base58());
|
||||||
},
|
},
|
||||||
sc_rpc::system::Request::LocalListenAddresses(sender) => {
|
sc_rpc::system::Request::LocalListenAddresses(sender) => {
|
||||||
let peer_id = (network_service.local_peer_id()).into();
|
let peer_id = network_service.local_peer_id();
|
||||||
let p2p_proto_suffix = sc_network::multiaddr::Protocol::P2p(peer_id);
|
let p2p_proto_suffix = sc_network::multiaddr::Protocol::P2p(peer_id);
|
||||||
let addresses = network_service
|
let addresses = network_service
|
||||||
.listen_addresses()
|
.listen_addresses()
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = "0.4.19"
|
chrono = "0.4.19"
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
libp2p = { version = "0.51.3", features = ["dns", "tcp", "tokio", "wasm-ext", "websocket"] }
|
libp2p = { version = "0.52.1", features = ["dns", "tcp", "tokio", "wasm-ext", "websocket"] }
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
parking_lot = "0.12.1"
|
parking_lot = "0.12.1"
|
||||||
pin-project = "1.0.12"
|
pin-project = "1.0.12"
|
||||||
|
|||||||
@@ -35,10 +35,10 @@ paste = "1.0"
|
|||||||
sp-state-machine = { version = "0.28.0", default-features = false, optional = true, path = "../../primitives/state-machine" }
|
sp-state-machine = { version = "0.28.0", default-features = false, optional = true, path = "../../primitives/state-machine" }
|
||||||
bitflags = "1.3"
|
bitflags = "1.3"
|
||||||
impl-trait-for-tuples = "0.2.2"
|
impl-trait-for-tuples = "0.2.2"
|
||||||
smallvec = "1.8.0"
|
smallvec = "1.11.0"
|
||||||
log = { version = "0.4.17", default-features = false }
|
log = { version = "0.4.17", default-features = false }
|
||||||
sp-core-hashing-proc-macro = { version = "9.0.0", path = "../../primitives/core/hashing/proc-macro" }
|
sp-core-hashing-proc-macro = { version = "9.0.0", path = "../../primitives/core/hashing/proc-macro" }
|
||||||
k256 = { version = "0.13.0", default-features = false, features = ["ecdsa"] }
|
k256 = { version = "0.13.1", default-features = false, features = ["ecdsa"] }
|
||||||
environmental = { version = "1.1.4", default-features = false }
|
environmental = { version = "1.1.4", default-features = false }
|
||||||
sp-genesis-builder = { version = "0.1.0", default-features=false, path = "../../primitives/genesis-builder" }
|
sp-genesis-builder = { version = "0.1.0", default-features=false, path = "../../primitives/genesis-builder" }
|
||||||
serde_json = { version = "1.0.85", default-features = false, features = ["alloc"] }
|
serde_json = { version = "1.0.85", default-features = false, features = ["alloc"] }
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"]
|
|||||||
blake2b_simd = { version = "1.0.1", default-features = false }
|
blake2b_simd = { version = "1.0.1", default-features = false }
|
||||||
byteorder = { version = "1.3.2", default-features = false }
|
byteorder = { version = "1.3.2", default-features = false }
|
||||||
digest = { version = "0.10.3", default-features = false }
|
digest = { version = "0.10.3", default-features = false }
|
||||||
sha2 = { version = "0.10.2", default-features = false }
|
sha2 = { version = "0.10.7", default-features = false }
|
||||||
sha3 = { version = "0.10.0", default-features = false }
|
sha3 = { version = "0.10.0", default-features = false }
|
||||||
twox-hash = { version = "1.6.3", default-features = false, features = ["digest_0_10"] }
|
twox-hash = { version = "1.6.3", default-features = false, features = ["digest_0_10"] }
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ hash-db = { version = "0.16.0", default-features = false }
|
|||||||
log = { version = "0.4.17", default-features = false }
|
log = { version = "0.4.17", default-features = false }
|
||||||
parking_lot = { version = "0.12.1", optional = true }
|
parking_lot = { version = "0.12.1", optional = true }
|
||||||
rand = { version = "0.8.5", optional = true }
|
rand = { version = "0.8.5", optional = true }
|
||||||
smallvec = "1.8.0"
|
smallvec = "1.11.0"
|
||||||
thiserror = { version = "1.0.30", optional = true }
|
thiserror = { version = "1.0.30", optional = true }
|
||||||
tracing = { version = "0.1.29", optional = true }
|
tracing = { version = "0.1.29", optional = true }
|
||||||
sp-core = { version = "21.0.0", default-features = false, path = "../core" }
|
sp-core = { version = "21.0.0", default-features = false, path = "../core" }
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ x25519-dalek = { version = "2.0.0-pre.1", optional = true }
|
|||||||
curve25519-dalek = { version = "3.2", optional = true }
|
curve25519-dalek = { version = "3.2", optional = true }
|
||||||
aes-gcm = { version = "0.10", optional = true }
|
aes-gcm = { version = "0.10", optional = true }
|
||||||
hkdf = { version = "0.12.0", optional = true }
|
hkdf = { version = "0.12.0", optional = true }
|
||||||
sha2 = { version = "0.10.0", optional = true }
|
sha2 = { version = "0.10.7", optional = true }
|
||||||
rand = { version = "0.8.5", features = ["small_rng"], optional = true }
|
rand = { version = "0.8.5", features = ["small_rng"], optional = true }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"]
|
|||||||
codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] }
|
codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] }
|
||||||
scale-info = { version = "2.5.0", default-features = false, features = ["derive"] }
|
scale-info = { version = "2.5.0", default-features = false, features = ["derive"] }
|
||||||
serde = { version = "1.0.163", default-features = false, optional = true, features = ["derive", "alloc"] }
|
serde = { version = "1.0.163", default-features = false, optional = true, features = ["derive", "alloc"] }
|
||||||
smallvec = "1.8.0"
|
smallvec = "1.11.0"
|
||||||
sp-arithmetic = { version = "16.0.0", default-features = false, path = "../arithmetic" }
|
sp-arithmetic = { version = "16.0.0", default-features = false, path = "../arithmetic" }
|
||||||
sp-core = { version = "21.0.0", default-features = false, path = "../core" }
|
sp-core = { version = "21.0.0", default-features = false, path = "../core" }
|
||||||
sp-debug-derive = { version = "8.0.0", default-features = false, path = "../debug-derive" }
|
sp-debug-derive = { version = "8.0.0", default-features = false, path = "../debug-derive" }
|
||||||
|
|||||||
Reference in New Issue
Block a user