From 4213fe15cf5205c5459434d03d9b31b734c844e6 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 3 Jun 2019 20:26:17 +0200 Subject: [PATCH] Split specialization context from network context (#2745) * Split specialization context from network context * Line width --- substrate/core/network/src/lib.rs | 3 ++- substrate/core/network/src/protocol.rs | 15 ++++++++---- substrate/core/network/src/specialization.rs | 25 ++++++++++++++++++-- substrate/core/network/src/test/mod.rs | 13 ++++++---- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/substrate/core/network/src/lib.rs b/substrate/core/network/src/lib.rs index e2def15425..5b438135ed 100644 --- a/substrate/core/network/src/lib.rs +++ b/substrate/core/network/src/lib.rs @@ -46,7 +46,8 @@ pub use service::{ NetworkService, NetworkWorker, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, SyncProvider, ExHashT, ReportHandle, }; -pub use protocol::{ProtocolStatus, PeerInfo, Context}; +pub use protocol::{ProtocolStatus, PeerInfo}; +pub use specialization::Context; pub use sync::{Status as SyncStatus, SyncState}; pub use network_libp2p::{ identity, multiaddr, diff --git a/substrate/core/network/src/protocol.rs b/substrate/core/network/src/protocol.rs index baca6f3bf6..e1fa38576a 100644 --- a/substrate/core/network/src/protocol.rs +++ b/substrate/core/network/src/protocol.rs @@ -32,7 +32,7 @@ use crate::message::{BlockAttributes, Direction, FromBlock, RequestId}; use crate::message::generic::{Message as GenericMessage, ConsensusMessage}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; use crate::on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; -use crate::specialization::NetworkSpecialization; +use crate::specialization::{NetworkSpecialization, Context as SpecializationContext}; use crate::sync::{ChainSync, Context as SyncContext, Status as SyncStatus, SyncState}; use crate::service::{TransactionPool, ExHashT}; use crate::config::Roles; @@ -281,9 +281,6 @@ pub trait Context { /// Send a consensus message to a peer. fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage); - - /// Send a chain-specific message to a peer. - fn send_chain_specific(&mut self, who: PeerId, message: Vec); } /// Protocol context. @@ -315,6 +312,16 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, GenericMessage::Consensus(consensus) ) } +} + +impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SpecializationContext for ProtocolContext<'a, B, H> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.network_out.report_peer(who, reputation) + } + + fn disconnect_peer(&mut self, who: PeerId) { + self.network_out.disconnect_peer(who) + } fn send_chain_specific(&mut self, who: PeerId, message: Vec) { send_message( diff --git a/substrate/core/network/src/specialization.rs b/substrate/core/network/src/specialization.rs index 41d6c2edc8..2778146b52 100644 --- a/substrate/core/network/src/specialization.rs +++ b/substrate/core/network/src/specialization.rs @@ -18,7 +18,6 @@ use crate::PeerId; use runtime_primitives::traits::Block as BlockT; -use crate::protocol::Context; /// A specialization of the substrate network protocol. Handles events and sends messages. pub trait NetworkSpecialization: Send + Sync + 'static { @@ -32,7 +31,12 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn on_disconnect(&mut self, ctx: &mut Context, who: PeerId); /// Called when a network-specific message arrives. - fn on_message(&mut self, ctx: &mut Context, who: PeerId, message: &mut Option>); + fn on_message( + &mut self, + ctx: &mut Context, + who: PeerId, + message: &mut Option> + ); /// Called on abort. #[deprecated(note = "This method is never called; aborting corresponds to dropping the object")] @@ -46,6 +50,23 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn on_block_imported(&mut self, _ctx: &mut Context, _hash: B::Hash, _header: &B::Header) { } } +/// Context for a network-specific handler. +pub trait Context { + /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or + /// irresponsible or appeared lazy. + fn report_peer(&mut self, who: PeerId, reputation: i32); + + /// Force disconnecting from a peer. Use this when a peer misbehaved. + fn disconnect_peer(&mut self, who: PeerId); + + /// Send a consensus message to a peer. + #[deprecated(note = "This method shouldn't have been part of the specialization API")] + fn send_consensus(&mut self, _who: PeerId, _consensus: crate::message::generic::ConsensusMessage) {} + + /// Send a chain-specific message to a peer. + fn send_chain_specific(&mut self, who: PeerId, message: Vec); +} + /// Construct a simple protocol that is composed of several sub protocols. /// Each "sub protocol" needs to implement `Specialization` and needs to provide a `new()` function. /// For more fine grained implementations, this macro is not usable. diff --git a/substrate/core/network/src/test/mod.rs b/substrate/core/network/src/test/mod.rs index 6a7a9ccddd..6103a6ecd9 100644 --- a/substrate/core/network/src/test/mod.rs +++ b/substrate/core/network/src/test/mod.rs @@ -50,7 +50,7 @@ use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{AuthorityIdFor, Block as BlockT, Digest, DigestItem, Header, NumberFor}; use runtime_primitives::{Justification, ConsensusEngineId}; use crate::service::{NetworkLink, NetworkMsg, ProtocolMsg, TransactionPool}; -use crate::specialization::NetworkSpecialization; +use crate::specialization::{NetworkSpecialization, Context as SpecializationContext}; use test_client::{self, AccountKeyring}; pub use test_client::runtime::{Block, Extrinsic, Hash, Transfer}; @@ -101,15 +101,20 @@ impl NetworkSpecialization for DummySpecialization { vec![] } - fn on_connect(&mut self, _ctx: &mut Context, _peer_id: PeerId, _status: crate::message::Status) { + fn on_connect( + &mut self, + _ctx: &mut SpecializationContext, + _peer_id: PeerId, + _status: crate::message::Status + ) { } - fn on_disconnect(&mut self, _ctx: &mut Context, _peer_id: PeerId) { + fn on_disconnect(&mut self, _ctx: &mut SpecializationContext, _peer_id: PeerId) { } fn on_message( &mut self, - _ctx: &mut Context, + _ctx: &mut SpecializationContext, _peer_id: PeerId, _message: &mut Option>, ) {