mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-12 23:18:14 +01:00
[net] Move eviction logic to its own file
This commit is contained in:
69
src/node/eviction.h
Normal file
69
src/node/eviction.h
Normal file
@@ -0,0 +1,69 @@
|
||||
// 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
|
||||
Reference in New Issue
Block a user