mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 08:47:57 +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:
@@ -370,28 +370,28 @@ pub fn new_full_base(
|
||||
let shared_voter_state = rpc_setup;
|
||||
let auth_disc_publish_non_global_ips = config.network.allow_non_globals_in_dht;
|
||||
let mut net_config = sc_network::config::FullNetworkConfiguration::new(&config.network);
|
||||
|
||||
let genesis_hash = client.block_hash(0).ok().flatten().expect("Genesis block exists; qed");
|
||||
|
||||
let grandpa_protocol_name = grandpa::protocol_standard_name(&genesis_hash, &config.chain_spec);
|
||||
net_config.add_notification_protocol(grandpa::grandpa_peers_set_config(
|
||||
grandpa_protocol_name.clone(),
|
||||
));
|
||||
let (grandpa_protocol_config, grandpa_notification_service) =
|
||||
grandpa::grandpa_peers_set_config(grandpa_protocol_name.clone());
|
||||
net_config.add_notification_protocol(grandpa_protocol_config);
|
||||
|
||||
let statement_handler_proto = sc_network_statement::StatementHandlerPrototype::new(
|
||||
genesis_hash,
|
||||
config.chain_spec.fork_id(),
|
||||
);
|
||||
net_config.add_notification_protocol(statement_handler_proto.set_config());
|
||||
let (statement_handler_proto, statement_config) =
|
||||
sc_network_statement::StatementHandlerPrototype::new(
|
||||
genesis_hash,
|
||||
config.chain_spec.fork_id(),
|
||||
);
|
||||
net_config.add_notification_protocol(statement_config);
|
||||
|
||||
let mixnet_protocol_name =
|
||||
sc_mixnet::protocol_name(genesis_hash.as_ref(), config.chain_spec.fork_id());
|
||||
if let Some(mixnet_config) = &mixnet_config {
|
||||
net_config.add_notification_protocol(sc_mixnet::peers_set_config(
|
||||
mixnet_protocol_name.clone(),
|
||||
mixnet_config,
|
||||
));
|
||||
}
|
||||
let mixnet_notification_service = mixnet_config.as_ref().map(|mixnet_config| {
|
||||
let (config, notification_service) =
|
||||
sc_mixnet::peers_set_config(mixnet_protocol_name.clone(), mixnet_config);
|
||||
net_config.add_notification_protocol(config);
|
||||
notification_service
|
||||
});
|
||||
|
||||
let warp_sync = Arc::new(grandpa::warp_proof::NetworkProvider::new(
|
||||
backend.clone(),
|
||||
@@ -422,6 +422,8 @@ pub fn new_full_base(
|
||||
mixnet_protocol_name,
|
||||
transaction_pool.clone(),
|
||||
Some(keystore_container.keystore()),
|
||||
mixnet_notification_service
|
||||
.expect("`NotificationService` exists since mixnet was enabled; qed"),
|
||||
);
|
||||
task_manager.spawn_handle().spawn("mixnet", None, mixnet);
|
||||
}
|
||||
@@ -590,6 +592,7 @@ pub fn new_full_base(
|
||||
link: grandpa_link,
|
||||
network: network.clone(),
|
||||
sync: Arc::new(sync_service.clone()),
|
||||
notification_service: grandpa_notification_service,
|
||||
telemetry: telemetry.as_ref().map(|x| x.handle()),
|
||||
voting_rule: grandpa::VotingRulesBuilder::default().build(),
|
||||
prometheus_registry: prometheus_registry.clone(),
|
||||
|
||||
Reference in New Issue
Block a user