Struct sc_network::NetworkService [−][src]
Expand description
Substrate network service. Handles network IO and manages connectivity.
Implementations
Returns the local PeerId
.
Set authorized peers.
Need a better solution to manage authorized peers, but now just use reserved peers for prototyping.
Set authorized_only flag.
Need a better solution to decide authorized_only, but now just use reserved_only flag for prototyping.
Adds an address known to a node.
Appends a notification to the buffer of pending outgoing notifications with the given peer. Has no effect if the notifications channel with this protocol name is not open.
If the buffer of pending outgoing notifications with that peer is full, the notification is silently dropped and the connection to the remote will start being shut down. This happens if you call this method at a higher rate than the rate at which the peer processes these notifications, or if the available network bandwidth is too low.
For this reason, this method is considered soft-deprecated. You are encouraged to use
NetworkService::notification_sender
instead.
Note: The reason why this is a no-op in the situation where we have no channel is that we don’t guarantee message delivery anyway. Networking issues can cause connections to drop at any time, and higher-level logic shouldn’t differentiate between the remote voluntarily closing a substream or a network error preventing the message from being delivered.
The protocol must have been registered with
[NetworkConfiguration::notifications_protocols
](crate::config::NetworkConfiguration::
notifications_protocols).
pub fn notification_sender(
&self,
target: PeerId,
protocol: Cow<'static, str>
) -> Result<NotificationSender, NotificationSenderError>
pub fn notification_sender(
&self,
target: PeerId,
protocol: Cow<'static, str>
) -> Result<NotificationSender, NotificationSenderError>
Obtains a NotificationSender
for a connected peer, if it exists.
A NotificationSender
is scoped to a particular connection to the peer that holds
a receiver. With a NotificationSender
at hand, sending a notification is done in two
steps:
NotificationSender::ready
is used to wait for the sender to become ready for another notification, yielding aNotificationSenderReady
token.NotificationSenderReady::send
enqueues the notification for sending. This operation can only fail if the underlying notification substream or connection has suddenly closed.
An error is returned by NotificationSenderReady::send
if there exists no open
notifications substream with that combination of peer and protocol, or if the remote
has asked to close the notifications substream. If that happens, it is guaranteed that an
Event::NotificationStreamClosed
has been generated on the stream returned by
NetworkService::event_stream
.
If the remote requests to close the notifications substream, all notifications successfully
enqueued using NotificationSenderReady::send
will finish being sent out before the
substream actually gets closed, but attempting to enqueue more notifications will now
return an error. It is however possible for the entire connection to be abruptly closed,
in which case enqueued notifications will be lost.
The protocol must have been registered with
[NetworkConfiguration::notifications_protocols
](crate::config::NetworkConfiguration::
notifications_protocols).
Usage
This method returns a struct that allows waiting until there is space available in the buffer of messages towards the given peer. If the peer processes notifications at a slower rate than we send them, this buffer will quickly fill up.
As such, you should never do something like this:
// Do NOT do this
for peer in peers {
if let Ok(n) = network.notification_sender(peer, ...) {
if let Ok(s) = n.ready().await {
let _ = s.send(...);
}
}
}
Doing so would slow down all peers to the rate of the slowest one. A malicious or malfunctioning peer could intentionally process notifications at a very slow rate.
Instead, you are encouraged to maintain your own buffer of notifications on top of the one
maintained by sc-network
, and use notification_sender
to progressively send out
elements from your buffer. If this additional buffer is full (which will happen at some
point if the peer is too slow to process notifications), appropriate measures can be taken,
such as removing non-critical notifications from the buffer or disconnecting the peer
using NetworkService::disconnect_peer
.
Notifications Per-peer buffer
broadcast +—––> of notifications +–> notification_sender
+–> Internet
^ (not covered by
| sc-network)
+
Notifications should be dropped
if buffer is full
See also the gossip
module for a higher-level way to send
notifications.
Returns a stream containing the events that happen on the network.
If this method is called multiple times, the events are duplicated.
The stream never ends (unless the NetworkWorker
gets shut down).
The name passed is used to identify the channel in the Prometheus metrics. Note that the
parameter is a &'static str
, and not a String
, in order to avoid accidentally having
an unbounded set of Prometheus metrics, which would be quite bad in terms of memory
Sends a single targeted request to a specific peer. On success, returns the response of the peer.
Request-response protocols are a way to complement notifications protocols, but
notifications should remain the default ways of communicating information. For example, a
peer can announce something through a notification, after which the recipient can obtain
more information by performing a request.
As such, call this function with IfDisconnected::ImmediateError
for connect
. This way
you will get an error immediately for disconnected peers, instead of waiting for a
potentially very long connection attempt, which would suggest that something is wrong
anyway, as you are supposed to be connected because of the notification protocol.
No limit or throttling of concurrent outbound requests per peer and protocol are enforced. Such restrictions, if desired, need to be enforced at the call site(s).
The protocol must have been registered through
NetworkConfiguration::request_response_protocols
.
pub fn start_request(
&self,
target: PeerId,
protocol: impl Into<Cow<'static, str>>,
request: Vec<u8>,
tx: Sender<Result<Vec<u8>, RequestFailure>>,
connect: IfDisconnected
)
pub fn start_request(
&self,
target: PeerId,
protocol: impl Into<Cow<'static, str>>,
request: Vec<u8>,
tx: Sender<Result<Vec<u8>, RequestFailure>>,
connect: IfDisconnected
)
Variation of request
which starts a request whose response is delivered on a provided
channel.
Instead of blocking and waiting for a reply, this function returns immediately, sending responses via the passed in sender. This alternative API exists to make it easier to integrate with message passing APIs.
Keep in mind that the connected receiver might receive a Canceled
event in case of a
closing connection. This is expected behaviour. With request
you would get a
RequestFailure::Network(OutboundFailure::ConnectionClosed)
in that case.
High-level network status information.
Returns an error if the NetworkWorker
is no longer running.
Get network state.
Note: Use this only for debugging. This API is unstable. There are warnings literally everywhere about this. Please don’t use this function to retrieve actual information.
Returns an error if the NetworkWorker
is no longer running.
You may call this when new transactions are imported by the transaction pool.
All transactions will be fetched from the TransactionPool
that was passed at
initialization as part of the configuration and propagated to peers.
You must call when new transaction is imported by the transaction pool.
This transaction will be fetched from the TransactionPool
that was passed at
initialization as part of the configuration and propagated to peers.
Make sure an important block is propagated to peers.
In chain-based consensus, we often need to make sure non-best forks are at least temporarily synced. This function forces such an announcement.
Report a given peer as either beneficial (+) or costly (-) according to the given scalar.
Disconnect from a node as soon as possible.
This triggers the same effects as if the connection had closed itself spontaneously.
See also NetworkService::remove_from_peers_set
, which has the same effect but also
prevents the local node from re-establishing an outgoing substream to this peer until it
is added again.
Request a justification for the given block from the network.
On success, the justification will be passed to the import queue that was part at initialization as part of the configuration.
Clear all pending justification requests.
Are we in the process of downloading the chain?
Start getting a value from the DHT.
This will generate either a ValueFound
or a ValueNotFound
event and pass it as an
item on the NetworkWorker
stream.
Start putting a value in the DHT.
This will generate either a ValuePut
or a ValuePutFailed
event and pass it as an
item on the NetworkWorker
stream.
Connect to unreserved peers and allow unreserved peers to connect for syncing purposes.
Disconnect from unreserved peers and deny new unreserved peers to connect for syncing purposes.
Adds a PeerId
and its address as reserved. The string should encode the address
and peer ID of the remote node.
Returns an Err
if the given string is not a valid multiaddress
or contains an invalid peer ID (which includes the local peer ID).
Removes a PeerId
from the list of reserved peers.
Sets the reserved set of a protocol to the given set of peers.
Each Multiaddr
must end with a /p2p/
component containing the PeerId
. It can also
consist of only /p2p/<peerid>
.
The node will start establishing/accepting connections and substreams to/from peers in this set, if it doesn’t have any substream open with them yet.
Note however, if a call to this function results in less peers on the reserved set, they
will not necessarily get disconnected (depending on available free slots in the peer set).
If you want to also disconnect those removed peers, you will have to call
remove_from_peers_set
on those in addition to updating the reserved set. You can omit
this step if the peer set is in reserved only mode.
Returns an Err
if one of the given addresses is invalid or contains an
invalid peer ID (which includes the local peer ID).
Add peers to a peer set.
Each Multiaddr
must end with a /p2p/
component containing the PeerId
. It can also
consist of only /p2p/<peerid>
.
Returns an Err
if one of the given addresses is invalid or contains an
invalid peer ID (which includes the local peer ID).
Remove peers from a peer set.
Configure an explicit fork sync request.
Note that this function should not be used for recent blocks.
Sync should be able to download all the recent forks normally.
set_sync_fork_request
should only be used if external code detects that there’s
a stale fork missing.
Passing empty peers
set effectively removes the sync request.
Add a peer to a set of peers.
If the set has slots available, it will try to open a substream with this peer.
Each Multiaddr
must end with a /p2p/
component containing the PeerId
. It can also
consist of only /p2p/<peerid>
.
Returns an Err
if one of the given addresses is invalid or contains an
invalid peer ID (which includes the local peer ID).
Remove peers from a peer set.
If we currently have an open substream with this peer, it will soon be closed.
Returns the number of peers we’re connected to.
Inform the network service about new best imported block.
Trait Implementations
Request a justification for the given block.
Clear all pending justification requests.
Returns the local external addresses.
Returns the local Peer ID.
Auto Trait Implementations
impl<B, H> !RefUnwindSafe for NetworkService<B, H>
impl<B, H> Send for NetworkService<B, H>
impl<B, H> Sync for NetworkService<B, H>
impl<B, H> Unpin for NetworkService<B, H> where
H: Unpin,
impl<B, H> !UnwindSafe for NetworkService<B, H>
Blanket Implementations
Mutably borrows from an owned value. Read more
Convert Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read more
Convert Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read more
Convert &Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read more
Convert &mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read more
Causes self
to use its Binary
implementation when Debug
-formatted.
Causes self
to use its Display
implementation when
Debug
-formatted. Read more
Causes self
to use its LowerExp
implementation when
Debug
-formatted. Read more
Causes self
to use its LowerHex
implementation when
Debug
-formatted. Read more
Causes self
to use its Octal
implementation when Debug
-formatted.
Causes self
to use its Pointer
implementation when
Debug
-formatted. Read more
Causes self
to use its UpperExp
implementation when
Debug
-formatted. Read more
Causes self
to use its UpperHex
implementation when
Debug
-formatted. Read more
Pipes by value. This is generally the method you want to use. Read more
Borrows self
and passes that borrow into the pipe function. Read more
Mutably borrows self
and passes that borrow into the pipe function. Read more
Borrows self
, then passes self.borrow()
into the pipe function. Read more
Mutably borrows self
, then passes self.borrow_mut()
into the pipe
function. Read more
Borrows self
, then passes self.as_ref()
into the pipe function.
Mutably borrows self
, then passes self.as_mut()
into the pipe
function. Read more
Borrows self
, then passes self.deref()
into the pipe function.
fn pipe_as_ref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: AsRef<T>,
T: 'a,
R: 'a,
fn pipe_as_ref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: AsRef<T>,
T: 'a,
R: 'a,
Pipes a trait borrow into a function that cannot normally be called in suffix position. Read more
fn pipe_borrow<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Borrow<T>,
T: 'a,
R: 'a,
fn pipe_borrow<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Borrow<T>,
T: 'a,
R: 'a,
Pipes a trait borrow into a function that cannot normally be called in suffix position. Read more
fn pipe_deref<'a, R>(&'a self, func: impl FnOnce(&'a Self::Target) -> R) -> R where
Self: Deref,
R: 'a,
fn pipe_deref<'a, R>(&'a self, func: impl FnOnce(&'a Self::Target) -> R) -> R where
Self: Deref,
R: 'a,
Pipes a dereference into a function that cannot normally be called in suffix position. Read more
Pipes a reference into a function that cannot ordinarily be called in suffix position. Read more
Immutable access to the Borrow<B>
of a value. Read more
Mutable access to the BorrowMut<B>
of a value. Read more
Immutable access to the AsRef<R>
view of a value. Read more
Mutable access to the AsMut<R>
view of a value. Read more
Immutable access to the Deref::Target
of a value. Read more
Mutable access to the Deref::Target
of a value. Read more
Calls .tap()
only in debug builds, and is erased in release builds.
Calls .tap_mut()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_borrow()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_borrow_mut()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_ref()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_ref_mut()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_deref()
only in debug builds, and is erased in release
builds. Read more
Provides immutable access to the reference for inspection.
Calls tap_ref
in debug builds, and does nothing in release builds.
Provides mutable access to the reference for modification.
Calls tap_ref_mut
in debug builds, and does nothing in release builds.
Provides immutable access to the borrow for inspection. Read more
Calls tap_borrow
in debug builds, and does nothing in release builds.
fn tap_borrow_mut<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
fn tap_borrow_mut<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
Provides mutable access to the borrow for modification.
Immutably dereferences self
for inspection.
fn tap_deref_dbg<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
fn tap_deref_dbg<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
Calls tap_deref
in debug builds, and does nothing in release builds.
fn tap_deref_mut<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
fn tap_deref_mut<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
Mutably dereferences self
for modification.
The counterpart to unchecked_from
.
Consume self to return an equivalent value of T
.
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more