text: // Copyright (c) 2009-2010 Satoshi Nakamoto
  // Copyright (c) 2009-2015 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"
  
  /** 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
  
  /** Register with a network node to receive its signals */
  void RegisterNodeSignals(CNodeSignals& nodeSignals);
  /** Unregister a network node */
  void UnregisterNodeSignals(CNodeSignals& nodeSignals);
  
  class PeerLogicValidation : public CValidationInterface {
  private:
      CConnman* connman;
  
  public:
      PeerLogicValidation(CConnman* connmanIn);
  
      virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload);
      virtual void BlockChecked(const CBlock& block, const CValidationState& state);
  };
  
  struct CNodeStateStats {
      int nMisbehavior;//阻止某个连接的计数器，当阻止计数达到阈值，这个连接认为是攻击或无效节点
      int nSyncHeight;
      int nCommonHeight;
      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);
  
  /** Process protocol messages received from a given node */
  bool ProcessMessages(CNode* pfrom, CConnman& connman, std::atomic<bool>& interrupt);
  /**
   * Send queued protocol messages to be sent to a give node.
   *
   * @param[in]   pto             The node which we are sending messages to.
   * @param[in]   connman         The connection manager for that node.
   * @param[in]   interrupt       Interrupt condition for processing threads
   * @return                      True if there is more work to be done
   */
  bool SendMessages(CNode* pto, CConnman& connman, std::atomic<bool>& interrupt);
  
  #endif // BITCOIN_NET_PROCESSING_H
  