Skip to main content

HoprTransport

Struct HoprTransport 

Source
pub struct HoprTransport<Chain, Graph, Net> {
Show 13 fields pub(crate) packet_key: OffchainKeypair, pub(crate) chain_key: ChainKeypair, pub(crate) chain_api: Chain, pub(crate) ping: Arc<OnceLock<Pinger>>, pub(crate) network: Arc<OnceLock<Net>>, pub(crate) graph: Graph, pub(crate) path_planner: PathPlanner<MemorySurbStore, Chain, HoprGraphPathSelector<Graph>>, pub(crate) my_multiaddresses: Vec<Multiaddr>, pub(crate) smgr: Arc<SessionManager<Sender<(DestinationRouting, ApplicationDataOut)>>>, pub(crate) session_telemetry_tag_allocator: Arc<dyn TagAllocator + Send + Sync>, pub(crate) probing_tag_allocator: Arc<dyn TagAllocator + Send + Sync>, pub(crate) counters: PeerProtocolCounterRegistry, pub(crate) cfg: HoprProtocolConfig,
}
Expand description

Interface into the physical transport mechanism allowing all off-chain HOPR-related tasks on the transport.

Fields§

§packet_key: OffchainKeypair§chain_key: ChainKeypair§chain_api: Chain§ping: Arc<OnceLock<Pinger>>§network: Arc<OnceLock<Net>>§graph: Graph§path_planner: PathPlanner<MemorySurbStore, Chain, HoprGraphPathSelector<Graph>>§my_multiaddresses: Vec<Multiaddr>§smgr: Arc<SessionManager<Sender<(DestinationRouting, ApplicationDataOut)>>>§session_telemetry_tag_allocator: Arc<dyn TagAllocator + Send + Sync>§probing_tag_allocator: Arc<dyn TagAllocator + Send + Sync>§counters: PeerProtocolCounterRegistry§cfg: HoprProtocolConfig

Implementations§

Source§

impl<Chain, Graph, Net> HoprTransport<Chain, Graph, Net>
where Chain: ChainReadChannelOperations + ChainReadAccountOperations + ChainWriteTicketOperations + ChainKeyOperations + ChainReadTicketOperations + ChainValues + Clone + Send + Sync + 'static, Graph: NetworkGraphView<NodeId = OffchainPublicKey> + NetworkGraphUpdate + NetworkGraphWrite<NodeId = OffchainPublicKey> + NetworkGraphTraverse<NodeId = OffchainPublicKey> + Clone + Send + Sync + 'static, <Graph as NetworkGraphView>::Observed: EdgeObservableRead + Send, <Graph as NetworkGraphTraverse>::Observed: EdgeObservableRead + Send + 'static, <Graph as NetworkGraphWrite>::Observed: EdgeObservableWrite + Send, Net: NetworkView + NetworkStreamControl + Clone + Send + Sync + 'static,

Source

pub fn new( identity: (&ChainKeypair, &OffchainKeypair), resolver: Chain, graph: Graph, my_multiaddresses: Vec<Multiaddr>, cfg: HoprProtocolConfig, ) -> Result<Self>

Source

