fe16dd8226
This commit adds a boolean option `-enablebip61`, defaulting to `1`, that can be used to disable the sending of BIP61 `reject` messages. This functionality has been requested for various reasons: - security (DoS): reject messages can reveal internal state that can be used to target certain resources such as the mempool more easily. - bandwidth: a typical node sends lots of reject messages; this counts against upstream bandwidth. Also the reject messages tend to be larger than the message that was rejected. On the other hand, reject messages can be useful while developing client software (I found them indispensable while creating bitcoin-submittx), as well as for our own test cases, so whatever the default becomes on the long run, IMO the functionality should be retained as option. But that's a discussion for later.
105 lines
4.9 KiB
C++
105 lines
4.9 KiB
C++
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2017 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>
|
|
#include <consensus/params.h>
|
|
|
|
/** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
|
|
static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
|
|
/** Expiration time for orphan transactions in seconds */
|
|
static const int64_t ORPHAN_TX_EXPIRE_TIME = 20 * 60;
|
|
/** Minimum time between orphan transactions expire time checks in seconds */
|
|
static const int64_t ORPHAN_TX_EXPIRE_INTERVAL = 5 * 60;
|
|
/** Default number of orphan+recently-replaced txn to keep around for block reconstruction */
|
|
static const unsigned int DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN = 100;
|
|
/** Headers download timeout expressed in microseconds
|
|
* Timeout = base + per_header * (expected number of headers) */
|
|
static constexpr int64_t HEADERS_DOWNLOAD_TIMEOUT_BASE = 15 * 60 * 1000000; // 15 minutes
|
|
static constexpr int64_t HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER = 1000; // 1ms/header
|
|
/** Protect at least this many outbound peers from disconnection due to slow/
|
|
* behind headers chain.
|
|
*/
|
|
static constexpr int32_t MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT = 4;
|
|
/** Timeout for (unprotected) outbound peers to sync to our chainwork, in seconds */
|
|
static constexpr int64_t CHAIN_SYNC_TIMEOUT = 20 * 60; // 20 minutes
|
|
/** How frequently to check for stale tips, in seconds */
|
|
static constexpr int64_t STALE_CHECK_INTERVAL = 10 * 60; // 10 minutes
|
|
/** How frequently to check for extra outbound peers and disconnect, in seconds */
|
|
static constexpr int64_t EXTRA_PEER_CHECK_INTERVAL = 45;
|
|
/** Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict, in seconds */
|
|
static constexpr int64_t MINIMUM_CONNECT_TIME = 30;
|
|
|
|
/** Default for BIP61 (sending reject messages) */
|
|
static constexpr bool DEFAULT_ENABLE_BIP61 = true;
|
|
/** Enable BIP61 (sending reject messages) */
|
|
extern bool g_enable_bip61;
|
|
|
|
class PeerLogicValidation final : public CValidationInterface, public NetEventsInterface {
|
|
private:
|
|
CConnman* const connman;
|
|
|
|
public:
|
|
explicit PeerLogicValidation(CConnman* connman, CScheduler &scheduler);
|
|
|
|
/**
|
|
* Overridden from CValidationInterface.
|
|
*/
|
|
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected, const std::vector<CTransactionRef>& vtxConflicted) override;
|
|
/**
|
|
* Overridden from CValidationInterface.
|
|
*/
|
|
void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override;
|
|
/**
|
|
* Overridden from CValidationInterface.
|
|
*/
|
|
void BlockChecked(const CBlock& block, const CValidationState& state) override;
|
|
/**
|
|
* Overridden from CValidationInterface.
|
|
*/
|
|
void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock) override;
|
|
|
|
/** Initialize a peer by adding it to mapNodeState and pushing a message requesting its version */
|
|
void InitializeNode(CNode* pnode) override;
|
|
/** Handle removal of a peer by updating various state and removing it from mapNodeState */
|
|
void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) override;
|
|
/** Process protocol messages received from a given node */
|
|
bool ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt) override;
|
|
/**
|
|
* Send queued protocol messages to be sent to a give node.
|
|
*
|
|
* @param[in] pto The node which we are sending messages to.
|
|
* @param[in] interrupt Interrupt condition for processing threads
|
|
* @return True if there is more work to be done
|
|
*/
|
|
bool SendMessages(CNode* pto, std::atomic<bool>& interrupt) override;
|
|
|
|
/** Consider evicting an outbound peer based on the amount of time they've been behind our tip */
|
|
void ConsiderEviction(CNode *pto, int64_t time_in_seconds);
|
|
/** Evict extra outbound peers. If we think our tip may be stale, connect to an extra outbound */
|
|
void CheckForStaleTipAndEvictPeers(const Consensus::Params &consensusParams);
|
|
/** If we have extra outbound peers, try to disconnect the one with the oldest block announcement */
|
|
void EvictExtraOutboundPeers(int64_t time_in_seconds);
|
|
|
|
private:
|
|
int64_t m_stale_tip_check_time; //! Next time to check for stale tip
|
|
};
|
|
|
|
struct CNodeStateStats {
|
|
int nMisbehavior = 0;
|
|
int nSyncHeight = -1;
|
|
int nCommonHeight = -1;
|
|
std::vector<int> vHeightInFlight;
|
|
};
|
|
|
|
/** Get statistics from node state */
|
|
bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats);
|
|
/** Increase a node's misbehavior score. */
|
|
void Misbehaving(NodeId nodeid, int howmuch, const std::string& message="");
|
|
|
|
#endif // BITCOIN_NET_PROCESSING_H
|