LCOV - code coverage report
Current view: top level - src/instantsend - net_instantsend.h (source / functions) Hit Total Coverage
Test: test_dash_coverage.info Lines: 0 14 0.0 %
Date: 2026-06-25 07:23:51 Functions: 0 6 0.0 %

          Line data    Source code
       1             : // Copyright (c) 2025 The Dash Core developers
       2             : // Distributed under the MIT software license, see the accompanying
       3             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4             : 
       5             : #ifndef BITCOIN_INSTANTSEND_NET_INSTANTSEND_H
       6             : #define BITCOIN_INSTANTSEND_NET_INSTANTSEND_H
       7             : 
       8             : #include <net_processing.h>
       9             : #include <util/threadinterrupt.h>
      10             : #include <validationinterface.h>
      11             : 
      12             : #include <memory>
      13             : #include <optional>
      14             : #include <thread>
      15             : #include <vector>
      16             : 
      17             : class CChainState;
      18             : 
      19             : namespace Consensus {
      20             : struct LLMQParams;
      21             : } // namespace Consensus
      22             : 
      23             : namespace chainlock {
      24             : class Chainlocks;
      25             : } // namespace chainlock
      26             : 
      27             : class CMasternodeSync;
      28             : class CTxMemPool;
      29             : 
      30             : namespace instantsend {
      31             : struct InstantSendLock;
      32             : using InstantSendLockPtr = std::shared_ptr<InstantSendLock>;
      33             : struct PendingISLockEntry;
      34             : class InstantSendSigner;
      35             : } // namespace instantsend
      36             : namespace llmq {
      37             : class CSigningManager;
      38             : class CInstantSendManager;
      39             : class CQuorumManager;
      40             : } // namespace llmq
      41             : 
      42             : class NetInstantSend final : public NetHandler, public CValidationInterface
      43             : {
      44             : public:
      45           0 :     NetInstantSend(PeerManagerInternal* peer_manager, llmq::CInstantSendManager& is_manager,
      46             :                    instantsend::InstantSendSigner* signer, llmq::CSigningManager& sigman, llmq::CQuorumManager& qman,
      47             :                    const chainlock::Chainlocks& chainlocks, CChainState& chainstate, CTxMemPool& mempool,
      48             :                    const CMasternodeSync& mn_sync) :
      49           0 :         NetHandler(peer_manager),
      50           0 :         m_is_manager{is_manager},
      51           0 :         m_signer{signer},
      52           0 :         m_sigman{sigman},
      53           0 :         m_qman(qman),
      54           0 :         m_chainlocks{chainlocks},
      55           0 :         m_chainstate{chainstate},
      56           0 :         m_mempool{mempool},
      57           0 :         m_mn_sync{mn_sync}
      58           0 :     {
      59           0 :         workInterrupt.reset();
      60           0 :     }
      61             :     void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv) override;
      62             : 
      63             :     void Start() override;
      64             :     void Stop() override;
      65           0 :     void Interrupt() override { workInterrupt(); };
      66             : 
      67             :     void WorkThreadMain();
      68             : 
      69             : protected:
      70             :     // -- CValidationInterface
      71             :     void SynchronousUpdatedBlockTip(const CBlockIndex* pindexNew, const CBlockIndex* pindexFork,
      72             :                                     bool fInitialDownload) override;
      73             :     void UpdatedBlockTip(const CBlockIndex* pindexNew, const CBlockIndex* pindexFork, bool fInitialDownload) override;
      74             :     void TransactionAddedToMempool(const CTransactionRef&, int64_t, uint64_t mempool_sequence) override;
      75             :     void TransactionRemovedFromMempool(const CTransactionRef& ptx, MemPoolRemovalReason reason,
      76             :                                        uint64_t mempool_sequence) override;
      77             :     void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex) override;
      78             :     void BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexDisconnected) override;
      79             :     void NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr<const chainlock::ChainLockSig>& clsig) override;
      80             : 
      81             : private:
      82             :     struct BatchVerificationData;
      83             : 
      84             :     bool ValidateIncomingISLock(const instantsend::InstantSendLock& islock, NodeId node_id);
      85             :     std::optional<int> ResolveCycleHeight(const uint256& cycle_hash);
      86             :     bool ValidateDeterministicCycleHeight(int cycle_height, const Consensus::LLMQParams& llmq_params, NodeId node_id);
      87             : 
      88             :     std::unique_ptr<BatchVerificationData> BuildVerificationBatch(
      89             :         const Consensus::LLMQParams& llmq_params, int signOffset,
      90             :         const std::vector<instantsend::PendingISLockEntry>& pend);
      91             :     Uint256HashSet ApplyVerificationResults(
      92             :         const Consensus::LLMQParams& llmq_params, bool ban,
      93             :         BatchVerificationData& data,
      94             :         const std::vector<instantsend::PendingISLockEntry>& pend);
      95             : 
      96             :     void ProcessPendingISLocks(std::vector<instantsend::PendingISLockEntry>&& locks_to_process);
      97             :     void ProcessInstantSendLock(NodeId from, const uint256& hash, const instantsend::InstantSendLockPtr& islock);
      98             :     void RemoveMempoolConflictsForLock(const uint256& hash, const instantsend::InstantSendLock& islock);
      99             : 
     100             :     Uint256HashSet ProcessPendingInstantSendLocks(
     101             :         const Consensus::LLMQParams& llmq_params, int signOffset, bool ban,
     102             :         const std::vector<instantsend::PendingISLockEntry>& pend);
     103             : 
     104             :     void ResolveBlockConflicts(const uint256& islockHash, const instantsend::InstantSendLock& islock);
     105             : 
     106             :     void TruncateRecoveredSigsForInputs(const instantsend::InstantSendLock& islock);
     107             : 
     108             :     void HandleFullyConfirmedBlock(const CBlockIndex* pindex);
     109             :     void ClearConflicting(const Uint256HashMap<CTransactionRef>& to_delete);
     110             : 
     111             :     llmq::CInstantSendManager& m_is_manager;
     112             :     instantsend::InstantSendSigner* m_signer; // non-null only for masternode
     113             :     llmq::CSigningManager& m_sigman;
     114             :     llmq::CQuorumManager& m_qman;
     115             :     const chainlock::Chainlocks& m_chainlocks;
     116             :     CChainState& m_chainstate;
     117             :     CTxMemPool& m_mempool;
     118             :     const CMasternodeSync& m_mn_sync;
     119             : 
     120             :     std::thread workThread;
     121             :     CThreadInterrupt workInterrupt;
     122             : };
     123             : 
     124             : #endif // BITCOIN_INSTANTSEND_NET_INSTANTSEND_H

Generated by: LCOV version 1.16