mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-20 23:15:42 +00:00
Integrate litep2p into Polkadot SDK (#2944)
[litep2p](https://github.com/altonen/litep2p) is a libp2p-compatible P2P networking library. It supports all of the features of `rust-libp2p` that are currently being utilized by Polkadot SDK. Compared to `rust-libp2p`, `litep2p` has a quite different architecture which is why the new `litep2p` network backend is only able to use a little of the existing code in `sc-network`. The design has been mainly influenced by how we'd wish to structure our networking-related code in Polkadot SDK: independent higher-levels protocols directly communicating with the network over links that support bidirectional backpressure. A good example would be `NotificationHandle`/`RequestResponseHandle` abstractions which allow, e.g., `SyncingEngine` to directly communicate with peers to announce/request blocks. I've tried running `polkadot --network-backend litep2p` with a few different peer configurations and there is a noticeable reduction in networking CPU usage. For high load (`--out-peers 200`), networking CPU usage goes down from ~110% to ~30% (80 pp) and for normal load (`--out-peers 40`), the usage goes down from ~55% to ~18% (37 pp). These should not be taken as final numbers because: a) there are still some low-hanging optimization fruits, such as enabling [receive window auto-tuning](https://github.com/libp2p/rust-yamux/pull/176), integrating `Peerset` more closely with `litep2p` or improving memory usage of the WebSocket transport b) fixing bugs/instabilities that incorrectly cause `litep2p` to do less work will increase the networking CPU usage c) verification in a more diverse set of tests/conditions is needed Nevertheless, these numbers should give an early estimate for CPU usage of the new networking backend. This PR consists of three separate changes: * introduce a generic `PeerId` (wrapper around `Multihash`) so that we don't have use `NetworkService::PeerId` in every part of the code that uses a `PeerId` * introduce `NetworkBackend` trait, implement it for the libp2p network stack and make Polkadot SDK generic over `NetworkBackend` * implement `NetworkBackend` for litep2p The new library should be considered experimental which is why `rust-libp2p` will remain as the default option for the time being. This PR currently depends on the master branch of `litep2p` but I'll cut a new release for the library once all review comments have been addresses. --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: Alexandru Vasile <alexandru.vasile@parity.io>
This commit is contained in:
@@ -16,6 +16,7 @@ parking_lot = "0.12.1"
|
||||
polkadot-primitives = { path = "../../primitives" }
|
||||
polkadot-node-primitives = { path = "../primitives" }
|
||||
sc-network = { path = "../../../substrate/client/network" }
|
||||
sc-network-types = { path = "../../../substrate/client/network/types" }
|
||||
sp-core = { path = "../../../substrate/primitives/core" }
|
||||
thiserror = { workspace = true }
|
||||
tokio = "1.37"
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
use parity_scale_codec::Encode;
|
||||
use polkadot_node_primitives::PoV;
|
||||
use polkadot_primitives::{BlakeTwo256, CandidateHash, Hash, HashT, Id as ParaId, ValidatorIndex};
|
||||
use sc_network::PeerId;
|
||||
use sc_network_types::PeerId;
|
||||
|
||||
use std::{fmt, sync::Arc};
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ use std::collections::HashSet;
|
||||
use futures::{executor, future, Future};
|
||||
|
||||
use polkadot_node_network_protocol::request_response::{IncomingRequest, ReqProtocolNames};
|
||||
use polkadot_primitives::{CoreState, Hash};
|
||||
use polkadot_primitives::{Block, CoreState, Hash};
|
||||
use sp_keystore::KeystorePtr;
|
||||
|
||||
use polkadot_node_subsystem_test_helpers as test_helpers;
|
||||
@@ -44,9 +44,14 @@ fn test_harness<T: Future<Output = ()>>(
|
||||
let genesis_hash = Hash::repeat_byte(0xff);
|
||||
let req_protocol_names = ReqProtocolNames::new(&genesis_hash, None);
|
||||
|
||||
let (pov_req_receiver, pov_req_cfg) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (chunk_req_receiver, chunk_req_cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (pov_req_receiver, pov_req_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let (chunk_req_receiver, chunk_req_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let subsystem = AvailabilityDistributionSubsystem::new(
|
||||
keystore,
|
||||
IncomingRequestReceivers { pov_req_receiver, chunk_req_receiver },
|
||||
|
||||
@@ -337,7 +337,7 @@ fn to_incoming_req(
|
||||
|
||||
IncomingRequest::new(
|
||||
// We don't really care:
|
||||
network::PeerId::random(),
|
||||
network::PeerId::random().into(),
|
||||
payload,
|
||||
tx,
|
||||
)
|
||||
|
||||
@@ -40,7 +40,7 @@ use polkadot_node_subsystem_test_helpers::{
|
||||
};
|
||||
use polkadot_node_subsystem_util::TimeoutExt;
|
||||
use polkadot_primitives::{
|
||||
AuthorityDiscoveryId, Hash, HeadData, IndexedVec, PersistedValidationData, ValidatorId,
|
||||
AuthorityDiscoveryId, Block, Hash, HeadData, IndexedVec, PersistedValidationData, ValidatorId,
|
||||
};
|
||||
use polkadot_primitives_test_helpers::{dummy_candidate_receipt, dummy_hash};
|
||||
|
||||
@@ -52,7 +52,10 @@ const GENESIS_HASH: Hash = Hash::repeat_byte(0xff);
|
||||
fn request_receiver(
|
||||
req_protocol_names: &ReqProtocolNames,
|
||||
) -> IncomingRequestReceiver<AvailableDataFetchingRequest> {
|
||||
let receiver = IncomingRequest::get_config_receiver(req_protocol_names);
|
||||
let receiver = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(req_protocol_names);
|
||||
// Don't close the sending end of the request protocol. Otherwise, the subsystem will terminate.
|
||||
std::mem::forget(receiver.1.inbound_queue);
|
||||
receiver.0
|
||||
|
||||
@@ -25,9 +25,8 @@ use parking_lot::Mutex;
|
||||
use parity_scale_codec::Encode;
|
||||
|
||||
use sc_network::{
|
||||
config::parse_addr, multiaddr::Multiaddr, types::ProtocolName, IfDisconnected, MessageSink,
|
||||
NetworkPeers, NetworkRequest, NetworkService, OutboundFailure, ReputationChange,
|
||||
RequestFailure,
|
||||
config::parse_addr, multiaddr::Multiaddr, service::traits::NetworkService, types::ProtocolName,
|
||||
IfDisconnected, MessageSink, OutboundFailure, ReputationChange, RequestFailure,
|
||||
};
|
||||
|
||||
use polkadot_node_network_protocol::{
|
||||
@@ -35,7 +34,7 @@ use polkadot_node_network_protocol::{
|
||||
request_response::{OutgoingRequest, Recipient, ReqProtocolNames, Requests},
|
||||
v1 as protocol_v1, v2 as protocol_v2, v3 as protocol_v3, PeerId,
|
||||
};
|
||||
use polkadot_primitives::{AuthorityDiscoveryId, Block, Hash};
|
||||
use polkadot_primitives::AuthorityDiscoveryId;
|
||||
|
||||
use crate::{metrics::Metrics, validator_discovery::AuthorityDiscovery, WireMessage};
|
||||
|
||||
@@ -232,13 +231,13 @@ pub trait Network: Clone + Send + 'static {
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Network for Arc<NetworkService<Block, Hash>> {
|
||||
impl Network for Arc<dyn NetworkService> {
|
||||
async fn set_reserved_peers(
|
||||
&mut self,
|
||||
protocol: ProtocolName,
|
||||
multiaddresses: HashSet<Multiaddr>,
|
||||
) -> Result<(), String> {
|
||||
NetworkService::set_reserved_peers(&**self, protocol, multiaddresses)
|
||||
<dyn NetworkService>::set_reserved_peers(&**self, protocol, multiaddresses)
|
||||
}
|
||||
|
||||
async fn remove_from_peers_set(
|
||||
@@ -246,15 +245,15 @@ impl Network for Arc<NetworkService<Block, Hash>> {
|
||||
protocol: ProtocolName,
|
||||
peers: Vec<PeerId>,
|
||||
) -> Result<(), String> {
|
||||
NetworkService::remove_peers_from_reserved_set(&**self, protocol, peers)
|
||||
<dyn NetworkService>::remove_peers_from_reserved_set(&**self, protocol, peers)
|
||||
}
|
||||
|
||||
fn report_peer(&self, who: PeerId, rep: ReputationChange) {
|
||||
NetworkService::report_peer(&**self, who, rep);
|
||||
<dyn NetworkService>::report_peer(&**self, who, rep);
|
||||
}
|
||||
|
||||
fn disconnect_peer(&self, who: PeerId, protocol: ProtocolName) {
|
||||
NetworkService::disconnect_peer(&**self, who, protocol);
|
||||
<dyn NetworkService>::disconnect_peer(&**self, who, protocol);
|
||||
}
|
||||
|
||||
async fn start_request<AD: AuthorityDiscovery>(
|
||||
@@ -289,7 +288,7 @@ impl Network for Arc<NetworkService<Block, Hash>> {
|
||||
Ok(v) => v,
|
||||
Err(_) => continue,
|
||||
};
|
||||
NetworkService::add_known_address(self, peer_id, addr);
|
||||
<dyn NetworkService>::add_known_address(&**self, peer_id, addr);
|
||||
found_peer_id = Some(peer_id);
|
||||
}
|
||||
found_peer_id
|
||||
@@ -321,8 +320,8 @@ impl Network for Arc<NetworkService<Block, Hash>> {
|
||||
"Starting request",
|
||||
);
|
||||
|
||||
NetworkService::start_request(
|
||||
self,
|
||||
<dyn NetworkService>::start_request(
|
||||
&**self,
|
||||
peer_id,
|
||||
req_protocol_names.get_name(protocol),
|
||||
payload,
|
||||
@@ -333,7 +332,7 @@ impl Network for Arc<NetworkService<Block, Hash>> {
|
||||
}
|
||||
|
||||
fn peer_role(&self, who: PeerId, handshake: Vec<u8>) -> Option<sc_network::ObservedRole> {
|
||||
NetworkService::peer_role(self, who, handshake)
|
||||
<dyn NetworkService>::peer_role(&**self, who, handshake)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -366,13 +366,13 @@ impl NotificationService for TestNotificationService {
|
||||
}
|
||||
|
||||
/// Send synchronous `notification` to `peer`.
|
||||
fn send_sync_notification(&self, _peer: &PeerId, _notification: Vec<u8>) {
|
||||
fn send_sync_notification(&mut self, _peer: &PeerId, _notification: Vec<u8>) {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
/// Send asynchronous `notification` to `peer`, allowing sender to exercise backpressure.
|
||||
async fn send_async_notification(
|
||||
&self,
|
||||
&mut self,
|
||||
_peer: &PeerId,
|
||||
_notification: Vec<u8>,
|
||||
) -> Result<(), sc_network::error::Error> {
|
||||
|
||||
@@ -45,8 +45,9 @@ use polkadot_node_subsystem::{
|
||||
use polkadot_node_subsystem_test_helpers as test_helpers;
|
||||
use polkadot_node_subsystem_util::{reputation::add_reputation, TimeoutExt};
|
||||
use polkadot_primitives::{
|
||||
AuthorityDiscoveryId, CollatorPair, ExecutorParams, GroupIndex, GroupRotationInfo, IndexedVec,
|
||||
NodeFeatures, ScheduledCore, SessionIndex, SessionInfo, ValidatorId, ValidatorIndex,
|
||||
AuthorityDiscoveryId, Block, CollatorPair, ExecutorParams, GroupIndex, GroupRotationInfo,
|
||||
IndexedVec, NodeFeatures, ScheduledCore, SessionIndex, SessionInfo, ValidatorId,
|
||||
ValidatorIndex,
|
||||
};
|
||||
use polkadot_primitives_test_helpers::TestCandidateBuilder;
|
||||
use test_helpers::mock::new_leaf;
|
||||
@@ -249,10 +250,14 @@ fn test_harness<T: Future<Output = TestHarness>>(
|
||||
let genesis_hash = Hash::repeat_byte(0xff);
|
||||
let req_protocol_names = ReqProtocolNames::new(&genesis_hash, None);
|
||||
|
||||
let (collation_req_receiver, req_v1_cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (collation_req_v2_receiver, req_v2_cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (collation_req_receiver, req_v1_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let (collation_req_v2_receiver, req_v2_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let subsystem = async {
|
||||
run_inner(
|
||||
context,
|
||||
|
||||
@@ -57,8 +57,8 @@ use polkadot_node_subsystem_test_helpers::{
|
||||
subsystem_test_harness, TestSubsystemContextHandle,
|
||||
};
|
||||
use polkadot_primitives::{
|
||||
AuthorityDiscoveryId, CandidateHash, CandidateReceipt, ExecutorParams, Hash, NodeFeatures,
|
||||
SessionIndex, SessionInfo,
|
||||
AuthorityDiscoveryId, Block, CandidateHash, CandidateReceipt, ExecutorParams, Hash,
|
||||
NodeFeatures, SessionIndex, SessionInfo,
|
||||
};
|
||||
|
||||
use self::mock::{
|
||||
@@ -879,7 +879,10 @@ where
|
||||
|
||||
let genesis_hash = Hash::repeat_byte(0xff);
|
||||
let req_protocol_names = ReqProtocolNames::new(&genesis_hash, None);
|
||||
let (req_receiver, req_cfg) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (req_receiver, req_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let subsystem = DisputeDistributionSubsystem::new(
|
||||
keystore,
|
||||
req_receiver,
|
||||
|
||||
@@ -18,7 +18,9 @@ polkadot-node-primitives = { path = "../../primitives" }
|
||||
polkadot-node-jaeger = { path = "../../jaeger" }
|
||||
parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] }
|
||||
sc-network = { path = "../../../../substrate/client/network" }
|
||||
sc-network-types = { path = "../../../../substrate/client/network/types" }
|
||||
sc-authority-discovery = { path = "../../../../substrate/client/authority-discovery" }
|
||||
sp-runtime = { path = "../../../../substrate/primitives/runtime" }
|
||||
strum = { version = "0.26.2", features = ["derive"] }
|
||||
futures = "0.3.30"
|
||||
thiserror = { workspace = true }
|
||||
|
||||
@@ -23,7 +23,8 @@ use async_trait::async_trait;
|
||||
use sc_authority_discovery::Service as AuthorityDiscoveryService;
|
||||
|
||||
use polkadot_primitives::AuthorityDiscoveryId;
|
||||
use sc_network::{Multiaddr, PeerId};
|
||||
use sc_network::Multiaddr;
|
||||
use sc_network_types::PeerId;
|
||||
|
||||
/// An abstraction over the authority discovery service.
|
||||
///
|
||||
|
||||
@@ -25,7 +25,8 @@ use std::{collections::HashMap, fmt};
|
||||
|
||||
#[doc(hidden)]
|
||||
pub use polkadot_node_jaeger as jaeger;
|
||||
pub use sc_network::{IfDisconnected, PeerId};
|
||||
pub use sc_network::IfDisconnected;
|
||||
pub use sc_network_types::PeerId;
|
||||
#[doc(hidden)]
|
||||
pub use std::sync::Arc;
|
||||
|
||||
@@ -610,7 +611,7 @@ pub mod v1 {
|
||||
///
|
||||
/// The payload is the local peer id of the node, which serves to prove that it
|
||||
/// controls the collator key it is declaring an intention to collate under.
|
||||
pub fn declare_signature_payload(peer_id: &sc_network::PeerId) -> Vec<u8> {
|
||||
pub fn declare_signature_payload(peer_id: &sc_network_types::PeerId) -> Vec<u8> {
|
||||
let mut payload = peer_id.to_bytes();
|
||||
payload.extend_from_slice(b"COLL");
|
||||
payload
|
||||
@@ -863,7 +864,7 @@ pub mod v2 {
|
||||
///
|
||||
/// The payload is the local peer id of the node, which serves to prove that it
|
||||
/// controls the collator key it is declaring an intention to collate under.
|
||||
pub fn declare_signature_payload(peer_id: &sc_network::PeerId) -> Vec<u8> {
|
||||
pub fn declare_signature_payload(peer_id: &sc_network_types::PeerId) -> Vec<u8> {
|
||||
let mut payload = peer_id.to_bytes();
|
||||
payload.extend_from_slice(b"COLL");
|
||||
payload
|
||||
|
||||
@@ -19,13 +19,14 @@
|
||||
use derive_more::Display;
|
||||
use polkadot_primitives::Hash;
|
||||
use sc_network::{
|
||||
config::{NonDefaultSetConfig, SetConfig},
|
||||
types::ProtocolName,
|
||||
NotificationService,
|
||||
config::SetConfig, peer_store::PeerStoreProvider, service::NotificationMetrics,
|
||||
types::ProtocolName, NetworkBackend, NotificationService,
|
||||
};
|
||||
use sp_runtime::traits::Block;
|
||||
use std::{
|
||||
collections::{hash_map::Entry, HashMap},
|
||||
ops::{Index, IndexMut},
|
||||
sync::Arc,
|
||||
};
|
||||
use strum::{EnumIter, IntoEnumIterator};
|
||||
|
||||
@@ -65,11 +66,13 @@ impl PeerSet {
|
||||
///
|
||||
/// Those should be used in the network configuration to register the protocols with the
|
||||
/// network service.
|
||||
pub fn get_info(
|
||||
pub fn get_info<B: Block, N: NetworkBackend<B, <B as Block>::Hash>>(
|
||||
self,
|
||||
is_authority: IsAuthority,
|
||||
peerset_protocol_names: &PeerSetProtocolNames,
|
||||
) -> (NonDefaultSetConfig, (PeerSet, Box<dyn NotificationService>)) {
|
||||
metrics: NotificationMetrics,
|
||||
peer_store_handle: Arc<dyn PeerStoreProvider>,
|
||||
) -> (N::NotificationProtocolConfig, (PeerSet, Box<dyn NotificationService>)) {
|
||||
// Networking layer relies on `get_main_name()` being the main name of the protocol
|
||||
// for peersets and connection management.
|
||||
let protocol = peerset_protocol_names.get_main_name(self);
|
||||
@@ -82,7 +85,7 @@ impl PeerSet {
|
||||
|
||||
match self {
|
||||
PeerSet::Validation => {
|
||||
let (config, notification_service) = NonDefaultSetConfig::new(
|
||||
let (config, notification_service) = N::notification_config(
|
||||
protocol,
|
||||
fallback_names,
|
||||
max_notification_size,
|
||||
@@ -97,12 +100,14 @@ impl PeerSet {
|
||||
reserved_nodes: Vec::new(),
|
||||
non_reserved_mode: sc_network::config::NonReservedPeerMode::Accept,
|
||||
},
|
||||
metrics,
|
||||
peer_store_handle,
|
||||
);
|
||||
|
||||
(config, (PeerSet::Validation, notification_service))
|
||||
},
|
||||
PeerSet::Collation => {
|
||||
let (config, notification_service) = NonDefaultSetConfig::new(
|
||||
let (config, notification_service) = N::notification_config(
|
||||
protocol,
|
||||
fallback_names,
|
||||
max_notification_size,
|
||||
@@ -119,6 +124,8 @@ impl PeerSet {
|
||||
sc_network::config::NonReservedPeerMode::Deny
|
||||
},
|
||||
},
|
||||
metrics,
|
||||
peer_store_handle,
|
||||
);
|
||||
|
||||
(config, (PeerSet::Collation, notification_service))
|
||||
@@ -207,12 +214,21 @@ impl<T> IndexMut<PeerSet> for PerPeerSet<T> {
|
||||
///
|
||||
/// Should be used during network configuration (added to `NetworkConfiguration::extra_sets`)
|
||||
/// or shortly after startup to register the protocols with the network service.
|
||||
pub fn peer_sets_info(
|
||||
pub fn peer_sets_info<B: Block, N: NetworkBackend<B, <B as Block>::Hash>>(
|
||||
is_authority: IsAuthority,
|
||||
peerset_protocol_names: &PeerSetProtocolNames,
|
||||
) -> Vec<(NonDefaultSetConfig, (PeerSet, Box<dyn NotificationService>))> {
|
||||
metrics: NotificationMetrics,
|
||||
peer_store_handle: Arc<dyn PeerStoreProvider>,
|
||||
) -> Vec<(N::NotificationProtocolConfig, (PeerSet, Box<dyn NotificationService>))> {
|
||||
PeerSet::iter()
|
||||
.map(|s| s.get_info(is_authority, &peerset_protocol_names))
|
||||
.map(|s| {
|
||||
s.get_info::<B, N>(
|
||||
is_authority,
|
||||
&peerset_protocol_names,
|
||||
metrics.clone(),
|
||||
Arc::clone(&peer_store_handle),
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
//! Error handling related code and Error/Result definitions.
|
||||
|
||||
use sc_network::PeerId;
|
||||
use sc_network_types::PeerId;
|
||||
|
||||
use parity_scale_codec::Error as DecodingError;
|
||||
|
||||
|
||||
@@ -20,7 +20,9 @@ use futures::{channel::oneshot, StreamExt};
|
||||
|
||||
use parity_scale_codec::{Decode, Encode};
|
||||
|
||||
use sc_network::{config as netconfig, config::RequestResponseConfig, PeerId};
|
||||
use sc_network::{config as netconfig, NetworkBackend};
|
||||
use sc_network_types::PeerId;
|
||||
use sp_runtime::traits::Block;
|
||||
|
||||
use super::{IsRequest, ReqProtocolNames};
|
||||
use crate::UnifiedReputationChange;
|
||||
@@ -52,10 +54,10 @@ where
|
||||
///
|
||||
/// This Register that config with substrate networking and receive incoming requests via the
|
||||
/// returned `IncomingRequestReceiver`.
|
||||
pub fn get_config_receiver(
|
||||
pub fn get_config_receiver<B: Block, N: NetworkBackend<B, <B as Block>::Hash>>(
|
||||
req_protocol_names: &ReqProtocolNames,
|
||||
) -> (IncomingRequestReceiver<Req>, RequestResponseConfig) {
|
||||
let (raw, cfg) = Req::PROTOCOL.get_config(req_protocol_names);
|
||||
) -> (IncomingRequestReceiver<Req>, N::RequestResponseProtocolConfig) {
|
||||
let (raw, cfg) = Req::PROTOCOL.get_config::<B, N>(req_protocol_names);
|
||||
(IncomingRequestReceiver { raw, phantom: PhantomData {} }, cfg)
|
||||
}
|
||||
|
||||
|
||||
@@ -52,6 +52,8 @@
|
||||
use std::{collections::HashMap, time::Duration, u64};
|
||||
|
||||
use polkadot_primitives::{MAX_CODE_SIZE, MAX_POV_SIZE};
|
||||
use sc_network::NetworkBackend;
|
||||
use sp_runtime::traits::Block;
|
||||
use strum::{EnumIter, IntoEnumIterator};
|
||||
|
||||
pub use sc_network::{config as network, config::RequestResponseConfig, ProtocolName};
|
||||
@@ -179,76 +181,76 @@ impl Protocol {
|
||||
///
|
||||
/// Returns a `ProtocolConfig` for this protocol.
|
||||
/// Use this if you plan only to send requests for this protocol.
|
||||
pub fn get_outbound_only_config(
|
||||
pub fn get_outbound_only_config<B: Block, N: NetworkBackend<B, <B as Block>::Hash>>(
|
||||
self,
|
||||
req_protocol_names: &ReqProtocolNames,
|
||||
) -> RequestResponseConfig {
|
||||
self.create_config(req_protocol_names, None)
|
||||
) -> N::RequestResponseProtocolConfig {
|
||||
self.create_config::<B, N>(req_protocol_names, None)
|
||||
}
|
||||
|
||||
/// Get a configuration for a given Request response protocol.
|
||||
///
|
||||
/// Returns a receiver for messages received on this protocol and the requested
|
||||
/// `ProtocolConfig`.
|
||||
pub fn get_config(
|
||||
pub fn get_config<B: Block, N: NetworkBackend<B, <B as Block>::Hash>>(
|
||||
self,
|
||||
req_protocol_names: &ReqProtocolNames,
|
||||
) -> (async_channel::Receiver<network::IncomingRequest>, RequestResponseConfig) {
|
||||
) -> (async_channel::Receiver<network::IncomingRequest>, N::RequestResponseProtocolConfig) {
|
||||
let (tx, rx) = async_channel::bounded(self.get_channel_size());
|
||||
let cfg = self.create_config(req_protocol_names, Some(tx));
|
||||
let cfg = self.create_config::<B, N>(req_protocol_names, Some(tx));
|
||||
(rx, cfg)
|
||||
}
|
||||
|
||||
fn create_config(
|
||||
fn create_config<B: Block, N: NetworkBackend<B, <B as Block>::Hash>>(
|
||||
self,
|
||||
req_protocol_names: &ReqProtocolNames,
|
||||
tx: Option<async_channel::Sender<network::IncomingRequest>>,
|
||||
) -> RequestResponseConfig {
|
||||
) -> N::RequestResponseProtocolConfig {
|
||||
let name = req_protocol_names.get_name(self);
|
||||
let legacy_names = self.get_legacy_name().into_iter().map(Into::into).collect();
|
||||
match self {
|
||||
Protocol::ChunkFetchingV1 => RequestResponseConfig {
|
||||
Protocol::ChunkFetchingV1 => N::request_response_config(
|
||||
name,
|
||||
fallback_names: legacy_names,
|
||||
max_request_size: 1_000,
|
||||
max_response_size: POV_RESPONSE_SIZE as u64 * 3,
|
||||
legacy_names,
|
||||
1_000,
|
||||
POV_RESPONSE_SIZE as u64 * 3,
|
||||
// We are connected to all validators:
|
||||
request_timeout: CHUNK_REQUEST_TIMEOUT,
|
||||
inbound_queue: tx,
|
||||
},
|
||||
CHUNK_REQUEST_TIMEOUT,
|
||||
tx,
|
||||
),
|
||||
Protocol::CollationFetchingV1 | Protocol::CollationFetchingV2 =>
|
||||
RequestResponseConfig {
|
||||
N::request_response_config(
|
||||
name,
|
||||
fallback_names: legacy_names,
|
||||
max_request_size: 1_000,
|
||||
max_response_size: POV_RESPONSE_SIZE,
|
||||
legacy_names,
|
||||
1_000,
|
||||
POV_RESPONSE_SIZE,
|
||||
// Taken from initial implementation in collator protocol:
|
||||
request_timeout: POV_REQUEST_TIMEOUT_CONNECTED,
|
||||
inbound_queue: tx,
|
||||
},
|
||||
Protocol::PoVFetchingV1 => RequestResponseConfig {
|
||||
POV_REQUEST_TIMEOUT_CONNECTED,
|
||||
tx,
|
||||
),
|
||||
Protocol::PoVFetchingV1 => N::request_response_config(
|
||||
name,
|
||||
fallback_names: legacy_names,
|
||||
max_request_size: 1_000,
|
||||
max_response_size: POV_RESPONSE_SIZE,
|
||||
request_timeout: POV_REQUEST_TIMEOUT_CONNECTED,
|
||||
inbound_queue: tx,
|
||||
},
|
||||
Protocol::AvailableDataFetchingV1 => RequestResponseConfig {
|
||||
legacy_names,
|
||||
1_000,
|
||||
POV_RESPONSE_SIZE,
|
||||
POV_REQUEST_TIMEOUT_CONNECTED,
|
||||
tx,
|
||||
),
|
||||
Protocol::AvailableDataFetchingV1 => N::request_response_config(
|
||||
name,
|
||||
fallback_names: legacy_names,
|
||||
max_request_size: 1_000,
|
||||
legacy_names,
|
||||
1_000,
|
||||
// Available data size is dominated by the PoV size.
|
||||
max_response_size: POV_RESPONSE_SIZE,
|
||||
request_timeout: POV_REQUEST_TIMEOUT_CONNECTED,
|
||||
inbound_queue: tx,
|
||||
},
|
||||
Protocol::StatementFetchingV1 => RequestResponseConfig {
|
||||
POV_RESPONSE_SIZE,
|
||||
POV_REQUEST_TIMEOUT_CONNECTED,
|
||||
tx,
|
||||
),
|
||||
Protocol::StatementFetchingV1 => N::request_response_config(
|
||||
name,
|
||||
fallback_names: legacy_names,
|
||||
max_request_size: 1_000,
|
||||
legacy_names,
|
||||
1_000,
|
||||
// Available data size is dominated code size.
|
||||
max_response_size: STATEMENT_RESPONSE_SIZE,
|
||||
STATEMENT_RESPONSE_SIZE,
|
||||
// We need statement fetching to be fast and will try our best at the responding
|
||||
// side to answer requests within that timeout, assuming a bandwidth of 500Mbit/s
|
||||
// - which is the recommended minimum bandwidth for nodes on Kusama as of April
|
||||
@@ -258,27 +260,27 @@ impl Protocol {
|
||||
// waiting for timeout on an overloaded node. Fetches from slow nodes will likely
|
||||
// fail, but this is desired, so we can quickly move on to a faster one - we should
|
||||
// also decrease its reputation.
|
||||
request_timeout: Duration::from_secs(1),
|
||||
inbound_queue: tx,
|
||||
},
|
||||
Protocol::DisputeSendingV1 => RequestResponseConfig {
|
||||
Duration::from_secs(1),
|
||||
tx,
|
||||
),
|
||||
Protocol::DisputeSendingV1 => N::request_response_config(
|
||||
name,
|
||||
fallback_names: legacy_names,
|
||||
max_request_size: 1_000,
|
||||
legacy_names,
|
||||
1_000,
|
||||
// Responses are just confirmation, in essence not even a bit. So 100 seems
|
||||
// plenty.
|
||||
max_response_size: 100,
|
||||
request_timeout: DISPUTE_REQUEST_TIMEOUT,
|
||||
inbound_queue: tx,
|
||||
},
|
||||
Protocol::AttestedCandidateV2 => RequestResponseConfig {
|
||||
100,
|
||||
DISPUTE_REQUEST_TIMEOUT,
|
||||
tx,
|
||||
),
|
||||
Protocol::AttestedCandidateV2 => N::request_response_config(
|
||||
name,
|
||||
fallback_names: legacy_names,
|
||||
max_request_size: 1_000,
|
||||
max_response_size: ATTESTED_CANDIDATE_RESPONSE_SIZE,
|
||||
request_timeout: ATTESTED_CANDIDATE_TIMEOUT,
|
||||
inbound_queue: tx,
|
||||
},
|
||||
legacy_names,
|
||||
1_000,
|
||||
ATTESTED_CANDIDATE_RESPONSE_SIZE,
|
||||
ATTESTED_CANDIDATE_TIMEOUT,
|
||||
tx,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ use network::ProtocolName;
|
||||
use parity_scale_codec::{Decode, Encode, Error as DecodingError};
|
||||
|
||||
use sc_network as network;
|
||||
use sc_network::PeerId;
|
||||
use sc_network_types::PeerId;
|
||||
|
||||
use polkadot_primitives::AuthorityDiscoveryId;
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ use polkadot_node_subsystem::{
|
||||
};
|
||||
use polkadot_node_subsystem_test_helpers::mock::{make_ferdie_keystore, new_leaf};
|
||||
use polkadot_primitives::{
|
||||
ExecutorParams, GroupIndex, Hash, HeadData, Id as ParaId, IndexedVec, NodeFeatures,
|
||||
Block, ExecutorParams, GroupIndex, Hash, HeadData, Id as ParaId, IndexedVec, NodeFeatures,
|
||||
SessionInfo, ValidationCode,
|
||||
};
|
||||
use polkadot_primitives_test_helpers::{
|
||||
@@ -768,8 +768,14 @@ fn receiving_from_one_sends_to_another_and_to_candidate_backing() {
|
||||
let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool);
|
||||
|
||||
let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
|
||||
let bg = async move {
|
||||
let s = StatementDistributionSubsystem {
|
||||
@@ -1016,9 +1022,14 @@ fn receiving_large_statement_from_one_sends_to_another_and_to_candidate_backing(
|
||||
let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool);
|
||||
|
||||
let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None);
|
||||
let (statement_req_receiver, mut req_cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (statement_req_receiver, mut req_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
|
||||
let bg = async move {
|
||||
let s = StatementDistributionSubsystem {
|
||||
@@ -1554,8 +1565,14 @@ fn delay_reputation_changes() {
|
||||
let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool);
|
||||
|
||||
let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
|
||||
let reputation_interval = Duration::from_millis(100);
|
||||
|
||||
@@ -2044,9 +2061,14 @@ fn share_prioritizes_backing_group() {
|
||||
let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool);
|
||||
|
||||
let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None);
|
||||
let (statement_req_receiver, mut req_cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (statement_req_receiver, mut req_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
|
||||
let bg = async move {
|
||||
let s = StatementDistributionSubsystem {
|
||||
@@ -2377,8 +2399,14 @@ fn peer_cant_flood_with_large_statements() {
|
||||
let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool);
|
||||
|
||||
let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let bg = async move {
|
||||
let s = StatementDistributionSubsystem {
|
||||
keystore: make_ferdie_keystore(),
|
||||
@@ -2610,8 +2638,14 @@ fn handle_multiple_seconded_statements() {
|
||||
let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool);
|
||||
|
||||
let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
|
||||
let virtual_overseer_fut = async move {
|
||||
let s = StatementDistributionSubsystem {
|
||||
|
||||
@@ -33,7 +33,7 @@ use polkadot_node_subsystem::messages::{
|
||||
use polkadot_node_subsystem_test_helpers as test_helpers;
|
||||
use polkadot_node_subsystem_util::TimeoutExt;
|
||||
use polkadot_primitives::{
|
||||
AssignmentPair, AsyncBackingParams, BlockNumber, CommittedCandidateReceipt, CoreState,
|
||||
AssignmentPair, AsyncBackingParams, Block, BlockNumber, CommittedCandidateReceipt, CoreState,
|
||||
GroupRotationInfo, HeadData, Header, IndexedVec, PersistedValidationData, ScheduledCore,
|
||||
SessionIndex, SessionInfo, ValidatorPair,
|
||||
};
|
||||
@@ -359,9 +359,14 @@ fn test_harness<T: Future<Output = VirtualOverseer>>(
|
||||
Arc::new(LocalKeystore::in_memory()) as KeystorePtr
|
||||
};
|
||||
let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (candidate_req_receiver, req_cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let (candidate_req_receiver, req_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&req_protocol_names);
|
||||
let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(0);
|
||||
|
||||
let test_state = TestState::from_config(config, req_cfg.inbound_queue.unwrap(), &mut rng);
|
||||
|
||||
@@ -655,7 +655,7 @@ pub struct NewFull {
|
||||
pub task_manager: TaskManager,
|
||||
pub client: Arc<FullClient>,
|
||||
pub overseer_handle: Option<Handle>,
|
||||
pub network: Arc<sc_network::NetworkService<Block, <Block as BlockT>::Hash>>,
|
||||
pub network: Arc<dyn sc_network::service::traits::NetworkService>,
|
||||
pub sync_service: Arc<sc_network_sync::SyncingService<Block>>,
|
||||
pub rpc_handlers: RpcHandlers,
|
||||
pub backend: Arc<FullBackend>,
|
||||
@@ -719,7 +719,10 @@ pub const AVAILABILITY_CONFIG: AvailabilityConfig = AvailabilityConfig {
|
||||
/// searched. If the path points to an executable rather then directory, that executable is used
|
||||
/// both as preparation and execution worker (supposed to be used for tests only).
|
||||
#[cfg(feature = "full-node")]
|
||||
pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
pub fn new_full<
|
||||
OverseerGenerator: OverseerGen,
|
||||
Network: sc_network::NetworkBackend<Block, <Block as BlockT>::Hash>,
|
||||
>(
|
||||
mut config: Configuration,
|
||||
NewFullParams {
|
||||
is_parachain_node,
|
||||
@@ -805,19 +808,29 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
other: (rpc_extensions_builder, import_setup, rpc_setup, slot_duration, mut telemetry),
|
||||
} = new_partial::<SelectRelayChain<_>>(&mut config, basics, select_chain)?;
|
||||
|
||||
let metrics = Network::register_notification_metrics(
|
||||
config.prometheus_config.as_ref().map(|cfg| &cfg.registry),
|
||||
);
|
||||
let shared_voter_state = rpc_setup;
|
||||
let auth_disc_publish_non_global_ips = config.network.allow_non_globals_in_dht;
|
||||
let auth_disc_public_addresses = config.network.public_addresses.clone();
|
||||
let mut net_config = sc_network::config::FullNetworkConfiguration::new(&config.network);
|
||||
|
||||
let mut net_config =
|
||||
sc_network::config::FullNetworkConfiguration::<_, _, Network>::new(&config.network);
|
||||
|
||||
let genesis_hash = client.block_hash(0).ok().flatten().expect("Genesis block exists; qed");
|
||||
let peer_store_handle = net_config.peer_store_handle();
|
||||
|
||||
// Note: GrandPa is pushed before the Polkadot-specific protocols. This doesn't change
|
||||
// anything in terms of behaviour, but makes the logs more consistent with the other
|
||||
// Substrate nodes.
|
||||
let grandpa_protocol_name = grandpa::protocol_standard_name(&genesis_hash, &config.chain_spec);
|
||||
let (grandpa_protocol_config, grandpa_notification_service) =
|
||||
grandpa::grandpa_peers_set_config(grandpa_protocol_name.clone());
|
||||
grandpa::grandpa_peers_set_config::<_, Network>(
|
||||
grandpa_protocol_name.clone(),
|
||||
metrics.clone(),
|
||||
Arc::clone(&peer_store_handle),
|
||||
);
|
||||
net_config.add_notification_protocol(grandpa_protocol_config);
|
||||
|
||||
let beefy_gossip_proto_name =
|
||||
@@ -825,7 +838,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
// `beefy_on_demand_justifications_handler` is given to `beefy-gadget` task to be run,
|
||||
// while `beefy_req_resp_cfg` is added to `config.network.request_response_protocols`.
|
||||
let (beefy_on_demand_justifications_handler, beefy_req_resp_cfg) =
|
||||
beefy::communication::request_response::BeefyJustifsRequestHandler::new(
|
||||
beefy::communication::request_response::BeefyJustifsRequestHandler::new::<_, Network>(
|
||||
&genesis_hash,
|
||||
config.chain_spec.fork_id(),
|
||||
client.clone(),
|
||||
@@ -835,7 +848,11 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
false => None,
|
||||
true => {
|
||||
let (beefy_notification_config, beefy_notification_service) =
|
||||
beefy::communication::beefy_peers_set_config(beefy_gossip_proto_name.clone());
|
||||
beefy::communication::beefy_peers_set_config::<_, Network>(
|
||||
beefy_gossip_proto_name.clone(),
|
||||
metrics.clone(),
|
||||
Arc::clone(&peer_store_handle),
|
||||
);
|
||||
|
||||
net_config.add_notification_protocol(beefy_notification_config);
|
||||
net_config.add_request_response_protocol(beefy_req_resp_cfg);
|
||||
@@ -857,13 +874,18 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
use polkadot_network_bridge::{peer_sets_info, IsAuthority};
|
||||
let is_authority = if role.is_authority() { IsAuthority::Yes } else { IsAuthority::No };
|
||||
|
||||
peer_sets_info(is_authority, &peerset_protocol_names)
|
||||
.into_iter()
|
||||
.map(|(config, (peerset, service))| {
|
||||
net_config.add_notification_protocol(config);
|
||||
(peerset, service)
|
||||
})
|
||||
.collect::<HashMap<PeerSet, Box<dyn sc_network::NotificationService>>>()
|
||||
peer_sets_info::<_, Network>(
|
||||
is_authority,
|
||||
&peerset_protocol_names,
|
||||
metrics.clone(),
|
||||
Arc::clone(&peer_store_handle),
|
||||
)
|
||||
.into_iter()
|
||||
.map(|(config, (peerset, service))| {
|
||||
net_config.add_notification_protocol(config);
|
||||
(peerset, service)
|
||||
})
|
||||
.collect::<HashMap<PeerSet, Box<dyn sc_network::NotificationService>>>()
|
||||
} else {
|
||||
std::collections::HashMap::new()
|
||||
};
|
||||
@@ -871,17 +893,19 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
let req_protocol_names = ReqProtocolNames::new(&genesis_hash, config.chain_spec.fork_id());
|
||||
|
||||
let (collation_req_v1_receiver, cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names);
|
||||
net_config.add_request_response_protocol(cfg);
|
||||
let (collation_req_v2_receiver, cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names);
|
||||
net_config.add_request_response_protocol(cfg);
|
||||
let (available_data_req_receiver, cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names);
|
||||
net_config.add_request_response_protocol(cfg);
|
||||
let (pov_req_receiver, cfg) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (pov_req_receiver, cfg) =
|
||||
IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names);
|
||||
net_config.add_request_response_protocol(cfg);
|
||||
let (chunk_req_receiver, cfg) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (chunk_req_receiver, cfg) =
|
||||
IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names);
|
||||
net_config.add_request_response_protocol(cfg);
|
||||
|
||||
let grandpa_hard_forks = if config.chain_spec.is_kusama() {
|
||||
@@ -924,12 +948,13 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
None
|
||||
};
|
||||
let (statement_req_receiver, cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names);
|
||||
net_config.add_request_response_protocol(cfg);
|
||||
let (candidate_req_v2_receiver, cfg) =
|
||||
IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names);
|
||||
net_config.add_request_response_protocol(cfg);
|
||||
let (dispute_req_receiver, cfg) = IncomingRequest::get_config_receiver(&req_protocol_names);
|
||||
let (dispute_req_receiver, cfg) =
|
||||
IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names);
|
||||
net_config.add_request_response_protocol(cfg);
|
||||
let approval_voting_config = ApprovalVotingConfig {
|
||||
col_approval_data: parachains_db::REAL_COLUMNS.col_approval_data,
|
||||
@@ -970,6 +995,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
block_announce_validator_builder: None,
|
||||
warp_sync_params: Some(WarpSyncParams::WithProvider(warp_sync)),
|
||||
block_relay: None,
|
||||
metrics,
|
||||
})?;
|
||||
|
||||
if config.offchain_worker.enabled {
|
||||
@@ -985,7 +1011,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
transaction_pool: Some(OffchainTransactionPoolFactory::new(
|
||||
transaction_pool.clone(),
|
||||
)),
|
||||
network_provider: network.clone(),
|
||||
network_provider: Arc::new(network.clone()),
|
||||
is_validator: role.is_authority(),
|
||||
enable_http_requests: false,
|
||||
custom_extensions: move |_| vec![],
|
||||
@@ -1068,7 +1094,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
..Default::default()
|
||||
},
|
||||
client.clone(),
|
||||
network.clone(),
|
||||
Arc::new(network.clone()),
|
||||
Box::pin(dht_event_stream),
|
||||
authority_discovery_role,
|
||||
prometheus_registry.clone(),
|
||||
@@ -1214,7 +1240,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
if let Some(notification_service) = beefy_notification_service {
|
||||
let justifications_protocol_name = beefy_on_demand_justifications_handler.protocol_name();
|
||||
let network_params = beefy::BeefyNetworkParams {
|
||||
network: network.clone(),
|
||||
network: Arc::new(network.clone()),
|
||||
sync: sync_service.clone(),
|
||||
gossip_protocol_name: beefy_gossip_proto_name,
|
||||
justifications_protocol_name,
|
||||
@@ -1383,7 +1409,12 @@ pub fn build_full<OverseerGenerator: OverseerGen>(
|
||||
capacity
|
||||
});
|
||||
|
||||
new_full(config, params)
|
||||
match config.network.network_backend {
|
||||
sc_network::config::NetworkBackendType::Libp2p =>
|
||||
new_full::<_, sc_network::NetworkWorker<Block, Hash>>(config, params),
|
||||
sc_network::config::NetworkBackendType::Litep2p =>
|
||||
new_full::<_, sc_network::Litep2pNetworkBackend>(config, params),
|
||||
}
|
||||
}
|
||||
|
||||
/// Reverts the node state down to at most the last finalized block.
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use super::{Block, Error, Hash, IsParachainNode, Registry};
|
||||
use super::{Error, IsParachainNode, Registry};
|
||||
use polkadot_node_subsystem_types::{ChainApiBackend, RuntimeApiSubsystemClient};
|
||||
use polkadot_overseer::{DummySubsystem, InitializedOverseerBuilder, SubsystemError};
|
||||
use sp_core::traits::SpawnNamed;
|
||||
@@ -80,7 +80,7 @@ where
|
||||
/// Runtime client generic, providing the `ProvideRuntimeApi` trait besides others.
|
||||
pub runtime_client: Arc<RuntimeClient>,
|
||||
/// Underlying network service implementation.
|
||||
pub network_service: Arc<sc_network::NetworkService<Block, Hash>>,
|
||||
pub network_service: Arc<dyn sc_network::service::traits::NetworkService>,
|
||||
/// Underlying syncing service implementation.
|
||||
pub sync_service: Arc<dyn consensus_common::SyncOracle + Send + Sync>,
|
||||
/// Underlying authority discovery service.
|
||||
@@ -183,11 +183,11 @@ pub fn validator_overseer_builder<Spawner, RuntimeClient>(
|
||||
RuntimeApiSubsystem<RuntimeClient>,
|
||||
AvailabilityStoreSubsystem,
|
||||
NetworkBridgeRxSubsystem<
|
||||
Arc<sc_network::NetworkService<Block, Hash>>,
|
||||
Arc<dyn sc_network::service::traits::NetworkService>,
|
||||
AuthorityDiscoveryService,
|
||||
>,
|
||||
NetworkBridgeTxSubsystem<
|
||||
Arc<sc_network::NetworkService<Block, Hash>>,
|
||||
Arc<dyn sc_network::service::traits::NetworkService>,
|
||||
AuthorityDiscoveryService,
|
||||
>,
|
||||
ChainApiSubsystem<RuntimeClient>,
|
||||
@@ -369,11 +369,11 @@ pub fn collator_overseer_builder<Spawner, RuntimeClient>(
|
||||
RuntimeApiSubsystem<RuntimeClient>,
|
||||
DummySubsystem,
|
||||
NetworkBridgeRxSubsystem<
|
||||
Arc<sc_network::NetworkService<Block, Hash>>,
|
||||
Arc<dyn sc_network::service::traits::NetworkService>,
|
||||
AuthorityDiscoveryService,
|
||||
>,
|
||||
NetworkBridgeTxSubsystem<
|
||||
Arc<sc_network::NetworkService<Block, Hash>>,
|
||||
Arc<dyn sc_network::service::traits::NetworkService>,
|
||||
AuthorityDiscoveryService,
|
||||
>,
|
||||
ChainApiSubsystem<RuntimeClient>,
|
||||
|
||||
@@ -62,6 +62,7 @@ polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" }
|
||||
sp-keyring = { path = "../../../substrate/primitives/keyring" }
|
||||
sp-application-crypto = { path = "../../../substrate/primitives/application-crypto" }
|
||||
sc-network = { path = "../../../substrate/client/network" }
|
||||
sc-network-types = { path = "../../../substrate/client/network/types" }
|
||||
sc-service = { path = "../../../substrate/client/service" }
|
||||
sp-consensus = { path = "../../../substrate/primitives/consensus/common" }
|
||||
polkadot-node-metrics = { path = "../metrics" }
|
||||
|
||||
@@ -32,7 +32,7 @@ use polkadot_primitives::{
|
||||
use polkadot_primitives_test_helpers::dummy_candidate_receipt_bad_sig;
|
||||
use rand::{seq::SliceRandom, SeedableRng};
|
||||
use rand_chacha::ChaCha20Rng;
|
||||
use sc_network::PeerId;
|
||||
use sc_network_types::PeerId;
|
||||
use sp_consensus_babe::{
|
||||
digests::{CompatibleDigestItem, PreDigest, SecondaryVRFPreDigest},
|
||||
AllowedSlots, BabeEpochConfiguration, Epoch as BabeEpoch, VrfSignature, VrfTranscript,
|
||||
|
||||
@@ -48,7 +48,7 @@ use rand::{seq::SliceRandom, RngCore, SeedableRng};
|
||||
use rand_chacha::ChaCha20Rng;
|
||||
use rand_distr::{Distribution, Normal};
|
||||
use sc_keystore::LocalKeystore;
|
||||
use sc_network::PeerId;
|
||||
use sc_network_types::PeerId;
|
||||
use sc_service::SpawnTaskHandle;
|
||||
use sha1::Digest;
|
||||
use sp_application_crypto::AppCrypto;
|
||||
|
||||
@@ -22,7 +22,7 @@ use itertools::Itertools;
|
||||
use parity_scale_codec::{Decode, Encode};
|
||||
use polkadot_node_network_protocol::v3 as protocol_v3;
|
||||
use polkadot_primitives::{CandidateIndex, Hash, ValidatorIndex};
|
||||
use sc_network::PeerId;
|
||||
use sc_network_types::PeerId;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
|
||||
#[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)]
|
||||
|
||||
@@ -51,8 +51,9 @@ use polkadot_node_subsystem_types::{
|
||||
Span,
|
||||
};
|
||||
use polkadot_overseer::{metrics::Metrics as OverseerMetrics, Handle as OverseerHandle};
|
||||
use polkadot_primitives::GroupIndex;
|
||||
use polkadot_primitives::{Block, GroupIndex, Hash};
|
||||
use sc_network::request_responses::{IncomingRequest as RawIncomingRequest, ProtocolConfig};
|
||||
|
||||
use sc_service::SpawnTaskHandle;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::{ops::Sub, sync::Arc, time::Instant};
|
||||
@@ -140,20 +141,32 @@ pub fn prepare_test(
|
||||
mode: TestDataAvailability,
|
||||
with_prometheus_endpoint: bool,
|
||||
) -> (TestEnvironment, Vec<ProtocolConfig>) {
|
||||
let (collation_req_receiver, collation_req_cfg) =
|
||||
IncomingRequest::get_config_receiver(&ReqProtocolNames::new(GENESIS_HASH, None));
|
||||
let (pov_req_receiver, pov_req_cfg) =
|
||||
IncomingRequest::get_config_receiver(&ReqProtocolNames::new(GENESIS_HASH, None));
|
||||
let (chunk_req_receiver, chunk_req_cfg) =
|
||||
IncomingRequest::get_config_receiver(&ReqProtocolNames::new(GENESIS_HASH, None));
|
||||
let req_cfgs = vec![collation_req_cfg, pov_req_cfg];
|
||||
|
||||
let dependencies = TestEnvironmentDependencies::default();
|
||||
let availability_state = NetworkAvailabilityState {
|
||||
candidate_hashes: state.candidate_hashes.clone(),
|
||||
available_data: state.available_data.clone(),
|
||||
chunks: state.chunks.clone(),
|
||||
};
|
||||
|
||||
let mut req_cfgs = Vec::new();
|
||||
|
||||
let (collation_req_receiver, collation_req_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&ReqProtocolNames::new(GENESIS_HASH, None));
|
||||
req_cfgs.push(collation_req_cfg);
|
||||
|
||||
let (pov_req_receiver, pov_req_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&ReqProtocolNames::new(GENESIS_HASH, None));
|
||||
|
||||
let (chunk_req_receiver, chunk_req_cfg) = IncomingRequest::get_config_receiver::<
|
||||
Block,
|
||||
sc_network::NetworkWorker<Block, Hash>,
|
||||
>(&ReqProtocolNames::new(GENESIS_HASH, None));
|
||||
req_cfgs.push(pov_req_cfg);
|
||||
|
||||
let (network, network_interface, network_receiver) = new_network(
|
||||
&state.config,
|
||||
&dependencies,
|
||||
|
||||
@@ -21,7 +21,7 @@ use itertools::Itertools;
|
||||
use polkadot_primitives::{AssignmentId, AuthorityDiscoveryId, ValidatorId};
|
||||
use rand::thread_rng;
|
||||
use rand_distr::{Distribution, Normal, Uniform};
|
||||
use sc_network::PeerId;
|
||||
use sc_network_types::PeerId;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sp_consensus_babe::AuthorityId;
|
||||
use std::collections::HashMap;
|
||||
|
||||
@@ -67,8 +67,9 @@ use prometheus_endpoint::U64;
|
||||
use rand::{seq::SliceRandom, thread_rng};
|
||||
use sc_network::{
|
||||
request_responses::{IncomingRequest, OutgoingResponse},
|
||||
PeerId, RequestFailure,
|
||||
RequestFailure,
|
||||
};
|
||||
use sc_network_types::PeerId;
|
||||
use sc_service::SpawnTaskHandle;
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
|
||||
@@ -19,6 +19,7 @@ polkadot-statement-table = { path = "../../statement-table" }
|
||||
polkadot-node-jaeger = { path = "../jaeger" }
|
||||
orchestra = { version = "0.3.5", default-features = false, features = ["futures_channel"] }
|
||||
sc-network = { path = "../../../substrate/client/network" }
|
||||
sc-network-types = { path = "../../../substrate/client/network/types" }
|
||||
sp-api = { path = "../../../substrate/primitives/api" }
|
||||
sp-blockchain = { path = "../../../substrate/primitives/blockchain" }
|
||||
sp-consensus-babe = { path = "../../../substrate/primitives/consensus/babe" }
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
|
||||
use std::{collections::HashSet, convert::TryFrom};
|
||||
|
||||
pub use sc_network::{PeerId, ReputationChange};
|
||||
pub use sc_network::ReputationChange;
|
||||
pub use sc_network_types::PeerId;
|
||||
|
||||
use polkadot_node_network_protocol::{
|
||||
grid_topology::SessionGridTopology, peer_set::ProtocolVersion, ObservedRole, OurView, View,
|
||||
|
||||
@@ -79,24 +79,46 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
|
||||
) -> Result<NewFull, Error> {
|
||||
let workers_path = Some(workers_path.unwrap_or_else(get_relative_workers_path_for_test));
|
||||
|
||||
polkadot_service::new_full(
|
||||
config,
|
||||
polkadot_service::NewFullParams {
|
||||
is_parachain_node,
|
||||
enable_beefy: true,
|
||||
force_authoring_backoff: false,
|
||||
jaeger_agent: None,
|
||||
telemetry_worker_handle: None,
|
||||
node_version: None,
|
||||
secure_validator_mode: false,
|
||||
workers_path,
|
||||
workers_names: None,
|
||||
overseer_gen,
|
||||
overseer_message_channel_capacity_override: None,
|
||||
malus_finality_delay: None,
|
||||
hwbench: None,
|
||||
},
|
||||
)
|
||||
match config.network.network_backend {
|
||||
sc_network::config::NetworkBackendType::Libp2p =>
|
||||
polkadot_service::new_full::<_, sc_network::NetworkWorker<_, _>>(
|
||||
config,
|
||||
polkadot_service::NewFullParams {
|
||||
is_parachain_node,
|
||||
enable_beefy: true,
|
||||
force_authoring_backoff: false,
|
||||
jaeger_agent: None,
|
||||
telemetry_worker_handle: None,
|
||||
node_version: None,
|
||||
secure_validator_mode: false,
|
||||
workers_path,
|
||||
workers_names: None,
|
||||
overseer_gen,
|
||||
overseer_message_channel_capacity_override: None,
|
||||
malus_finality_delay: None,
|
||||
hwbench: None,
|
||||
},
|
||||
),
|
||||
sc_network::config::NetworkBackendType::Litep2p =>
|
||||
polkadot_service::new_full::<_, sc_network::Litep2pNetworkBackend>(
|
||||
config,
|
||||
polkadot_service::NewFullParams {
|
||||
is_parachain_node,
|
||||
enable_beefy: true,
|
||||
force_authoring_backoff: false,
|
||||
jaeger_agent: None,
|
||||
telemetry_worker_handle: None,
|
||||
node_version: None,
|
||||
secure_validator_mode: false,
|
||||
workers_path,
|
||||
workers_names: None,
|
||||
overseer_gen,
|
||||
overseer_message_channel_capacity_override: None,
|
||||
malus_finality_delay: None,
|
||||
hwbench: None,
|
||||
},
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn get_relative_workers_path_for_test() -> PathBuf {
|
||||
|
||||
Reference in New Issue
Block a user