mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-23 17:51:09 +00:00
Some tweaks in the network crate (#1108)
* Move Roles to network::config * Make network::config public * Move NetworkConfig and NonReservedMode to config * Move Params to config * Move node_id() to NetworkManager and fix tests * Rename Specialization to NetworkSpecialization
This commit is contained in:
@@ -60,7 +60,7 @@ use service::{
|
|||||||
ServiceFactory, FactoryFullConfiguration, RuntimeGenesis,
|
ServiceFactory, FactoryFullConfiguration, RuntimeGenesis,
|
||||||
FactoryGenesis, PruningMode, ChainSpec,
|
FactoryGenesis, PruningMode, ChainSpec,
|
||||||
};
|
};
|
||||||
use network::{NonReservedPeerMode, Protocol};
|
use network::{Protocol, config::NonReservedPeerMode};
|
||||||
use primitives::H256;
|
use primitives::H256;
|
||||||
|
|
||||||
use std::io::{Write, Read, stdin, stdout};
|
use std::io::{Write, Read, stdin, stdout};
|
||||||
|
|||||||
@@ -405,7 +405,7 @@ mod tests {
|
|||||||
use network::test::*;
|
use network::test::*;
|
||||||
use network::test::{Block as TestBlock, PeersClient};
|
use network::test::{Block as TestBlock, PeersClient};
|
||||||
use runtime_primitives::traits::Block as BlockT;
|
use runtime_primitives::traits::Block as BlockT;
|
||||||
use network::ProtocolConfig;
|
use network::config::ProtocolConfig;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use tokio::runtime::current_thread;
|
use tokio::runtime::current_thread;
|
||||||
use keyring::Keyring;
|
use keyring::Keyring;
|
||||||
|
|||||||
@@ -14,9 +14,34 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.
|
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
pub use service::Roles;
|
//! Configuration for the networking layer of Substrate.
|
||||||
|
|
||||||
/// Protocol configuration
|
pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration};
|
||||||
|
|
||||||
|
use chain::Client;
|
||||||
|
use codec;
|
||||||
|
use on_demand::OnDemandService;
|
||||||
|
use runtime_primitives::traits::{Block as BlockT};
|
||||||
|
use service::{ExHashT, TransactionPool};
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
/// Service initialization parameters.
|
||||||
|
pub struct Params<B: BlockT, S, H: ExHashT> {
|
||||||
|
/// Configuration.
|
||||||
|
pub config: ProtocolConfig,
|
||||||
|
/// Network layer configuration.
|
||||||
|
pub network_config: NetworkConfiguration,
|
||||||
|
/// Substrate relay chain access point.
|
||||||
|
pub chain: Arc<Client<B>>,
|
||||||
|
/// On-demand service reference.
|
||||||
|
pub on_demand: Option<Arc<OnDemandService<B>>>,
|
||||||
|
/// Transaction pool.
|
||||||
|
pub transaction_pool: Arc<TransactionPool<H, B>>,
|
||||||
|
/// Protocol specialization.
|
||||||
|
pub specialization: S,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Configuration for the Substrate-specific part of the networking layer.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ProtocolConfig {
|
pub struct ProtocolConfig {
|
||||||
/// Assigned roles.
|
/// Assigned roles.
|
||||||
@@ -30,3 +55,29 @@ impl Default for ProtocolConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
/// Bitmask of the roles that a node fulfills.
|
||||||
|
pub struct Roles: u8 {
|
||||||
|
/// No network.
|
||||||
|
const NONE = 0b00000000;
|
||||||
|
/// Full node, does not participate in consensus.
|
||||||
|
const FULL = 0b00000001;
|
||||||
|
/// Light client node.
|
||||||
|
const LIGHT = 0b00000010;
|
||||||
|
/// Act as an authority
|
||||||
|
const AUTHORITY = 0b00000100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl codec::Encode for Roles {
|
||||||
|
fn encode_to<T: codec::Output>(&self, dest: &mut T) {
|
||||||
|
dest.push_byte(self.bits())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl codec::Decode for Roles {
|
||||||
|
fn decode<I: codec::Input>(input: &mut I) -> Option<Self> {
|
||||||
|
Self::from_bits(input.read_byte()?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash, HashF
|
|||||||
use runtime_primitives::generic::BlockId;
|
use runtime_primitives::generic::BlockId;
|
||||||
use message::generic::{Message, ConsensusMessage};
|
use message::generic::{Message, ConsensusMessage};
|
||||||
use protocol::Context;
|
use protocol::Context;
|
||||||
use service::Roles;
|
use config::Roles;
|
||||||
use specialization::Specialization;
|
use specialization::NetworkSpecialization;
|
||||||
use StatusMessage;
|
use StatusMessage;
|
||||||
use generic_message;
|
use generic_message;
|
||||||
|
|
||||||
@@ -262,7 +262,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Block: BlockT> Specialization<Block> for ConsensusGossip<Block> where
|
impl<Block: BlockT> NetworkSpecialization<Block> for ConsensusGossip<Block> where
|
||||||
Block::Header: HeaderT<Number=u64>
|
Block::Header: HeaderT<Number=u64>
|
||||||
{
|
{
|
||||||
fn status(&self) -> Vec<u8> {
|
fn status(&self) -> Vec<u8> {
|
||||||
|
|||||||
@@ -51,10 +51,10 @@ mod sync;
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod protocol;
|
mod protocol;
|
||||||
mod io;
|
mod io;
|
||||||
mod config;
|
|
||||||
mod chain;
|
mod chain;
|
||||||
mod blocks;
|
mod blocks;
|
||||||
mod on_demand;
|
mod on_demand;
|
||||||
|
pub mod config;
|
||||||
pub mod import_queue;
|
pub mod import_queue;
|
||||||
pub mod consensus_gossip;
|
pub mod consensus_gossip;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
@@ -65,13 +65,12 @@ pub mod specialization;
|
|||||||
pub mod test;
|
pub mod test;
|
||||||
|
|
||||||
pub use chain::Client as ClientHandle;
|
pub use chain::Client as ClientHandle;
|
||||||
pub use service::{Service, FetchFuture, TransactionPool, Params, ManageNetwork, SyncProvider};
|
pub use service::{Service, FetchFuture, TransactionPool, ManageNetwork, SyncProvider};
|
||||||
pub use protocol::{ProtocolStatus, PeerInfo, Context};
|
pub use protocol::{ProtocolStatus, PeerInfo, Context};
|
||||||
pub use sync::{Status as SyncStatus, SyncState};
|
pub use sync::{Status as SyncStatus, SyncState};
|
||||||
pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration, NodeIndex, ProtocolId, Severity, Protocol};
|
pub use network_libp2p::{NodeIndex, ProtocolId, Severity, Protocol};
|
||||||
pub use message::{generic as generic_message, RequestId, Status as StatusMessage};
|
pub use message::{generic as generic_message, RequestId, Status as StatusMessage};
|
||||||
pub use error::Error;
|
pub use error::Error;
|
||||||
pub use config::{Roles, ProtocolConfig};
|
|
||||||
pub use on_demand::{OnDemand, OnDemandService, RemoteResponse};
|
pub use on_demand::{OnDemand, OnDemandService, RemoteResponse};
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub use runtime_primitives::traits::Block as BlockT;
|
pub use runtime_primitives::traits::Block as BlockT;
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ pub struct RemoteReadResponse {
|
|||||||
/// Generic types.
|
/// Generic types.
|
||||||
pub mod generic {
|
pub mod generic {
|
||||||
use runtime_primitives::Justification;
|
use runtime_primitives::Justification;
|
||||||
use service::Roles;
|
use config::Roles;
|
||||||
use super::{
|
use super::{
|
||||||
BlockAttributes, RemoteCallResponse, RemoteReadResponse,
|
BlockAttributes, RemoteCallResponse, RemoteReadResponse,
|
||||||
RequestId, Transactions, Direction
|
RequestId, Transactions, Direction
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest,
|
|||||||
use io::SyncIo;
|
use io::SyncIo;
|
||||||
use message;
|
use message;
|
||||||
use network_libp2p::{Severity, NodeIndex};
|
use network_libp2p::{Severity, NodeIndex};
|
||||||
|
use config::Roles;
|
||||||
use service;
|
use service;
|
||||||
use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor};
|
use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor};
|
||||||
|
|
||||||
@@ -41,7 +42,7 @@ const RETRY_COUNT: usize = 1;
|
|||||||
/// On-demand service API.
|
/// On-demand service API.
|
||||||
pub trait OnDemandService<Block: BlockT>: Send + Sync {
|
pub trait OnDemandService<Block: BlockT>: Send + Sync {
|
||||||
/// When new node is connected.
|
/// When new node is connected.
|
||||||
fn on_connect(&self, peer: NodeIndex, role: service::Roles, best_number: NumberFor<Block>);
|
fn on_connect(&self, peer: NodeIndex, role: Roles, best_number: NumberFor<Block>);
|
||||||
|
|
||||||
/// When block is announced by the peer.
|
/// When block is announced by the peer.
|
||||||
fn on_block_announce(&self, peer: NodeIndex, best_number: NumberFor<Block>);
|
fn on_block_announce(&self, peer: NodeIndex, best_number: NumberFor<Block>);
|
||||||
@@ -211,8 +212,8 @@ impl<B, E> OnDemandService<B> for OnDemand<B, E> where
|
|||||||
E: service::ExecuteInContext<B>,
|
E: service::ExecuteInContext<B>,
|
||||||
B::Header: HeaderT,
|
B::Header: HeaderT,
|
||||||
{
|
{
|
||||||
fn on_connect(&self, peer: NodeIndex, role: service::Roles, best_number: NumberFor<B>) {
|
fn on_connect(&self, peer: NodeIndex, role: Roles, best_number: NumberFor<B>) {
|
||||||
if !role.intersects(service::Roles::FULL | service::Roles::AUTHORITY) { // TODO: correct?
|
if !role.intersects(Roles::FULL | Roles::AUTHORITY) { // TODO: correct?
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,9 +512,10 @@ pub mod tests {
|
|||||||
use client::{self, error::{ErrorKind as ClientErrorKind, Result as ClientResult}};
|
use client::{self, error::{ErrorKind as ClientErrorKind, Result as ClientResult}};
|
||||||
use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest,
|
use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest,
|
||||||
RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest};
|
RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest};
|
||||||
|
use config::Roles;
|
||||||
use message;
|
use message;
|
||||||
use network_libp2p::NodeIndex;
|
use network_libp2p::NodeIndex;
|
||||||
use service::{Roles, ExecuteInContext};
|
use service::ExecuteInContext;
|
||||||
use test::TestIo;
|
use test::TestIo;
|
||||||
use super::{REQUEST_TIMEOUT, OnDemand, OnDemandService};
|
use super::{REQUEST_TIMEOUT, OnDemand, OnDemandService};
|
||||||
use test_client::runtime::{changes_trie_config, Block, Header};
|
use test_client::runtime::{changes_trie_config, Block, Header};
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ use codec::{Encode, Decode};
|
|||||||
|
|
||||||
use message::{self, Message};
|
use message::{self, Message};
|
||||||
use message::generic::Message as GenericMessage;
|
use message::generic::Message as GenericMessage;
|
||||||
use specialization::Specialization;
|
use specialization::NetworkSpecialization;
|
||||||
use sync::{ChainSync, Status as SyncStatus, SyncState};
|
use sync::{ChainSync, Status as SyncStatus, SyncState};
|
||||||
use service::{Roles, TransactionPool, ExHashT};
|
use service::{TransactionPool, ExHashT};
|
||||||
use import_queue::ImportQueue;
|
use import_queue::ImportQueue;
|
||||||
use config::ProtocolConfig;
|
use config::{ProtocolConfig, Roles};
|
||||||
use chain::Client;
|
use chain::Client;
|
||||||
use on_demand::OnDemandService;
|
use on_demand::OnDemandService;
|
||||||
use io::SyncIo;
|
use io::SyncIo;
|
||||||
@@ -50,7 +50,7 @@ const MAX_BLOCK_DATA_RESPONSE: u32 = 128;
|
|||||||
const LIGHT_MAXIMAL_BLOCKS_DIFFERENCE: u64 = 8192;
|
const LIGHT_MAXIMAL_BLOCKS_DIFFERENCE: u64 = 8192;
|
||||||
|
|
||||||
// Lock must always be taken in order declared here.
|
// Lock must always be taken in order declared here.
|
||||||
pub struct Protocol<B: BlockT, S: Specialization<B>, H: ExHashT> {
|
pub struct Protocol<B: BlockT, S: NetworkSpecialization<B>, H: ExHashT> {
|
||||||
config: ProtocolConfig,
|
config: ProtocolConfig,
|
||||||
on_demand: Option<Arc<OnDemandService<B>>>,
|
on_demand: Option<Arc<OnDemandService<B>>>,
|
||||||
genesis_hash: B::Hash,
|
genesis_hash: B::Hash,
|
||||||
@@ -184,7 +184,7 @@ pub(crate) struct ContextData<B: BlockT, H: ExHashT> {
|
|||||||
pub chain: Arc<Client<B>>,
|
pub chain: Arc<Client<B>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: BlockT, S: Specialization<B>, H: ExHashT> Protocol<B, S, H> {
|
impl<B: BlockT, S: NetworkSpecialization<B>, H: ExHashT> Protocol<B, S, H> {
|
||||||
/// Create a new instance.
|
/// Create a new instance.
|
||||||
pub fn new<I: 'static + ImportQueue<B>>(
|
pub fn new<I: 'static + ImportQueue<B>>(
|
||||||
config: ProtocolConfig,
|
config: ProtocolConfig,
|
||||||
@@ -761,7 +761,7 @@ macro_rules! construct_simple_protocol {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl $crate::specialization::Specialization<$block> for $protocol {
|
impl $crate::specialization::NetworkSpecialization<$block> for $protocol {
|
||||||
fn status(&self) -> Vec<u8> {
|
fn status(&self) -> Vec<u8> {
|
||||||
$(
|
$(
|
||||||
let status = self.$status_protocol_name.status();
|
let status = self.$status_protocol_name.status();
|
||||||
|
|||||||
@@ -25,11 +25,9 @@ use network_libp2p::{start_service, Service as NetworkService, ServiceEvent as N
|
|||||||
use network_libp2p::{RegisteredProtocol, parse_str_addr, Protocol as Libp2pProtocol};
|
use network_libp2p::{RegisteredProtocol, parse_str_addr, Protocol as Libp2pProtocol};
|
||||||
use io::NetSyncIo;
|
use io::NetSyncIo;
|
||||||
use protocol::{self, Protocol, ProtocolContext, Context, ProtocolStatus};
|
use protocol::{self, Protocol, ProtocolContext, Context, ProtocolStatus};
|
||||||
use config::{ProtocolConfig};
|
use config::Params;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use chain::Client;
|
use specialization::NetworkSpecialization;
|
||||||
use specialization::Specialization;
|
|
||||||
use on_demand::OnDemandService;
|
|
||||||
use import_queue::ImportQueue;
|
use import_queue::ImportQueue;
|
||||||
use runtime_primitives::traits::{Block as BlockT};
|
use runtime_primitives::traits::{Block as BlockT};
|
||||||
use tokio::{runtime::Runtime, timer::Interval};
|
use tokio::{runtime::Runtime, timer::Interval};
|
||||||
@@ -40,38 +38,10 @@ pub type FetchFuture = oneshot::Receiver<Vec<u8>>;
|
|||||||
const TICK_TIMEOUT: Duration = Duration::from_millis(1000);
|
const TICK_TIMEOUT: Duration = Duration::from_millis(1000);
|
||||||
const PROPAGATE_TIMEOUT: Duration = Duration::from_millis(5000);
|
const PROPAGATE_TIMEOUT: Duration = Duration::from_millis(5000);
|
||||||
|
|
||||||
bitflags! {
|
|
||||||
/// Node roles bitmask.
|
|
||||||
pub struct Roles: u8 {
|
|
||||||
/// No network.
|
|
||||||
const NONE = 0b00000000;
|
|
||||||
/// Full node, does not participate in consensus.
|
|
||||||
const FULL = 0b00000001;
|
|
||||||
/// Light client node.
|
|
||||||
const LIGHT = 0b00000010;
|
|
||||||
/// Act as an authority
|
|
||||||
const AUTHORITY = 0b00000100;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ::codec::Encode for Roles {
|
|
||||||
fn encode_to<T: ::codec::Output>(&self, dest: &mut T) {
|
|
||||||
dest.push_byte(self.bits())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ::codec::Decode for Roles {
|
|
||||||
fn decode<I: ::codec::Input>(input: &mut I) -> Option<Self> {
|
|
||||||
Self::from_bits(input.read_byte()?)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sync status
|
/// Sync status
|
||||||
pub trait SyncProvider<B: BlockT>: Send + Sync {
|
pub trait SyncProvider<B: BlockT>: Send + Sync {
|
||||||
/// Get sync status
|
/// Get sync status
|
||||||
fn status(&self) -> ProtocolStatus<B>;
|
fn status(&self) -> ProtocolStatus<B>;
|
||||||
/// Get this node id if available.
|
|
||||||
fn node_id(&self) -> Option<String>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ExHashT: ::std::hash::Hash + Eq + ::std::fmt::Debug + Clone + Send + Sync + 'static {}
|
pub trait ExHashT: ::std::hash::Hash + Eq + ::std::fmt::Debug + Clone + Send + Sync + 'static {}
|
||||||
@@ -93,24 +63,8 @@ pub trait ExecuteInContext<B: BlockT>: Send + Sync {
|
|||||||
fn execute_in_context<F: Fn(&mut Context<B>)>(&self, closure: F);
|
fn execute_in_context<F: Fn(&mut Context<B>)>(&self, closure: F);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Service initialization parameters.
|
|
||||||
pub struct Params<B: BlockT, S, H: ExHashT> {
|
|
||||||
/// Configuration.
|
|
||||||
pub config: ProtocolConfig,
|
|
||||||
/// Network layer configuration.
|
|
||||||
pub network_config: NetworkConfiguration,
|
|
||||||
/// Substrate relay chain access point.
|
|
||||||
pub chain: Arc<Client<B>>,
|
|
||||||
/// On-demand service reference.
|
|
||||||
pub on_demand: Option<Arc<OnDemandService<B>>>,
|
|
||||||
/// Transaction pool.
|
|
||||||
pub transaction_pool: Arc<TransactionPool<H, B>>,
|
|
||||||
/// Protocol specialization.
|
|
||||||
pub specialization: S,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Substrate network service. Handles network IO and manages connectivity.
|
/// Substrate network service. Handles network IO and manages connectivity.
|
||||||
pub struct Service<B: BlockT + 'static, S: Specialization<B>, H: ExHashT> {
|
pub struct Service<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT> {
|
||||||
/// Network service
|
/// Network service
|
||||||
network: Arc<Mutex<NetworkService>>,
|
network: Arc<Mutex<NetworkService>>,
|
||||||
/// Protocol handler
|
/// Protocol handler
|
||||||
@@ -123,7 +77,7 @@ pub struct Service<B: BlockT + 'static, S: Specialization<B>, H: ExHashT> {
|
|||||||
bg_thread: Option<(oneshot::Sender<()>, thread::JoinHandle<()>)>,
|
bg_thread: Option<(oneshot::Sender<()>, thread::JoinHandle<()>)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: BlockT + 'static, S: Specialization<B>, H: ExHashT> Service<B, S, H> {
|
impl<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT> Service<B, S, H> {
|
||||||
/// Creates and register protocol with the network service
|
/// Creates and register protocol with the network service
|
||||||
pub fn new<I: 'static + ImportQueue<B>>(
|
pub fn new<I: 'static + ImportQueue<B>>(
|
||||||
params: Params<B, S, H>,
|
params: Params<B, S, H>,
|
||||||
@@ -178,13 +132,13 @@ impl<B: BlockT + 'static, S: Specialization<B>, H: ExHashT> Service<B, S, H> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: BlockT + 'static, S: Specialization<B>, H: ExHashT> ::consensus::SyncOracle for Service<B, S, H> {
|
impl<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT> ::consensus::SyncOracle for Service<B, S, H> {
|
||||||
fn is_major_syncing(&self) -> bool {
|
fn is_major_syncing(&self) -> bool {
|
||||||
self.handler.sync().read().status().is_major_syncing()
|
self.handler.sync().read().status().is_major_syncing()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: BlockT + 'static, S: Specialization<B>, H:ExHashT> Drop for Service<B, S, H> {
|
impl<B: BlockT + 'static, S: NetworkSpecialization<B>, H:ExHashT> Drop for Service<B, S, H> {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.handler.stop();
|
self.handler.stop();
|
||||||
if let Some((sender, join)) = self.bg_thread.take() {
|
if let Some((sender, join)) = self.bg_thread.take() {
|
||||||
@@ -196,30 +150,17 @@ impl<B: BlockT + 'static, S: Specialization<B>, H:ExHashT> Drop for Service<B, S
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: BlockT + 'static, S: Specialization<B>, H: ExHashT> ExecuteInContext<B> for Service<B, S, H> {
|
impl<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT> ExecuteInContext<B> for Service<B, S, H> {
|
||||||
fn execute_in_context<F: Fn(&mut ::protocol::Context<B>)>(&self, closure: F) {
|
fn execute_in_context<F: Fn(&mut ::protocol::Context<B>)>(&self, closure: F) {
|
||||||
closure(&mut ProtocolContext::new(self.handler.context_data(), &mut NetSyncIo::new(&self.network, self.protocol_id)))
|
closure(&mut ProtocolContext::new(self.handler.context_data(), &mut NetSyncIo::new(&self.network, self.protocol_id)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: BlockT + 'static, S: Specialization<B>, H: ExHashT> SyncProvider<B> for Service<B, S, H> {
|
impl<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT> SyncProvider<B> for Service<B, S, H> {
|
||||||
/// Get sync status
|
/// Get sync status
|
||||||
fn status(&self) -> ProtocolStatus<B> {
|
fn status(&self) -> ProtocolStatus<B> {
|
||||||
self.handler.status()
|
self.handler.status()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn node_id(&self) -> Option<String> {
|
|
||||||
let network = self.network.lock();
|
|
||||||
let ret = network
|
|
||||||
.listeners()
|
|
||||||
.next()
|
|
||||||
.map(|addr| {
|
|
||||||
let mut addr = addr.clone();
|
|
||||||
addr.append(Libp2pProtocol::P2p(network.peer_id().clone().into()));
|
|
||||||
addr.to_string()
|
|
||||||
});
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Trait for managing network
|
/// Trait for managing network
|
||||||
@@ -232,9 +173,11 @@ pub trait ManageNetwork: Send + Sync {
|
|||||||
fn remove_reserved_peer(&self, peer: PeerId);
|
fn remove_reserved_peer(&self, peer: PeerId);
|
||||||
/// Add reserved peer
|
/// Add reserved peer
|
||||||
fn add_reserved_peer(&self, peer: String) -> Result<(), String>;
|
fn add_reserved_peer(&self, peer: String) -> Result<(), String>;
|
||||||
|
/// Returns a user-friendly identifier of our node.
|
||||||
|
fn node_id(&self) -> Option<String>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: BlockT + 'static, S: Specialization<B>, H: ExHashT> ManageNetwork for Service<B, S, H> {
|
impl<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT> ManageNetwork for Service<B, S, H> {
|
||||||
fn accept_unreserved_peers(&self) {
|
fn accept_unreserved_peers(&self) {
|
||||||
self.network.lock().accept_unreserved_peers();
|
self.network.lock().accept_unreserved_peers();
|
||||||
}
|
}
|
||||||
@@ -264,10 +207,23 @@ impl<B: BlockT + 'static, S: Specialization<B>, H: ExHashT> ManageNetwork for Se
|
|||||||
self.network.lock().add_reserved_peer(addr, peer_id);
|
self.network.lock().add_reserved_peer(addr, peer_id);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn node_id(&self) -> Option<String> {
|
||||||
|
let network = self.network.lock();
|
||||||
|
let ret = network
|
||||||
|
.listeners()
|
||||||
|
.next()
|
||||||
|
.map(|addr| {
|
||||||
|
let mut addr = addr.clone();
|
||||||
|
addr.append(Libp2pProtocol::P2p(network.peer_id().clone().into()));
|
||||||
|
addr.to_string()
|
||||||
|
});
|
||||||
|
ret
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Starts the background thread that handles the networking.
|
/// Starts the background thread that handles the networking.
|
||||||
fn start_thread<B: BlockT + 'static, S: Specialization<B>, H: ExHashT>(
|
fn start_thread<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT>(
|
||||||
config: NetworkConfiguration,
|
config: NetworkConfiguration,
|
||||||
protocol: Arc<Protocol<B, S, H>>,
|
protocol: Arc<Protocol<B, S, H>>,
|
||||||
registered: RegisteredProtocol,
|
registered: RegisteredProtocol,
|
||||||
@@ -308,7 +264,7 @@ fn start_thread<B: BlockT + 'static, S: Specialization<B>, H: ExHashT>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Runs the background thread that handles the networking.
|
/// Runs the background thread that handles the networking.
|
||||||
fn run_thread<B: BlockT + 'static, S: Specialization<B>, H: ExHashT>(
|
fn run_thread<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT>(
|
||||||
network_service: Arc<Mutex<NetworkService>>,
|
network_service: Arc<Mutex<NetworkService>>,
|
||||||
protocol: Arc<Protocol<B, S, H>>,
|
protocol: Arc<Protocol<B, S, H>>,
|
||||||
protocol_id: ProtocolId,
|
protocol_id: ProtocolId,
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ use runtime_primitives::traits::Block as BlockT;
|
|||||||
use protocol::Context;
|
use protocol::Context;
|
||||||
|
|
||||||
/// A specialization of the substrate network protocol. Handles events and sends messages.
|
/// A specialization of the substrate network protocol. Handles events and sends messages.
|
||||||
pub trait Specialization<B: BlockT>: Send + Sync + 'static {
|
pub trait NetworkSpecialization<B: BlockT>: Send + Sync + 'static {
|
||||||
/// Get the current specialization-status.
|
/// Get the current specialization-status.
|
||||||
fn status(&self) -> Vec<u8>;
|
fn status(&self) -> Vec<u8>;
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ use blocks::{self, BlockCollection};
|
|||||||
use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor};
|
use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor};
|
||||||
use runtime_primitives::generic::BlockId;
|
use runtime_primitives::generic::BlockId;
|
||||||
use message::{self, generic::Message as GenericMessage};
|
use message::{self, generic::Message as GenericMessage};
|
||||||
use service::Roles;
|
use config::Roles;
|
||||||
use import_queue::ImportQueue;
|
use import_queue::ImportQueue;
|
||||||
|
|
||||||
// Maximum blocks to request in a single packet.
|
// Maximum blocks to request in a single packet.
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ use keyring::Keyring;
|
|||||||
use codec::Encode;
|
use codec::Encode;
|
||||||
use import_queue::{SyncImportQueue, PassThroughVerifier, Verifier};
|
use import_queue::{SyncImportQueue, PassThroughVerifier, Verifier};
|
||||||
use consensus::BlockOrigin;
|
use consensus::BlockOrigin;
|
||||||
use specialization::Specialization;
|
use specialization::NetworkSpecialization;
|
||||||
use consensus_gossip::ConsensusGossip;
|
use consensus_gossip::ConsensusGossip;
|
||||||
use import_queue::ImportQueue;
|
use import_queue::ImportQueue;
|
||||||
use service::ExecuteInContext;
|
use service::ExecuteInContext;
|
||||||
@@ -62,7 +62,7 @@ pub struct DummySpecialization {
|
|||||||
pub gossip: ConsensusGossip<Block>,
|
pub gossip: ConsensusGossip<Block>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Specialization<Block> for DummySpecialization {
|
impl NetworkSpecialization<Block> for DummySpecialization {
|
||||||
fn status(&self) -> Vec<u8> { vec![] }
|
fn status(&self) -> Vec<u8> { vec![] }
|
||||||
|
|
||||||
fn on_connect(&mut self, ctx: &mut Context<Block>, peer_id: NodeIndex, status: ::message::Status<Block>) {
|
fn on_connect(&mut self, ctx: &mut Context<Block>, peer_id: NodeIndex, status: ::message::Status<Block>) {
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
|
|
||||||
use client::backend::Backend;
|
use client::backend::Backend;
|
||||||
use client::blockchain::HeaderBackend as BlockchainHeaderBackend;
|
use client::blockchain::HeaderBackend as BlockchainHeaderBackend;
|
||||||
|
use config::Roles;
|
||||||
use consensus::BlockOrigin;
|
use consensus::BlockOrigin;
|
||||||
use sync::SyncState;
|
use sync::SyncState;
|
||||||
use Roles;
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@@ -175,12 +175,12 @@ impl<T: Components> StartRPC<Self> for T where
|
|||||||
pub trait CreateNetworkParams<C: Components> {
|
pub trait CreateNetworkParams<C: Components> {
|
||||||
fn create_network_params<S>(
|
fn create_network_params<S>(
|
||||||
client: Arc<Client<C::Backend, C::Executor, ComponentBlock<C>, C::RuntimeApi>>,
|
client: Arc<Client<C::Backend, C::Executor, ComponentBlock<C>, C::RuntimeApi>>,
|
||||||
roles: network::Roles,
|
roles: network::config::Roles,
|
||||||
network_config: network::NetworkConfiguration,
|
network_config: network::config::NetworkConfiguration,
|
||||||
on_demand: Option<Arc<OnDemand<FactoryBlock<C::Factory>, NetworkService<C::Factory>>>>,
|
on_demand: Option<Arc<OnDemand<FactoryBlock<C::Factory>, NetworkService<C::Factory>>>>,
|
||||||
transaction_pool_adapter: TransactionPoolAdapter<C>,
|
transaction_pool_adapter: TransactionPoolAdapter<C>,
|
||||||
specialization: S,
|
specialization: S,
|
||||||
) -> network::Params<ComponentBlock<C>, S, ComponentExHash<C>>;
|
) -> network::config::Params<ComponentBlock<C>, S, ComponentExHash<C>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Components> CreateNetworkParams<Self> for T where
|
impl<T: Components> CreateNetworkParams<Self> for T where
|
||||||
@@ -188,14 +188,14 @@ impl<T: Components> CreateNetworkParams<Self> for T where
|
|||||||
{
|
{
|
||||||
fn create_network_params<S>(
|
fn create_network_params<S>(
|
||||||
client: Arc<Client<T::Backend, T::Executor, ComponentBlock<T>, T::RuntimeApi>>,
|
client: Arc<Client<T::Backend, T::Executor, ComponentBlock<T>, T::RuntimeApi>>,
|
||||||
roles: network::Roles,
|
roles: network::config::Roles,
|
||||||
network_config: network::NetworkConfiguration,
|
network_config: network::config::NetworkConfiguration,
|
||||||
on_demand: Option<Arc<OnDemand<FactoryBlock<T::Factory>, NetworkService<T::Factory>>>>,
|
on_demand: Option<Arc<OnDemand<FactoryBlock<T::Factory>, NetworkService<T::Factory>>>>,
|
||||||
transaction_pool_adapter: TransactionPoolAdapter<T>,
|
transaction_pool_adapter: TransactionPoolAdapter<T>,
|
||||||
specialization: S,
|
specialization: S,
|
||||||
) -> network::Params<ComponentBlock<T>, S, ComponentExHash<T>> {
|
) -> network::config::Params<ComponentBlock<T>, S, ComponentExHash<T>> {
|
||||||
network::Params {
|
network::config::Params {
|
||||||
config: network::ProtocolConfig { roles },
|
config: network::config::ProtocolConfig { roles },
|
||||||
network_config,
|
network_config,
|
||||||
chain: client,
|
chain: client,
|
||||||
on_demand: on_demand.map(|d| d as Arc<network::OnDemandService<ComponentBlock<T>>>),
|
on_demand: on_demand.map(|d| d as Arc<network::OnDemandService<ComponentBlock<T>>>),
|
||||||
@@ -225,7 +225,7 @@ pub trait ServiceFactory: 'static + Sized {
|
|||||||
/// The type that implements the runtime API.
|
/// The type that implements the runtime API.
|
||||||
type RuntimeApi: Send + Sync;
|
type RuntimeApi: Send + Sync;
|
||||||
/// Network protocol extensions.
|
/// Network protocol extensions.
|
||||||
type NetworkProtocol: network::specialization::Specialization<Self::Block>;
|
type NetworkProtocol: network::specialization::NetworkSpecialization<Self::Block>;
|
||||||
/// Chain runtime.
|
/// Chain runtime.
|
||||||
type RuntimeDispatch: NativeExecutionDispatch + Send + Sync + 'static;
|
type RuntimeDispatch: NativeExecutionDispatch + Send + Sync + 'static;
|
||||||
/// Extrinsic pool backend type for the full client.
|
/// Extrinsic pool backend type for the full client.
|
||||||
|
|||||||
@@ -20,9 +20,8 @@ use std::net::SocketAddr;
|
|||||||
use transaction_pool;
|
use transaction_pool;
|
||||||
use chain_spec::ChainSpec;
|
use chain_spec::ChainSpec;
|
||||||
pub use client::ExecutionStrategy;
|
pub use client::ExecutionStrategy;
|
||||||
pub use network::Roles;
|
|
||||||
pub use network::NetworkConfiguration;
|
|
||||||
pub use client_db::PruningMode;
|
pub use client_db::PruningMode;
|
||||||
|
pub use network::config::{NetworkConfiguration, Roles};
|
||||||
use runtime_primitives::BuildStorage;
|
use runtime_primitives::BuildStorage;
|
||||||
use serde::{Serialize, de::DeserializeOwned};
|
use serde::{Serialize, de::DeserializeOwned};
|
||||||
use target_info::Target;
|
use target_info::Target;
|
||||||
|
|||||||
@@ -47,7 +47,8 @@ use service::{
|
|||||||
Roles,
|
Roles,
|
||||||
FactoryExtrinsic,
|
FactoryExtrinsic,
|
||||||
};
|
};
|
||||||
use network::{NetworkConfiguration, NonReservedPeerMode, Protocol, SyncProvider, ManageNetwork};
|
use network::{Protocol, SyncProvider, ManageNetwork};
|
||||||
|
use network::config::{NetworkConfiguration, NonReservedPeerMode};
|
||||||
use sr_primitives::traits::As;
|
use sr_primitives::traits::As;
|
||||||
use sr_primitives::generic::BlockId;
|
use sr_primitives::generic::BlockId;
|
||||||
use consensus::{ImportBlock, BlockImport};
|
use consensus::{ImportBlock, BlockImport};
|
||||||
|
|||||||
Reference in New Issue
Block a user