mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-26 03:03:22 -03:00
a029e18c2b
In order to determine whether to download or process a relayed transaction, we try to determine if we already have the transaction, either in the mempool, in our recently rejected filter, in our orphan pool, or already confirmed in the chain itself. Prior to this commit, the heuristic for checking the chain is based on whether there's an output corresponding to the 0- or 1-index vout in our coin cache. While that is a quick check, it is very imprecise (say if those outputs were already spent in a block) -- we can do better by just keeping a rolling bloom filter of the transactions in recent blocks, which will capture the case of a transaction which has been confirmed and then fully spent already. To avoid relay problems for transactions which have been included in a recent block but then reorged out of the chain, we clear the bloom filter whenever a block is disconnected.
93 lines
3.9 KiB
C++
93 lines
3.9 KiB
C++
// 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>
|
|
#include <consensus/params.h>
|
|
#include <sync.h>
|
|
|
|
extern RecursiveMutex cs_main;
|
|
|
|
/** 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;
|
|
|
|
class PeerLogicValidation final : public CValidationInterface, public NetEventsInterface {
|
|
private:
|
|
CConnman* const connman;
|
|
BanMan* const m_banman;
|
|
|
|
bool CheckIfBanned(CNode* pnode) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
|
|
|
public:
|
|
PeerLogicValidation(CConnman* connman, BanMan* banman, CScheduler& scheduler);
|
|
|
|
/**
|
|
* Overridden from CValidationInterface.
|
|
*/
|
|
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected, const std::vector<CTransactionRef>& vtxConflicted) override;
|
|
void BlockDisconnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex* pindex) override;
|
|
/**
|
|
* Overridden from CValidationInterface.
|
|
*/
|
|
void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override;
|
|
/**
|
|
* Overridden from CValidationInterface.
|
|
*/
|
|
void BlockChecked(const CBlock& block, const BlockValidationState& 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
|
|
*
|
|
* @param[in] pfrom The node which we have received messages from.
|
|
* @param[in] interrupt Interrupt condition for processing threads
|
|
*/
|
|
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.
|
|
* @return True if there is more work to be done
|
|
*/
|
|
bool SendMessages(CNode* pto) override EXCLUSIVE_LOCKS_REQUIRED(pto->cs_sendProcessing);
|
|
|
|
/** 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) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
|
/** 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) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
|
|
|
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);
|
|
|
|
/** Relay transaction to every node */
|
|
void RelayTransaction(const uint256&, const CConnman& connman);
|
|
|
|
#endif // BITCOIN_NET_PROCESSING_H
|