From e5b0a98f1a60e69f9977e21952af0b757fa68b66 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 13 May 2019 21:16:52 +0200 Subject: [PATCH] Split SyncContext from protocol Context (#2550) --- substrate/core/network/src/extra_requests.rs | 3 +- substrate/core/network/src/protocol.rs | 64 ++++++++++---------- substrate/core/network/src/sync.rs | 24 +++++++- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/substrate/core/network/src/extra_requests.rs b/substrate/core/network/src/extra_requests.rs index d9d51d1e26..efe4244449 100644 --- a/substrate/core/network/src/extra_requests.rs +++ b/substrate/core/network/src/extra_requests.rs @@ -24,8 +24,7 @@ use network_libp2p::PeerId; use runtime_primitives::Justification; use runtime_primitives::traits::{Block as BlockT, NumberFor}; use crate::message; -use crate::protocol::Context; -use crate::sync::{PeerSync, PeerSyncState}; +use crate::sync::{Context, PeerSync, PeerSyncState}; // Time to wait before trying to get the same extra data from the same peer. const EXTRA_RETRY_WAIT: Duration = Duration::from_secs(10); diff --git a/substrate/core/network/src/protocol.rs b/substrate/core/network/src/protocol.rs index d70a79f879..2189a33928 100644 --- a/substrate/core/network/src/protocol.rs +++ b/substrate/core/network/src/protocol.rs @@ -29,7 +29,7 @@ use crate::message::generic::{Message as GenericMessage, ConsensusMessage}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; use crate::on_demand::OnDemandService; use crate::specialization::NetworkSpecialization; -use crate::sync::{ChainSync, Status as SyncStatus, SyncState}; +use crate::sync::{ChainSync, Context as SyncContext, Status as SyncStatus, SyncState}; use crate::service::{NetworkChan, NetworkMsg, TransactionPool, ExHashT}; use crate::config::{ProtocolConfig, Roles}; use parking_lot::RwLock; @@ -151,9 +151,6 @@ pub struct PeerInfo { /// Context for a network-specific handler. pub trait Context { - /// Get a reference to the client. - fn client(&self) -> &crate::chain::Client; - /// 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); @@ -161,15 +158,6 @@ pub trait Context { /// Force disconnecting from a peer. Use this when a peer misbehaved. fn disconnect_peer(&mut self, who: PeerId); - /// Get peer info. - fn peer_info(&self, peer: &PeerId) -> Option>; - - /// Request a block from a peer. - fn send_block_request(&mut self, who: PeerId, request: BlockRequestMessage); - - /// Request a finality proof from a peer. - fn send_finality_proof_request(&mut self, who: PeerId, request: FinalityProofRequestMessage); - /// Send a consensus message to a peer. fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage); @@ -198,26 +186,6 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, self.network_chan.send(NetworkMsg::DisconnectPeer(who)) } - fn peer_info(&self, who: &PeerId) -> Option> { - self.context_data.peers.get(who).map(|p| p.info.clone()) - } - - fn client(&self) -> &Client { - &*self.context_data.chain - } - - fn send_block_request(&mut self, who: PeerId, request: BlockRequestMessage) { - send_message(&mut self.context_data.peers, &self.network_chan, who, - GenericMessage::BlockRequest(request) - ) - } - - fn send_finality_proof_request(&mut self, who: PeerId, request: FinalityProofRequestMessage) { - send_message(&mut self.context_data.peers, &self.network_chan, who, - GenericMessage::FinalityProofRequest(request) - ) - } - fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage) { send_message(&mut self.context_data.peers, &self.network_chan, who, GenericMessage::Consensus(consensus) @@ -231,6 +199,36 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, } } +impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SyncContext for ProtocolContext<'a, B, H> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.network_chan.send(NetworkMsg::ReportPeer(who, reputation)) + } + + fn disconnect_peer(&mut self, who: PeerId) { + self.network_chan.send(NetworkMsg::DisconnectPeer(who)) + } + + fn peer_info(&self, who: &PeerId) -> Option> { + self.context_data.peers.get(who).map(|p| p.info.clone()) + } + + fn client(&self) -> &Client { + &*self.context_data.chain + } + + fn send_finality_proof_request(&mut self, who: PeerId, request: FinalityProofRequestMessage) { + send_message(&mut self.context_data.peers, &self.network_chan, who, + GenericMessage::FinalityProofRequest(request) + ) + } + + fn send_block_request(&mut self, who: PeerId, request: BlockRequestMessage) { + send_message(&mut self.context_data.peers, &self.network_chan, who, + GenericMessage::BlockRequest(request) + ) + } +} + /// Data necessary to create a context. struct ContextData { // All connected peers diff --git a/substrate/core/network/src/sync.rs b/substrate/core/network/src/sync.rs index 23cb80c789..90e1359c56 100644 --- a/substrate/core/network/src/sync.rs +++ b/substrate/core/network/src/sync.rs @@ -33,7 +33,7 @@ use std::cmp::max; use std::collections::{HashMap, VecDeque}; use log::{debug, trace, warn, info}; -use crate::protocol::Context; +use crate::protocol::PeerInfo as ProtocolPeerInfo; use network_libp2p::PeerId; use client::{BlockStatus, ClientInfo}; use consensus::{BlockOrigin, import_queue::{IncomingBlock, SharedFinalityProofRequestBuilder}}; @@ -63,6 +63,28 @@ const ANCESTRY_BLOCK_ERROR_REPUTATION_CHANGE: i32 = -(1 << 9); /// Reputation change when a peer sent us a status message with a different genesis than us. const GENESIS_MISMATCH_REPUTATION_CHANGE: i32 = i32::min_value() + 1; +/// Context for a network-specific handler. +pub trait Context { + /// Get a reference to the client. + fn client(&self) -> &crate::chain::Client; + + /// 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); + + /// Get peer info. + fn peer_info(&self, peer: &PeerId) -> Option>; + + /// Request a finality proof from a peer. + fn send_finality_proof_request(&mut self, who: PeerId, request: message::FinalityProofRequest); + + /// Request a block from a peer. + fn send_block_request(&mut self, who: PeerId, request: message::BlockRequest); +} + #[derive(Debug)] pub(crate) struct PeerSync { pub common_number: NumberFor,