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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
//! A Protocol defines a P2P subprotocol in a `RLPx` connection
use crate::{Capability, EthMessageID, EthVersion};
/// Type that represents a [Capability] and the number of messages it uses.
///
/// Only the [Capability] is shared with the remote peer, assuming both parties know the number of
/// messages used by the protocol which is used for message ID multiplexing.
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Protocol {
/// The name of the subprotocol
pub cap: Capability,
/// The number of messages used/reserved by this protocol
///
/// This is used for message ID multiplexing
messages: u8,
}
impl Protocol {
/// Create a new protocol with the given name and number of messages
pub const fn new(cap: Capability, messages: u8) -> Self {
Self { cap, messages }
}
/// Returns the corresponding eth capability for the given version.
pub const fn eth(version: EthVersion) -> Self {
let cap = Capability::eth(version);
let messages = version.total_messages();
Self::new(cap, messages)
}
/// Returns the [`EthVersion::Eth66`] capability.
pub const fn eth_66() -> Self {
Self::eth(EthVersion::Eth66)
}
/// Returns the [`EthVersion::Eth67`] capability.
pub const fn eth_67() -> Self {
Self::eth(EthVersion::Eth67)
}
/// Returns the [`EthVersion::Eth68`] capability.
pub const fn eth_68() -> Self {
Self::eth(EthVersion::Eth68)
}
/// Consumes the type and returns a tuple of the [Capability] and number of messages.
#[inline]
pub(crate) fn split(self) -> (Capability, u8) {
(self.cap, self.messages)
}
/// The number of values needed to represent all message IDs of capability.
pub fn messages(&self) -> u8 {
if self.cap.is_eth() {
return EthMessageID::max() + 1
}
self.messages
}
}
impl From<EthVersion> for Protocol {
fn from(version: EthVersion) -> Self {
Self::eth(version)
}
}
/// A helper type to keep track of the protocol version and number of messages used by the protocol.
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub(crate) struct ProtoVersion {
/// Number of messages for a protocol
pub(crate) messages: u8,
/// Version of the protocol
pub(crate) version: usize,
}