mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 10:31:04 +00:00
Rework the event system of sc-network (#1370)
This commit introduces a new concept called `NotificationService` which allows Polkadot protocols to communicate with the underlying notification protocol implementation directly, without routing events through `NetworkWorker`. This implies that each protocol has its own service which it uses to communicate with remote peers and that each `NotificationService` is unique with respect to the underlying notification protocol, meaning `NotificationService` for the transaction protocol can only be used to send and receive transaction-related notifications. The `NotificationService` concept introduces two additional benefits: * allow protocols to start using custom handshakes * allow protocols to accept/reject inbound peers Previously the validation of inbound connections was solely the responsibility of `ProtocolController`. This caused issues with light peers and `SyncingEngine` as `ProtocolController` would accept more peers than `SyncingEngine` could accept which caused peers to have differing views of their own states. `SyncingEngine` would reject excess peers but these rejections were not properly communicated to those peers causing them to assume that they were accepted. With `NotificationService`, the local handshake is not sent to remote peer if peer is rejected which allows it to detect that it was rejected. This commit also deprecates the use of `NetworkEventStream` for all notification-related events and going forward only DHT events are provided through `NetworkEventStream`. If protocols wish to follow each other's events, they must introduce additional abtractions, as is done for GRANDPA and transactions protocols by following the syncing protocol through `SyncEventStream`. Fixes https://github.com/paritytech/polkadot-sdk/issues/512 Fixes https://github.com/paritytech/polkadot-sdk/issues/514 Fixes https://github.com/paritytech/polkadot-sdk/issues/515 Fixes https://github.com/paritytech/polkadot-sdk/issues/554 Fixes https://github.com/paritytech/polkadot-sdk/issues/556 --- These changes are transferred from https://github.com/paritytech/substrate/pull/14197 but there are no functional changes compared to that PR --------- Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com>
This commit is contained in:
@@ -753,6 +753,11 @@ where
|
||||
}
|
||||
|
||||
let protocol_id = config.protocol_id();
|
||||
let genesis_hash = client
|
||||
.block_hash(0u32.into())
|
||||
.ok()
|
||||
.flatten()
|
||||
.expect("Genesis block exists; qed");
|
||||
|
||||
let block_announce_validator = if let Some(f) = block_announce_validator_builder {
|
||||
f(client.clone())
|
||||
@@ -802,11 +807,7 @@ where
|
||||
// Allow both outgoing and incoming requests.
|
||||
let (handler, protocol_config) = WarpSyncRequestHandler::new(
|
||||
protocol_id.clone(),
|
||||
client
|
||||
.block_hash(0u32.into())
|
||||
.ok()
|
||||
.flatten()
|
||||
.expect("Genesis block exists; qed"),
|
||||
genesis_hash,
|
||||
config.chain_spec.fork_id(),
|
||||
warp_with_provider.clone(),
|
||||
);
|
||||
@@ -845,17 +846,13 @@ where
|
||||
}
|
||||
|
||||
// create transactions protocol and add it to the list of supported protocols of
|
||||
// `network_params`
|
||||
let transactions_handler_proto = sc_network_transactions::TransactionsHandlerPrototype::new(
|
||||
protocol_id.clone(),
|
||||
client
|
||||
.block_hash(0u32.into())
|
||||
.ok()
|
||||
.flatten()
|
||||
.expect("Genesis block exists; qed"),
|
||||
config.chain_spec.fork_id(),
|
||||
);
|
||||
net_config.add_notification_protocol(transactions_handler_proto.set_config());
|
||||
let (transactions_handler_proto, transactions_config) =
|
||||
sc_network_transactions::TransactionsHandlerPrototype::new(
|
||||
protocol_id.clone(),
|
||||
genesis_hash,
|
||||
config.chain_spec.fork_id(),
|
||||
);
|
||||
net_config.add_notification_protocol(transactions_config);
|
||||
|
||||
// Create `PeerStore` and initialize it with bootnode peer ids.
|
||||
let peer_store = PeerStore::new(
|
||||
@@ -869,7 +866,6 @@ where
|
||||
let peer_store_handle = peer_store.handle();
|
||||
spawn_handle.spawn("peer-store", Some("networking"), peer_store.run());
|
||||
|
||||
let (tx, rx) = sc_utils::mpsc::tracing_unbounded("mpsc_syncing_engine_protocol", 100_000);
|
||||
let (engine, sync_service, block_announce_config) = SyncingEngine::new(
|
||||
Roles::from(&config.role),
|
||||
client.clone(),
|
||||
@@ -884,7 +880,7 @@ where
|
||||
block_downloader,
|
||||
state_request_protocol_name,
|
||||
warp_request_protocol_name,
|
||||
rx,
|
||||
peer_store_handle.clone(),
|
||||
)?;
|
||||
let sync_service_import_queue = sync_service.clone();
|
||||
let sync_service = Arc::new(sync_service);
|
||||
@@ -905,7 +901,6 @@ where
|
||||
fork_id: config.chain_spec.fork_id().map(ToOwned::to_owned),
|
||||
metrics_registry: config.prometheus_config.as_ref().map(|config| config.registry.clone()),
|
||||
block_announce_config,
|
||||
tx,
|
||||
};
|
||||
|
||||
let has_bootnodes = !network_params.network_config.network_config.boot_nodes.is_empty();
|
||||
|
||||
Reference in New Issue
Block a user