mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-04 10:07:27 -05:00
69 lines
2.4 KiB
C++
69 lines
2.4 KiB
C++
// Copyright (c) 2022 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_NODE_EVICTION_H
|
|
#define BITCOIN_NODE_EVICTION_H
|
|
|
|
#include <node/connection_types.h>
|
|
#include <net_permissions.h>
|
|
|
|
#include <chrono>
|
|
#include <cstdint>
|
|
#include <optional>
|
|
#include <vector>
|
|
|
|
typedef int64_t NodeId;
|
|
|
|
struct NodeEvictionCandidate {
|
|
NodeId id;
|
|
std::chrono::seconds m_connected;
|
|
std::chrono::microseconds m_min_ping_time;
|
|
std::chrono::seconds m_last_block_time;
|
|
std::chrono::seconds m_last_tx_time;
|
|
bool fRelevantServices;
|
|
bool m_relay_txs;
|
|
bool fBloomFilter;
|
|
uint64_t nKeyedNetGroup;
|
|
bool prefer_evict;
|
|
bool m_is_local;
|
|
Network m_network;
|
|
bool m_noban;
|
|
ConnectionType m_conn_type;
|
|
};
|
|
|
|
/**
|
|
* Select an inbound peer to evict after filtering out (protecting) peers having
|
|
* distinct, difficult-to-forge characteristics. The protection logic picks out
|
|
* fixed numbers of desirable peers per various criteria, followed by (mostly)
|
|
* ratios of desirable or disadvantaged peers. If any eviction candidates
|
|
* remain, the selection logic chooses a peer to evict.
|
|
*/
|
|
[[nodiscard]] std::optional<NodeId> SelectNodeToEvict(std::vector<NodeEvictionCandidate>&& vEvictionCandidates);
|
|
|
|
/** Protect desirable or disadvantaged inbound peers from eviction by ratio.
|
|
*
|
|
* This function protects half of the peers which have been connected the
|
|
* longest, to replicate the non-eviction implicit behavior and preclude attacks
|
|
* that start later.
|
|
*
|
|
* Half of these protected spots (1/4 of the total) are reserved for the
|
|
* following categories of peers, sorted by longest uptime, even if they're not
|
|
* longest uptime overall:
|
|
*
|
|
* - onion peers connected via our tor control service
|
|
*
|
|
* - localhost peers, as manually configured hidden services not using
|
|
* `-bind=addr[:port]=onion` will not be detected as inbound onion connections
|
|
*
|
|
* - I2P peers
|
|
*
|
|
* - CJDNS peers
|
|
*
|
|
* This helps protect these privacy network peers, which tend to be otherwise
|
|
* disadvantaged under our eviction criteria for their higher min ping times
|
|
* relative to IPv4/IPv6 peers, and favorise the diversity of peer connections.
|
|
*/
|
|
void ProtectEvictionCandidatesByRatio(std::vector<NodeEvictionCandidate>& vEvictionCandidates);
|
|
|
|
#endif // BITCOIN_NODE_EVICTION_H
|