Crate communication[−][src]
Stronghold Communication
This crate enables strongholds on different devices and in different networks to communicate with each other.
The main basis for its functionality is the libp2p
crate, which is a system of protocols, specifications
and libraries that enable the development of peer-to-peer network applications
The library provides two options to use communication, either directly with the [P2PNetworkBehaviour
],
or by using the [CommunicationActor
] within a [ActorSystem
].
P2PNetworkBehaviour
The P2pNetworkBehaviour implements the [NetworkBehaviour
] by combining multiple protocols of Libp2p:
- Multiplexing following the Yamux specification
- Noise: Encryption of the communication using the Noise protocol with XX-Handshake
- Multicast DNS: Enable Peer Discovery in a local network
- Identify Protocol: Receive identifying information like the
PeerId
and listening addresses when connecting to a new peer. - Request-Response Protocol: Allows sending direct request/response messages between Peers; it expects a response for each request
Upon creating a new instance, a transport is created and upgraded, and combined with the P2PNetworkBehaviour into
a [ExpandedSwarm
].
This Swarm is returned to the caller and serves as entry-point for all communication to other peers.
Additional to the Libp2p methods of the [ExpandedSwarm
], it enables sending outbound messages, and manages the
known peers. Incoming [P2PEvents
] can be handled by polling from the swarm, e.g. via the [next
] method.
Example
use async_std::task; use communication::behaviour::{BehaviourConfig, P2PNetworkBehaviour}; use libp2p::identity::Keypair; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub enum Request { Ping, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum Response { Pong, } let local_keys = Keypair::generate_ed25519(); let config = BehaviourConfig::default(); let mut swarm = task::block_on(P2PNetworkBehaviour::<Request, Response>::init_swarm(local_keys, config)) .expect("Init swarm failed.");
CommunicationActor
The [CommunicationActor
] is using the riker
crate to implement the actor pattern.
When creating a new [CommunicationActor
], the actor creates a [P2PNetworkBehaviour
] and continuously polls for
events, incoming requests are sent to the client actor that has to be provided in the [CommunicationConfig
].
All swarm interaction, and configuration of the [CommunicationActor
] is accomplished by sending the appropriate
[CommunicationRequest
] to it, for each [CommunicationRequest
] a [CommunicationResults
] is returned to the
sender, this also allows using the ask pattern.
Firewall
The communication actor implements a firewall that checks the permission of each outgoing and incoming requests and
drops them if the necessary permission has not been set. The required [ToPermissionVariants
] trait for messages
can be derived with the [communication-macros
], this allows in case of enum Request
types to accept specific variants while rejecting others.
Modules
actor | Actor |
behaviour | P2PNetworkBehaviour |
libp2p | Re-export |