pub async fn run_relay<T, TFact, Ct>( &self, cover_traffic: Ct, network: Net, network_process: BoxedProcessFn, ticket_events: T, ticket_factory: TFact, on_incoming_session: Sender<IncomingSession>, ) -> Result<(HoprSocket<BoxStream<'static, ApplicationDataIn>, Sender<(DestinationRouting, ApplicationDataOut)>>, AbortableList<HoprTransportProcess>)>
where T: Sink<TicketEvent> + Clone + Send + Unpin + 'static, T::Error: Error + Clone + Send, Ct: ProbingTrafficGeneration + CoverTrafficGeneration + Send + Sync + 'static, TFact: TicketFactory + Clone + Send + Sync + 'static,

Execute all processes of the HoprTransport object as a Relay node.

Relay nodes run the full packet pipeline including incoming ticket/acknowledgement processing and require a [futures::Sink] for ticket events as well as an on_incoming_session channel from the SessionManager (they can accept incoming sessions).

Source

pub async fn run_exit<TFact, Ct>( &self, cover_traffic: Ct, network: Net, network_process: BoxedProcessFn, ticket_factory: TFact, on_incoming_session: Sender<IncomingSession>, ) -> Result<(HoprSocket<BoxStream<'static, ApplicationDataIn>, Sender<(DestinationRouting, ApplicationDataOut)>>, AbortableList<HoprTransportProcess>)>
where Ct: ProbingTrafficGeneration + CoverTrafficGeneration + Send + Sync + 'static, TFact: TicketFactory + Clone + Send + Sync + 'static,

Execute all processes of the HoprTransport object as an Exit (destination) node.

Exit nodes do not process tickets but keep the incoming acknowledgement pipeline running and can accept incoming sessions via SessionManager.

Source

pub async fn run_entry<TFact, Ct>( &self, cover_traffic: Ct, network: Net, network_process: BoxedProcessFn, ticket_factory: TFact, ) -> Result<(HoprSocket<BoxStream<'static, ApplicationDataIn>, Sender<(DestinationRouting, ApplicationDataOut)>>, AbortableList<HoprTransportProcess>)>
where Ct: ProbingTrafficGeneration + CoverTrafficGeneration + Send + Sync + 'static, TFact: TicketFactory + Clone + Send + Sync + 'static,

Execute all processes of the HoprTransport object as an Entry (source) node.

Entry nodes do not process tickets, do not start the incoming acknowledgement pipeline, and do not accept incoming sessions — therefore, they require neither a ticket_events sink nor an on_incoming_session channel.

Source

pub(crate) async fn run_inner<T, TFact, Ct>( &self, role: NodeType, cover_traffic: Ct, network: Net, network_process: BoxedProcessFn, ticket_events: T, ticket_factory: TFact, on_incoming_session: Option<Sender<IncomingSession>>, ) -> Result<(HoprSocket<BoxStream<'static, ApplicationDataIn>, Sender<(DestinationRouting, ApplicationDataOut)>>, AbortableList<HoprTransportProcess>)>
where T: Sink<TicketEvent> + Clone + Send + Unpin + 'static, T::Error: Error + Clone + Send, Ct: ProbingTrafficGeneration + CoverTrafficGeneration + Send + Sync + 'static, TFact: TicketFactory + Clone + Send + Sync + 'static,

Internal worker driving all node-type variants of HoprTransport::run_*.

Branches on role:

Source

pub async fn ping( &self, peer: &OffchainPublicKey, ) -> Result<(Duration, <Graph as NetworkGraphView>::Observed)>

Source

pub async fn new_session( &self, destination: Address, target: SessionTarget, cfg: SessionClientConfig, ) -> Result<(HoprSession, HoprSessionConfigurator)>

Source

pub async fn listening_multiaddresses(&self) -> Vec<Multiaddr>

Source

pub fn announceable_multiaddresses(&self) -> Vec<Multiaddr>

Source

pub fn graph(&self) -> &Graph

Returns a reference to the network graph.

Source

pub fn local_multiaddresses(&self) -> Vec<Multiaddr>

Source

pub async fn network_observed_multiaddresses( &self, peer: &OffchainPublicKey, ) -> Vec<Multiaddr>

Source

pub async fn network_health(&self) -> Health

Source

pub async fn network_connected_peers(&self) -> Result<Vec<OffchainPublicKey>>

Source

pub fn network_peer_observations( &self, peer: &OffchainPublicKey, ) -> Option<<Graph as NetworkGraphView>::Observed>

Source

pub async fn all_network_peers( &self, minimum_score: f64, ) -> Result<Vec<(OffchainPublicKey, <Graph as NetworkGraphView>::Observed)>>

Get connected peers with quality higher than some value.

Trait Implementations§

Source§

impl<Chain, Graph, Net> NetworkView for HoprTransport<Chain, Graph, Net>
where Net: NetworkView + Send + Sync + 'static,

Source§

fn listening_as(&self) -> HashSet<Multiaddr>

Multiaddresses used for listening by the local node.
Source§

fn multiaddress_of(&self, peer: &PeerId) -> Option<HashSet<Multiaddr>>

Translation of the peer into its known multiaddresses.
Source§

fn discovered_peers(&self) -> HashSet<PeerId>

Peers collected by the network discovery mechanism.
Source§

fn connected_peers(&self) -> HashSet<PeerId>

Peers currently connected and tracked by the network.
Source§

fn is_connected(&self, peer: &PeerId) -> bool

Peers currently connected and tracked by the network.
Source§

fn health(&self) -> Health

Represents perceived health of the network.
Source§

fn subscribe_network_events( &self, ) -> impl Stream<Item = NetworkEvent> + Send + 'static

Subscribes to network events (peer connected/disconnected). Read more
Source§

impl<Chain, Graph, Net> TransportOperations for HoprTransport<Chain, Graph, Net>
where Chain: ChainReadChannelOperations + ChainReadAccountOperations + ChainWriteTicketOperations + ChainKeyOperations + ChainReadTicketOperations + ChainValues + Clone + Send + Sync + 'static, Graph: NetworkGraphView<NodeId = OffchainPublicKey> + NetworkGraphUpdate + NetworkGraphWrite<NodeId = OffchainPublicKey> + NetworkGraphTraverse<NodeId = OffchainPublicKey> + Clone + Send + Sync + 'static, <Graph as NetworkGraphView>::Observed: EdgeObservableRead + Send, <Graph as NetworkGraphTraverse>::Observed: EdgeObservableRead + Send + 'static, <Graph as NetworkGraphWrite>::Observed: EdgeObservableWrite + Send, Net: NetworkView + NetworkStreamControl + Clone + Send + Sync + 'static,

Source§

type Error = HoprTransportError

Error type for transport operations.
Source§

type Observable = <Graph as NetworkGraphView>::Observed

Observable type for peer quality measurements.
Source§

fn ping<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 OffchainPublicKey, ) -> Pin<Box<dyn Future<Output = Result<(Duration, Self::Observable), Self::Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Pings a peer, returns the round-trip time and quality observations.
Source§

fn observed_multiaddresses<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 OffchainPublicKey, ) -> Pin<Box<dyn Future<Output = Vec<Multiaddr>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Returns the observed multiaddresses for a peer.

Auto Trait Implementations§

§

impl<Chain, Graph, Net> Freeze for HoprTransport<Chain, Graph, Net>
where Chain: Freeze, Graph: Freeze,

§

impl<Chain, Graph, Net> !RefUnwindSafe for HoprTransport<Chain, Graph, Net>

§

impl<Chain, Graph, Net> Send for HoprTransport<Chain, Graph, Net>
where Chain: Send + Sync, Graph: Send + Sync, Net: Sync + Send,

§

impl<Chain, Graph, Net> Sync for HoprTransport<Chain, Graph, Net>
where Chain: Sync + Send, Graph: Sync + Send, Net: Sync + Send,

§

impl<Chain, Graph, Net> Unpin for HoprTransport<Chain, Graph, Net>
where Chain: Unpin, Graph: Unpin,

§

impl<Chain, Graph, Net> !UnwindSafe for HoprTransport<Chain, Graph, Net>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more