pub struct AddrMan { /* private fields */ }
Expand description

| Stochastic address manager | | Design goals: | | - Keep the address tables in-memory, and | asynchronously dump the entire table to | peers.dat. | | - Make sure no (localized) attacker can fill | the entire table with his nodes/addresses. | | To that end: | | Addresses are organized into buckets that can | each store up to 64 entries. | | ————————————— | Addresses to which our node has not | successfully connected go into 1024 “new” | buckets. | | - Based on the address range (/16 for | IPv4) of the source of information, or | if an asmap is provided, the AS it | belongs to (for IPv4/IPv6), 64 buckets | are selected at random. | | - The actual bucket is chosen from one of | these, based on the range in which the | address itself is located. | | - The position in the bucket is chosen | based on the full address. | | - One single address can occur in up to | 8 different buckets to increase | selection chances for addresses that are | seen frequently. The chance for | increasing this multiplicity decreases | exponentially. | | - When adding a new address to an occupied | position of a bucket, it will not | replace the existing entry unless that | address is also stored in another bucket | or it doesn’t meet one of several | quality criteria (see IsTerrible for | exact criteria). | | ————————————— | Addresses of nodes that are known to be | accessible go into 256 “tried” buckets. | | - Each address range selects at random | 8 of these buckets. | | - The actual bucket is chosen from one of | these, based on the full address. | | - When adding a new good address to an | occupied position of a bucket, a FEELER | connection to the old address is | attempted. The old entry is only | replaced and moved back to the “new” | buckets if this attempt was | unsuccessful. | | ————————————— | Bucket selection is based on cryptographic | hashing, using a randomly-generated 256-bit | key, which should not be observable by | adversaries. | | ————————————— | Several indexes are kept for high | performance. Setting m_consistency_check_ratio | with the -checkaddrman configuration option will | introduce (expensive) consistency checks for | the entire data structure.

Implementations§

source§

impl AddrMan

source

pub fn new( asmap: Vec<bool>, deterministic: bool, consistency_check_ratio: i32 ) -> Self

source

pub fn serialize<Stream: GetVersion + GetType>(&self, s: &mut Stream)

source

pub fn unserialize<Stream: GetVersion + GetType>(&mut self, s: &mut Stream)

source

pub fn len(&self) -> usize

| Return the number of (unique) addresses | in all tables. |

source

pub fn add( &mut self, addr: &Vec<Address>, source: &NetAddr, n_time_penalty: Option<i64> ) -> bool

| Add addresses to addrman’s new table. |

source

pub fn good(&mut self, addr: &Service, n_time: Option<i64>)

| Mark an entry as accessible, possibly | moving it from “new” to “tried”. |

source

pub fn attempt( &mut self, addr: &Service, count_failure: bool, n_time: Option<i64> )

| Mark an entry as connection attempted | to. |

source

pub fn resolve_collisions(&mut self)

| See if any to-be-evicted tried table | entries have been tested and if so resolve | the collisions. |

source

pub fn select_tried_collision(&mut self) -> (Address, i64)

| Randomly select an address in the tried | table that another address is attempting | to evict. | | ———– | @return | | CAddress The record for the selected | tried peer. int64_t The last time we | attempted to connect to that peer. |

source

pub fn select(&self, new_only: Option<bool>) -> (Address, i64)

| Choose an address to connect to. | | ———– | @param[in] newOnly | | Whether to only select addresses from | the new table. | | ———– | @return | | CAddress The record for the selected | peer. int64_t The last time we attempted | to connect to that peer. |

source

pub fn get_addr( &self, max_addresses: usize, max_pct: usize, network: Option<Network> ) -> Vec<Address>

| Return all or many randomly selected | addresses, optionally by network. | | ———– | @param[in] max_addresses | | Maximum number of addresses to return | (0 = all). | ––––– | @param[in] max_pct | | Maximum percentage of addresses to | return (0 = all). | ––––– | @param[in] network | | Select only addresses of this network | (nullopt = all). | | ———– | @return | | A vector of randomly selected addresses | from vRandom. |

source

pub fn connected(&mut self, addr: &Service, n_time: Option<i64>)

| We have successfully connected to this | peer. Calling this function updates | the CAddress’s nTime, which is used | in our IsTerrible() decisions and gossiped | to peers. Callers should be careful | that updating this information doesn’t | leak topology information to network | spies. net_processing calls this function | when it disconnects from a peer to | not leak information about currently | connected peers. | | ———– | @param[in] addr | | The address of the peer we were connected | to | ––––– | @param[in] nTime | | The time that we were last connected | to this peer |

source

pub fn set_services(&mut self, addr: &Service, n_services: ServiceFlags)

| Update an entry’s service bits. |

source

pub fn get_asmap(&self) -> &Vec<bool>

Auto Trait Implementations§

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

const: unstable · source§

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

Mutably borrows from an owned value. Read more
§

impl<T, U> CastInto<U> for Twhere U: CastFrom<T>,

§

unsafe fn cast_into(self) -> U

Performs the conversion. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

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

const: unstable · 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.

§

impl<T> Pointable for T

§

const ALIGN: usize = mem::align_of::<T>()

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> StaticUpcast<T> for T

§

unsafe fn static_upcast(ptr: Ptr<T>) -> Ptr<T>

Convert type of a const pointer. Read more
source§

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

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
source§

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

§

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

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
§

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

§

fn vzip(self) -> V