Struct MetaAddr

Source
pub struct MetaAddr { /* private fields */ }
Expand description

An address with metadata on its advertised services and last-seen time.

This struct can be created from addr or addrv2 messages.

Bitcoin reference

Implementations§

Source§

impl MetaAddr

Source

pub fn new_initial_peer(addr: PeerSocketAddr) -> MetaAddrChange

Returns a [MetaAddrChange::NewInitial] for a peer that was excluded from the list of the initial peers.

Source

pub fn new_gossiped_meta_addr( addr: PeerSocketAddr, untrusted_services: PeerServices, untrusted_last_seen: DateTime32, ) -> MetaAddr

Returns a new MetaAddr, based on the deserialized fields from a gossiped peer [Addr][crate::protocol::external::Message::Addr] message.

Source

pub fn new_gossiped_change(self) -> Option<MetaAddrChange>

Returns a [MetaAddrChange::NewGossiped], based on a gossiped peer MetaAddr.

Returns None if the gossiped peer is missing the untrusted services field.

Source

pub fn new_connected( addr: PeerSocketAddr, services: &PeerServices, is_inbound: bool, ) -> MetaAddrChange

Returns a [MetaAddrChange::UpdateConnected] for a peer that has just successfully connected.

§Security

This address must be the remote address from an outbound connection, and the services must be the services from that peer’s handshake.

Otherwise:

  • malicious peers could interfere with other peers’ AddressBook state, or
  • Zebra could advertise unreachable addresses to its own peers.
Source

pub fn new_responded(addr: PeerSocketAddr) -> MetaAddrChange

Returns a [MetaAddrChange::UpdateResponded] for a peer that has just sent us a message.

§Security

This address must be the remote address from an outbound connection.

Otherwise:

  • malicious peers could interfere with other peers’ AddressBook state, or
  • Zebra could advertise unreachable addresses to its own peers.
Source

pub fn new_reconnect(addr: PeerSocketAddr) -> MetaAddrChange

Returns a [MetaAddrChange::UpdateAttempt] for a peer that we want to make an outbound connection to.

Source

pub fn new_local_listener_change( addr: impl Into<PeerSocketAddr>, ) -> MetaAddrChange

Returns a [MetaAddrChange::NewLocal] for our own listener address.

Source

pub fn new_errored( addr: PeerSocketAddr, services: impl Into<Option<PeerServices>>, ) -> MetaAddrChange

Returns a [MetaAddrChange::UpdateFailed] for a peer that has just had an error.

Source

pub fn new_shutdown(addr: PeerSocketAddr) -> MetaAddrChange

Create a new MetaAddr for a peer that has just shut down.

Source

pub fn addr(&self) -> PeerSocketAddr

Return the address for this MetaAddr.

Source

pub fn peer_preference(&self) -> Result<PeerPreference, &'static str>

Return the address preference level for this MetaAddr.

Source

pub fn last_seen(&self) -> Option<DateTime32>

Returns the time of the last successful interaction with this peer.

Initially set to the unverified “last seen time” gossiped by the remote peer that sent us this address.

If the last_connection_state has ever been Responded, this field is set to the last time we processed a message from this peer.

§Security

last_seen times from peers that have never Responded may be incorrect due to clock skew, or buggy or malicious peers.

Source

pub fn is_inbound(&self) -> bool

Returns whether the address is from an inbound peer connection

Source

pub fn last_attempt(&self) -> Option<Instant>

Returns the time of our last outbound connection attempt with this peer.

If the last_connection_state has ever been AttemptPending, this field is set to the last time we started an outbound connection attempt with this peer.

Source

pub fn last_failure(&self) -> Option<Instant>

Returns the time of our last failed outbound connection with this peer.

If the last_connection_state has ever been Failed, this field is set to the last time:

  • a connection attempt failed, or
  • an open connection encountered a fatal protocol error.
Source

pub fn has_connection_recently_responded(&self, now: DateTime<Utc>) -> bool

Have we had any recently messages from this peer?

Returns true if the peer is likely connected and responsive in the peer set.

constants::MIN_PEER_RECONNECTION_DELAY represents the time interval in which we should receive at least one message from a peer, or close the connection. Therefore, if the last-seen timestamp is older than constants::MIN_PEER_RECONNECTION_DELAY ago, we know we should have disconnected from it. Otherwise, we could potentially be connected to it.

Source

pub fn was_connection_recently_attempted(&self, now: Instant) -> bool

Have we recently attempted an outbound connection to this peer?

