mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-27 03:27:58 +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:
@@ -72,7 +72,7 @@ use substrate_test_runtime_client::{BlockBuilderExt, ClientExt};
|
||||
use tokio::time::Duration;
|
||||
|
||||
const GENESIS_HASH: H256 = H256::zero();
|
||||
fn beefy_gossip_proto_name() -> ProtocolName {
|
||||
pub(crate) fn beefy_gossip_proto_name() -> ProtocolName {
|
||||
gossip_protocol_name(GENESIS_HASH, None)
|
||||
}
|
||||
|
||||
@@ -371,6 +371,7 @@ async fn voter_init_setup(
|
||||
let mut gossip_engine = sc_network_gossip::GossipEngine::new(
|
||||
net.peer(0).network_service().clone(),
|
||||
net.peer(0).sync_service().clone(),
|
||||
net.peer(0).take_notification_service(&beefy_gossip_proto_name()).unwrap(),
|
||||
"/beefy/whatever",
|
||||
gossip_validator,
|
||||
None,
|
||||
@@ -392,6 +393,14 @@ where
|
||||
{
|
||||
let tasks = FuturesUnordered::new();
|
||||
|
||||
let mut notification_services = peers
|
||||
.iter()
|
||||
.map(|(peer_id, _, _)| {
|
||||
let peer = &mut net.peers[*peer_id];
|
||||
(*peer_id, peer.take_notification_service(&beefy_gossip_proto_name()).unwrap())
|
||||
})
|
||||
.collect::<std::collections::HashMap<_, _>>();
|
||||
|
||||
for (peer_id, key, api) in peers.into_iter() {
|
||||
let peer = &net.peers[peer_id];
|
||||
|
||||
@@ -409,6 +418,7 @@ where
|
||||
let network_params = crate::BeefyNetworkParams {
|
||||
network: peer.network_service().clone(),
|
||||
sync: peer.sync_service().clone(),
|
||||
notification_service: notification_services.remove(&peer_id).unwrap(),
|
||||
gossip_protocol_name: beefy_gossip_proto_name(),
|
||||
justifications_protocol_name: on_demand_justif_handler.protocol_name(),
|
||||
_phantom: PhantomData,
|
||||
@@ -1045,7 +1055,25 @@ async fn should_initialize_voter_at_custom_genesis() {
|
||||
net.peer(0).client().as_client().finalize_block(hashes[8], None).unwrap();
|
||||
|
||||
// load persistent state - nothing in DB, should init at genesis
|
||||
let persisted_state = voter_init_setup(&mut net, &mut finality, &api).await.unwrap();
|
||||
//
|
||||
// NOTE: code from `voter_init_setup()` is moved here because the new network event system
|
||||
// doesn't allow creating a new `GossipEngine` as the notification handle is consumed by the
|
||||
// first `GossipEngine`
|
||||
let known_peers = Arc::new(Mutex::new(KnownPeers::new()));
|
||||
let (gossip_validator, _) = GossipValidator::new(known_peers);
|
||||
let gossip_validator = Arc::new(gossip_validator);
|
||||
let mut gossip_engine = sc_network_gossip::GossipEngine::new(
|
||||
net.peer(0).network_service().clone(),
|
||||
net.peer(0).sync_service().clone(),
|
||||
net.peer(0).take_notification_service(&beefy_gossip_proto_name()).unwrap(),
|
||||
"/beefy/whatever",
|
||||
gossip_validator,
|
||||
None,
|
||||
);
|
||||
let (beefy_genesis, best_grandpa) =
|
||||
wait_for_runtime_pallet(&api, &mut gossip_engine, &mut finality).await.unwrap();
|
||||
let persisted_state =
|
||||
load_or_init_voter_state(&*backend, &api, beefy_genesis, best_grandpa, 1).unwrap();
|
||||
|
||||
// Test initialization at session boundary.
|
||||
// verify voter initialized with single session starting at block `custom_pallet_genesis` (7)
|
||||
@@ -1075,7 +1103,11 @@ async fn should_initialize_voter_at_custom_genesis() {
|
||||
|
||||
net.peer(0).client().as_client().finalize_block(hashes[10], None).unwrap();
|
||||
// load persistent state - state preset in DB, but with different pallet genesis
|
||||
let new_persisted_state = voter_init_setup(&mut net, &mut finality, &api).await.unwrap();
|
||||
// the network state persists and uses the old `GossipEngine` initialized for `peer(0)`
|
||||
let (beefy_genesis, best_grandpa) =
|
||||
wait_for_runtime_pallet(&api, &mut gossip_engine, &mut finality).await.unwrap();
|
||||
let new_persisted_state =
|
||||
load_or_init_voter_state(&*backend, &api, beefy_genesis, best_grandpa, 1).unwrap();
|
||||
|
||||
// verify voter initialized with single session starting at block `new_pallet_genesis` (10)
|
||||
let sessions = new_persisted_state.voting_oracle().sessions();
|
||||
@@ -1371,7 +1403,7 @@ async fn gossipped_finality_proofs() {
|
||||
let api = Arc::new(TestApi::with_validator_set(&validator_set));
|
||||
let beefy_peers = peers.iter().enumerate().map(|(id, key)| (id, key, api.clone())).collect();
|
||||
|
||||
let charlie = &net.peers[2];
|
||||
let charlie = &mut net.peers[2];
|
||||
let known_peers = Arc::new(Mutex::new(KnownPeers::<Block>::new()));
|
||||
// Charlie will run just the gossip engine and not the full voter.
|
||||
let (gossip_validator, _) = GossipValidator::new(known_peers);
|
||||
@@ -1384,6 +1416,7 @@ async fn gossipped_finality_proofs() {
|
||||
let mut charlie_gossip_engine = sc_network_gossip::GossipEngine::new(
|
||||
charlie.network_service().clone(),
|
||||
charlie.sync_service().clone(),
|
||||
charlie.take_notification_service(&beefy_gossip_proto_name()).unwrap(),
|
||||
beefy_gossip_proto_name(),
|
||||
charlie_gossip_validator.clone(),
|
||||
None,
|
||||
|
||||
Reference in New Issue
Block a user