|
|
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
|
|
// Copyright (c) 2009-2020 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_NET_PROCESSING_H
|
|
|
|
#define BITCOIN_NET_PROCESSING_H
|
|
|
|
|
|
|
|
#include <net.h>
|
|
|
|
#include <validationinterface.h>
|
|
|
|
|
|
|
|
class CAddrMan;
|
|
|
|
class CChainParams;
|
|
|
|
class CTxMemPool;
|
|
|
|
class ChainstateManager;
|
|
|
|
|
|
|
|
/** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
|
|
|
|
static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
|
|
|
|
/** Default number of orphan+recently-replaced txn to keep around for block reconstruction */
|
|
|
|
static const unsigned int DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN = 100;
|
|
|
|
static const bool DEFAULT_PEERBLOOMFILTERS = false;
|
|
|
|
static const bool DEFAULT_PEERBLOCKFILTERS = false;
|
|
|
|
/** Threshold for marking a node to be discouraged, e.g. disconnected and added to the discouragement filter. */
|
|
|
|
static const int DISCOURAGEMENT_THRESHOLD{100};
|
|
|
|
|
|
|
|
struct CNodeStateStats {
|
|
|
|
int nSyncHeight = -1;
|
|
|
|
int nCommonHeight = -1;
|
|
|
|
int m_starting_height = -1;
|
|
|
|
std::chrono::microseconds m_ping_wait;
|
|
|
|
std::vector<int> vHeightInFlight;
|
|
|
|
uint64_t m_addr_processed = 0;
|
|
|
|
uint64_t m_addr_rate_limited = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
class PeerManager : public CValidationInterface, public NetEventsInterface
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
static std::unique_ptr<PeerManager> make(const CChainParams& chainparams, CConnman& connman, CAddrMan& addrman,
|
|
|
|
BanMan* banman, CScheduler& scheduler, ChainstateManager& chainman,
|
|
|
|
CTxMemPool& pool, bool ignore_incoming_txs);
|
|
|
|
virtual ~PeerManager() { }
|
Permit disconnection of outbound peers on bad/slow chains
Currently we have no rotation of outbound peers. If an outbound peer
stops serving us blocks, or is on a consensus-incompatible chain with
less work than our tip (but otherwise valid headers), then we will never
disconnect that peer, even though that peer is using one of our 8
outbound connection slots. Because we rely on our outbound peers to
find an honest node in order to reach consensus, allowing an
incompatible peer to occupy one of those slots is undesirable,
particularly if it is possible for all such slots to be occupied by such
peers.
Protect against this by always checking to see if a peer's best known
block has less work than our tip, and if so, set a 20 minute timeout --
if the peer is still not known to have caught up to a chain with as much
work as ours after 20 minutes, then send a single getheaders message,
wait 2 more minutes, and if a better header hasn't been received by then,
disconnect that peer.
Note:
- we do not require that our peer sync to the same tip as ours, just an
equal or greater work tip. (Doing otherwise would risk partitioning the
network in the event of a chain split, and is also unnecessary.)
- we pick 4 of our outbound peers and do not subject them to this logic,
to be more conservative. We don't wish to permit temporary network
issues (or an attacker) to excessively disrupt network topology.
7 years ago
|
|
|
|
|
|
|
/** Get statistics from node state */
|
|
|
|
virtual bool GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) const = 0;
|
|
|
|
|
|
|
|
/** Whether this node ignores txs received over p2p. */
|
|
|
|
virtual bool IgnoresIncomingTxs() = 0;
|
|
|
|
|
|
|
|
/** Relay transaction to all peers. */
|
|
|
|
virtual void RelayTransaction(const uint256& txid, const uint256& wtxid) = 0;
|
|
|
|
|
|
|
|
/** Send ping message to all peers */
|
|
|
|
virtual void SendPings() = 0;
|
|
|
|
|
|
|
|
/** Set the best height */
|
|
|
|
virtual void SetBestHeight(int height) = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Increment peer's misbehavior score. If the new value >= DISCOURAGEMENT_THRESHOLD, mark the node
|
|
|
|
* to be discouraged, meaning the peer might be disconnected and added to the discouragement filter.
|
|
|
|
* Public for unit testing.
|
|
|
|
*/
|
|
|
|
virtual void Misbehaving(const NodeId pnode, const int howmuch, const std::string& message) = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Evict extra outbound peers. If we think our tip may be stale, connect to an extra outbound.
|
|
|
|
* Public for unit testing.
|
|
|
|
*/
|
|
|
|
virtual void CheckForStaleTipAndEvictPeers() = 0;
|
|
|
|
|
|
|
|
/** Process a single message from a peer. Public for fuzz testing */
|
|
|
|
virtual void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv,
|
|
|
|
const std::chrono::microseconds time_received, const std::atomic<bool>& interruptMsgProc) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // BITCOIN_NET_PROCESSING_H
|