1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
use super::{BlockService, FragmentService, GossipService};
use crate::data::p2p::{AuthenticatedNodeId, Peer};
use crate::data::HandshakeResponse;
use crate::error::Error;
use async_trait::async_trait;
/// Interface to application logic of the blockchain node server.
///
/// An implementation of a blockchain node implements this trait to
/// serve the network protocols using node's subsystems such as
/// block storage and fragment processor.
#[async_trait]
pub trait Node: Send + Sync + 'static {
/// The implementation of the block service.
type BlockService: BlockService + Send + Sync;
/// The implementation of the fragment service.
type FragmentService: FragmentService + Send + Sync;
/// The implementation of the gossip service.
type GossipService: GossipService + Send + Sync;
/// Implements node handshake. The server returns the ID of the genesis
/// block and its own node ID, authenticated with the signature of `nonce`.
async fn handshake(&self, peer: Peer, nonce: &[u8]) -> Result<HandshakeResponse, Error>;
/// Handles client ID authentication.
async fn client_auth(&self, peer: Peer, auth: AuthenticatedNodeId) -> Result<(), Error>;
/// Instantiates the block service,
/// if supported by this node.
fn block_service(&self) -> Option<&Self::BlockService>;
/// Instantiates the fragment service,
/// if supported by this node.
fn fragment_service(&self) -> Option<&Self::FragmentService>;
/// Instantiates the gossip service,
/// if supported by this node.
fn gossip_service(&self) -> Option<&Self::GossipService>;
}