Returns true if this peer was recently attempted, or has a connection attempt in progress.

Source

pub fn has_connection_recently_failed(&self, now: Instant) -> bool

Have we recently had a failed connection to this peer?

Returns true if this peer has recently failed.

Source

pub fn was_recently_live(&self, now: DateTime<Utc>) -> bool

Returns true if this peer has recently sent us a message.

Source

pub fn is_active_for_gossip(&self, now: DateTime<Utc>) -> bool

Has this peer been seen recently?

Returns true if this peer has responded recently or if the peer was gossiped with a recent reported last seen time.

constants::MAX_PEER_ACTIVE_FOR_GOSSIP represents the maximum time since a peer was seen to still be considered reachable.

Source

pub fn was_recently_updated( &self, instant_now: Instant, chrono_now: DateTime<Utc>, ) -> bool

Returns true if any messages were recently sent to or received from this address.

Source

pub fn is_ready_for_connection_attempt( &self, instant_now: Instant, chrono_now: DateTime<Utc>, network: &Network, ) -> bool

Is this address ready for a new outbound connection attempt?

Source

pub fn address_is_valid_for_outbound(&self, network: &Network) -> bool

Is the PeerSocketAddr we have for this peer valid for outbound connections?

Since the addresses in the address book are unique, this check can be used to permanently reject entire MetaAddrs.

Source

pub fn last_known_info_is_valid_for_outbound(&self, network: &Network) -> bool

Is the last known information for this peer valid for outbound connections?

The last known info might be outdated or untrusted, so this check can only be used to:

  • reject NeverAttempted... [MetaAddrChange]s, and
  • temporarily stop outbound connections to a MetaAddr.
Source

pub fn is_probably_reachable(&self, now: DateTime<Utc>) -> bool

Should this peer considered reachable?

A peer is probably reachable if:

  • it has never been attempted, or
  • the last connection attempt was successful, or
  • the last successful connection was less than 3 days ago.
§Security

This is used by Self::is_ready_for_connection_attempt so that Zebra stops trying to connect to peers that are likely unreachable.

The untrusted_last_seen time is used as a fallback time if the local node has never itself seen the peer. If the reported last seen time is a long time ago or None, then the local node will attempt to connect the peer once, and if that attempt fails it won’t try to connect ever again. (The state can’t be Failed until after the first connection attempt.)

Source

pub fn last_seen_is_recent(&self, now: DateTime<Utc>) -> bool

Was this peer last seen recently?

Returns true if this peer was last seen at most MAX_RECENT_PEER_AGE ago. Returns false if the peer is outdated, or it has no last seen time.

Source

pub fn misbehavior(&self) -> u32

Returns a score of misbehavior encountered in a peer at this address.

Source

pub fn sanitize(&self, network: &Network) -> Option<MetaAddr>

Return a sanitized version of this MetaAddr, for sending to a remote peer.

Returns None if this MetaAddr should not be sent to remote peers.

Trait Implementations§

Source§

impl Clone for MetaAddr

Source§

fn clone(&self) -> MetaAddr

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MetaAddr

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Ord for MetaAddr

Source§

fn cmp(&self, other: &Self) -> Ordering

MetaAddrs are sorted in approximate reconnection attempt order, but with Responded peers sorted first as a group.

But this order should not be used for reconnection attempts: use reconnection_peers instead.

See CandidateSet for more details.

1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for MetaAddr

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for MetaAddr

Source§

fn partial_cmp(&self, other: &Self) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Copy for MetaAddr

Source§

impl Eq for MetaAddr

Auto Trait Implementations§

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
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
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Comparable<K> for Q
where Q: Ord + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<T> Conv for T

Source§

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

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

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> FmtForward for T

Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

Source§

impl<T> Instrument for T

Source§

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

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

fn in_current_span(self) -> Instrumented<Self>

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

impl<T> Instrument for T

Source§

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

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

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
Source§

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

Source§

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
Source§

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
Source§

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
Source§

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
Source§

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
Source§

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.
Source§

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.
Source§

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.
Source§

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.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

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

Initializes a with the given initializer. Read more
Source§

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

Dereferences the given pointer. Read more
Source§

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

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

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

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

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

Immutable access to a value. Read more
Source§

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

Mutable access to a value. Read more
Source§

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
Source§

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
Source§

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
Source§

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
Source§

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
Source§

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
Source§

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

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

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

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

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.
Source§

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.
Source§

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.
Source§

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.
Source§

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.
Source§

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.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryConv for T

Source§

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.
Source§

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

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

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