Struct libp2p_gossipsub::Gossipsub
source · pub struct Gossipsub<D: DataTransform = IdentityTransform, F: TopicSubscriptionFilter = AllowAllSubscriptionFilter> { /* private fields */ }
Expand description
Network behaviour that handles the gossipsub protocol.
NOTE: Initialisation requires a MessageAuthenticity
and GossipsubConfig
instance. If
message signing is disabled, the ValidationMode
in the config should be adjusted to an
appropriate level to accept unsigned messages.
The DataTransform trait allows applications to optionally add extra encoding/decoding functionality to the underlying messages. This is intended for custom compression algorithms.
The TopicSubscriptionFilter allows applications to implement specific filters on topics to prevent unwanted messages being propagated and evaluated.
Implementations§
source§impl<D, F> Gossipsub<D, F>where
D: DataTransform + Default,
F: TopicSubscriptionFilter + Default,
impl<D, F> Gossipsub<D, F>where
D: DataTransform + Default,
F: TopicSubscriptionFilter + Default,
sourcepub fn new(
privacy: MessageAuthenticity,
config: GossipsubConfig
) -> Result<Self, &'static str>
pub fn new(
privacy: MessageAuthenticity,
config: GossipsubConfig
) -> Result<Self, &'static str>
Creates a Gossipsub
struct given a set of parameters specified via a
GossipsubConfig
. This has no subscription filter and uses no compression.
sourcepub fn new_with_metrics(
privacy: MessageAuthenticity,
config: GossipsubConfig,
metrics_registry: &mut Registry,
metrics_config: MetricsConfig
) -> Result<Self, &'static str>
pub fn new_with_metrics(
privacy: MessageAuthenticity,
config: GossipsubConfig,
metrics_registry: &mut Registry,
metrics_config: MetricsConfig
) -> Result<Self, &'static str>
Creates a Gossipsub
struct given a set of parameters specified via a
GossipsubConfig
. This has no subscription filter and uses no compression.
Metrics can be evaluated by passing a reference to a Registry
.
source§impl<D, F> Gossipsub<D, F>where
D: DataTransform + Default,
F: TopicSubscriptionFilter,
impl<D, F> Gossipsub<D, F>where
D: DataTransform + Default,
F: TopicSubscriptionFilter,
sourcepub fn new_with_subscription_filter(
privacy: MessageAuthenticity,
config: GossipsubConfig,
metrics: Option<(&mut Registry, MetricsConfig)>,
subscription_filter: F
) -> Result<Self, &'static str>
pub fn new_with_subscription_filter(
privacy: MessageAuthenticity,
config: GossipsubConfig,
metrics: Option<(&mut Registry, MetricsConfig)>,
subscription_filter: F
) -> Result<Self, &'static str>
Creates a Gossipsub
struct given a set of parameters specified via a
GossipsubConfig
and a custom subscription filter.
source§impl<D, F> Gossipsub<D, F>where
D: DataTransform,
F: TopicSubscriptionFilter + Default,
impl<D, F> Gossipsub<D, F>where
D: DataTransform,
F: TopicSubscriptionFilter + Default,
sourcepub fn new_with_transform(
privacy: MessageAuthenticity,
config: GossipsubConfig,
metrics: Option<(&mut Registry, MetricsConfig)>,
data_transform: D
) -> Result<Self, &'static str>
pub fn new_with_transform(
privacy: MessageAuthenticity,
config: GossipsubConfig,
metrics: Option<(&mut Registry, MetricsConfig)>,
data_transform: D
) -> Result<Self, &'static str>
Creates a Gossipsub
struct given a set of parameters specified via a
GossipsubConfig
and a custom data transform.
source§impl<D, F> Gossipsub<D, F>where
D: DataTransform,
F: TopicSubscriptionFilter,
impl<D, F> Gossipsub<D, F>where
D: DataTransform,
F: TopicSubscriptionFilter,
sourcepub fn new_with_subscription_filter_and_transform(
privacy: MessageAuthenticity,
config: GossipsubConfig,
metrics: Option<(&mut Registry, MetricsConfig)>,
subscription_filter: F,
data_transform: D
) -> Result<Self, &'static str>
pub fn new_with_subscription_filter_and_transform(
privacy: MessageAuthenticity,
config: GossipsubConfig,
metrics: Option<(&mut Registry, MetricsConfig)>,
subscription_filter: F,
data_transform: D
) -> Result<Self, &'static str>
Creates a Gossipsub
struct given a set of parameters specified via a
GossipsubConfig
and a custom subscription filter and data transform.
source§impl<D, F> Gossipsub<D, F>where
D: DataTransform + Send + 'static,
F: TopicSubscriptionFilter + Send + 'static,
impl<D, F> Gossipsub<D, F>where
D: DataTransform + Send + 'static,
F: TopicSubscriptionFilter + Send + 'static,
sourcepub fn topics(&self) -> impl Iterator<Item = &TopicHash>
pub fn topics(&self) -> impl Iterator<Item = &TopicHash>
Lists the hashes of the topics we are currently subscribed to.
sourcepub fn mesh_peers(&self, topic_hash: &TopicHash) -> impl Iterator<Item = &PeerId>
pub fn mesh_peers(&self, topic_hash: &TopicHash) -> impl Iterator<Item = &PeerId>
Lists all mesh peers for a certain topic hash.
pub fn all_mesh_peers(&self) -> impl Iterator<Item = &PeerId>
sourcepub fn all_peers(&self) -> impl Iterator<Item = (&PeerId, Vec<&TopicHash>)>
pub fn all_peers(&self) -> impl Iterator<Item = (&PeerId, Vec<&TopicHash>)>
Lists all known peers and their associated subscribed topics.
sourcepub fn peer_protocol(&self) -> impl Iterator<Item = (&PeerId, &PeerKind)>
pub fn peer_protocol(&self) -> impl Iterator<Item = (&PeerId, &PeerKind)>
Lists all known peers and their associated protocol.
sourcepub fn peer_score(&self, peer_id: &PeerId) -> Option<f64>
pub fn peer_score(&self, peer_id: &PeerId) -> Option<f64>
Returns the gossipsub score for a given peer, if one exists.
sourcepub fn subscribe<H: Hasher>(
&mut self,
topic: &Topic<H>
) -> Result<bool, SubscriptionError>
pub fn subscribe<H: Hasher>(
&mut self,
topic: &Topic<H>
) -> Result<bool, SubscriptionError>
Subscribe to a topic.
Returns [Ok(true)
] if the subscription worked. Returns [Ok(false)
] if we were already
subscribed.
sourcepub fn unsubscribe<H: Hasher>(
&mut self,
topic: &Topic<H>
) -> Result<bool, PublishError>
pub fn unsubscribe<H: Hasher>(
&mut self,
topic: &Topic<H>
) -> Result<bool, PublishError>
Unsubscribes from a topic.
Returns [Ok(true)
] if we were subscribed to this topic.
sourcepub fn publish(
&mut self,
topic: impl Into<TopicHash>,
data: impl Into<Vec<u8>>
) -> Result<MessageId, PublishError>
pub fn publish(
&mut self,
topic: impl Into<TopicHash>,
data: impl Into<Vec<u8>>
) -> Result<MessageId, PublishError>
Publishes a message with multiple topics to the network.
sourcepub fn report_message_validation_result(
&mut self,
msg_id: &MessageId,
propagation_source: &PeerId,
acceptance: MessageAcceptance
) -> Result<bool, PublishError>
pub fn report_message_validation_result(
&mut self,
msg_id: &MessageId,
propagation_source: &PeerId,
acceptance: MessageAcceptance
) -> Result<bool, PublishError>
This function should be called when GossipsubConfig::validate_messages()
is true
after
the message got validated by the caller. Messages are stored in the [‘Memcache’] and
validation is expected to be fast enough that the messages should still exist in the cache.
There are three possible validation outcomes and the outcome is given in acceptance.
If acceptance = MessageAcceptance::Accept
the message will get propagated to the
network. The propagation_source
parameter indicates who the message was received by and
will not be forwarded back to that peer.
If acceptance = MessageAcceptance::Reject
the message will be deleted from the memcache
and the P₄ penalty will be applied to the propagation_source
.
If acceptance = MessageAcceptance::Ignore
the message will be deleted from the memcache
but no P₄ penalty will be applied.
This function will return true if the message was found in the cache and false if was not in the cache anymore.
This should only be called once per message.
sourcepub fn add_explicit_peer(&mut self, peer_id: &PeerId)
pub fn add_explicit_peer(&mut self, peer_id: &PeerId)
Adds a new peer to the list of explicitly connected peers.
sourcepub fn remove_explicit_peer(&mut self, peer_id: &PeerId)
pub fn remove_explicit_peer(&mut self, peer_id: &PeerId)
This removes the peer from explicitly connected peers, note that this does not disconnect the peer.
sourcepub fn blacklist_peer(&mut self, peer_id: &PeerId)
pub fn blacklist_peer(&mut self, peer_id: &PeerId)
Blacklists a peer. All messages from this peer will be rejected and any message that was created by this peer will be rejected.
sourcepub fn remove_blacklisted_peer(&mut self, peer_id: &PeerId)
pub fn remove_blacklisted_peer(&mut self, peer_id: &PeerId)
Removes a peer from the blacklist if it has previously been blacklisted.
sourcepub fn with_peer_score(
&mut self,
params: PeerScoreParams,
threshold: PeerScoreThresholds
) -> Result<(), String>
pub fn with_peer_score(
&mut self,
params: PeerScoreParams,
threshold: PeerScoreThresholds
) -> Result<(), String>
Activates the peer scoring system with the given parameters. This will reset all scores if there was already another peer scoring system activated. Returns an error if the params are not valid or if they got already set.
sourcepub fn with_peer_score_and_message_delivery_time_callback(
&mut self,
params: PeerScoreParams,
threshold: PeerScoreThresholds,
callback: Option<fn(_: &PeerId, _: &TopicHash, _: f64)>
) -> Result<(), String>
pub fn with_peer_score_and_message_delivery_time_callback(
&mut self,
params: PeerScoreParams,
threshold: PeerScoreThresholds,
callback: Option<fn(_: &PeerId, _: &TopicHash, _: f64)>
) -> Result<(), String>
Activates the peer scoring system with the given parameters and a message delivery time callback. Returns an error if the parameters got already set.
sourcepub fn set_topic_params<H: Hasher>(
&mut self,
topic: Topic<H>,
params: TopicScoreParams
) -> Result<(), &'static str>
pub fn set_topic_params<H: Hasher>(
&mut self,
topic: Topic<H>,
params: TopicScoreParams
) -> Result<(), &'static str>
Sets scoring parameters for a topic.
The Self::with_peer_score()
must first be called to initialise peer scoring.
sourcepub fn set_application_score(&mut self, peer_id: &PeerId, new_score: f64) -> bool
pub fn set_application_score(&mut self, peer_id: &PeerId, new_score: f64) -> bool
Sets the application specific score for a peer. Returns true if scoring is active and the peer is connected or if the score of the peer is not yet expired, false otherwise.
Trait Implementations§
source§impl<C: DataTransform, F: TopicSubscriptionFilter> Debug for Gossipsub<C, F>
impl<C: DataTransform, F: TopicSubscriptionFilter> Debug for Gossipsub<C, F>
source§impl<C, F> NetworkBehaviour for Gossipsub<C, F>where
C: Send + 'static + DataTransform,
F: Send + 'static + TopicSubscriptionFilter,
impl<C, F> NetworkBehaviour for Gossipsub<C, F>where
C: Send + 'static + DataTransform,
F: Send + 'static + TopicSubscriptionFilter,
§type ConnectionHandler = GossipsubHandler
type ConnectionHandler = GossipsubHandler
§type OutEvent = GossipsubEvent
type OutEvent = GossipsubEvent
NetworkBehaviour
and that the swarm will report back.source§fn new_handler(&mut self) -> Self::ConnectionHandler
fn new_handler(&mut self) -> Self::ConnectionHandler
ConnectionHandler
for a connection with a peer. Read moresource§fn on_connection_handler_event(
&mut self,
propagation_source: PeerId,
_connection_id: ConnectionId,
handler_event: <<Self::ConnectionHandler as IntoConnectionHandler>::Handler as ConnectionHandler>::OutEvent
)
fn on_connection_handler_event(
&mut self,
propagation_source: PeerId,
_connection_id: ConnectionId,
handler_event: <<Self::ConnectionHandler as IntoConnectionHandler>::Handler as ConnectionHandler>::OutEvent
)
ConnectionHandler
dedicated to the
peer identified by peer_id
. for the behaviour. Read moresource§fn poll(
&mut self,
cx: &mut Context<'_>,
_: &mut impl PollParameters
) -> Poll<NetworkBehaviourAction<Self::OutEvent, Self::ConnectionHandler>>
fn poll(
&mut self,
cx: &mut Context<'_>,
_: &mut impl PollParameters
) -> Poll<NetworkBehaviourAction<Self::OutEvent, Self::ConnectionHandler>>
source§fn on_swarm_event(&mut self, event: FromSwarm<'_, Self::ConnectionHandler>)
fn on_swarm_event(&mut self, event: FromSwarm<'_, Self::ConnectionHandler>)
Swarm
.source§fn addresses_of_peer(&mut self, _: &PeerId) -> Vec<Multiaddr, Global> ⓘ
fn addresses_of_peer(&mut self, _: &PeerId) -> Vec<Multiaddr, Global> ⓘ
source§fn inject_connection_established(
&mut self,
peer_id: &PeerId,
connection_id: &ConnectionId,
endpoint: &ConnectedPoint,
failed_addresses: Option<&Vec<Multiaddr, Global>>,
other_established: usize
)
fn inject_connection_established(
&mut self,
peer_id: &PeerId,
connection_id: &ConnectionId,
endpoint: &ConnectedPoint,
failed_addresses: Option<&Vec<Multiaddr, Global>>,
other_established: usize
)
FromSwarm::ConnectionEstablished
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_connection_closed(
&mut self,
peer_id: &PeerId,
connection_id: &ConnectionId,
endpoint: &ConnectedPoint,
handler: <Self::ConnectionHandler as IntoConnectionHandler>::Handler,
remaining_established: usize
)
fn inject_connection_closed(
&mut self,
peer_id: &PeerId,
connection_id: &ConnectionId,
endpoint: &ConnectedPoint,
handler: <Self::ConnectionHandler as IntoConnectionHandler>::Handler,
remaining_established: usize
)
FromSwarm::ConnectionClosed
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_address_change(
&mut self,
peer_id: &PeerId,
connection_id: &ConnectionId,
old: &ConnectedPoint,
new: &ConnectedPoint
)
fn inject_address_change(
&mut self,
peer_id: &PeerId,
connection_id: &ConnectionId,
old: &ConnectedPoint,
new: &ConnectedPoint
)
FromSwarm::AddressChange
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.ConnectedPoint
of an existing connection has changed.source§fn inject_event(
&mut self,
peer_id: PeerId,
connection: ConnectionId,
event: <<Self::ConnectionHandler as IntoConnectionHandler>::Handler as ConnectionHandler>::OutEvent
)
fn inject_event(
&mut self,
peer_id: PeerId,
connection: ConnectionId,
event: <<Self::ConnectionHandler as IntoConnectionHandler>::Handler as ConnectionHandler>::OutEvent
)
NetworkBehaviour::on_connection_handler_event
instead. The default implementation of this inject_*
method delegates to it.peer_id
.
for the behaviour. Read moresource§fn inject_dial_failure(
&mut self,
peer_id: Option<PeerId>,
handler: Self::ConnectionHandler,
error: &DialError
)
fn inject_dial_failure(
&mut self,
peer_id: Option<PeerId>,
handler: Self::ConnectionHandler,
error: &DialError
)
InEvent::DialFailure
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_listen_failure(
&mut self,
local_addr: &Multiaddr,
send_back_addr: &Multiaddr,
handler: Self::ConnectionHandler
)
fn inject_listen_failure(
&mut self,
local_addr: &Multiaddr,
send_back_addr: &Multiaddr,
handler: Self::ConnectionHandler
)
FromSwarm::ListenFailure
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_new_listener(&mut self, id: ListenerId)
fn inject_new_listener(&mut self, id: ListenerId)
FromSwarm::NewListener
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_new_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr)
fn inject_new_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr)
FromSwarm::NewListenAddr
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_expired_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr)
fn inject_expired_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr)
FromSwarm::ExpiredListenAddr
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn Error + 'static))
fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn Error + 'static))
FromSwarm::ListenerError
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_listener_closed(&mut self, id: ListenerId, reason: Result<(), &Error>)
fn inject_listener_closed(&mut self, id: ListenerId, reason: Result<(), &Error>)
FromSwarm::ListenerClosed
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_new_external_addr(&mut self, addr: &Multiaddr)
fn inject_new_external_addr(&mut self, addr: &Multiaddr)
FromSwarm::NewExternalAddr
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.source§fn inject_expired_external_addr(&mut self, addr: &Multiaddr)
fn inject_expired_external_addr(&mut self, addr: &Multiaddr)
FromSwarm::ExpiredExternalAddr
in NetworkBehaviour::on_swarm_event
instead. The default implementation of this inject_*
method delegates to it.