diff --git a/src/Makefile.am b/src/Makefile.am index a0eca537b48d..f01a67d1adde 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -230,14 +230,12 @@ BITCOIN_CORE_H = \ evo/types.h \ external_signer.h \ dsnotificationinterface.h \ - governance/classes.h \ governance/common.h \ - governance/exceptions.h \ governance/governance.h \ governance/net_governance.h \ governance/object.h \ governance/signing.h \ - governance/validators.h \ + governance/superblock.h \ governance/vote.h \ governance/votedb.h \ gsl/assert.h \ @@ -521,13 +519,11 @@ libbitcoin_node_a_SOURCES = \ evo/specialtx_filter.cpp \ evo/specialtxman.cpp \ flatfile.cpp \ - governance/classes.cpp \ - governance/exceptions.cpp \ governance/governance.cpp \ governance/net_governance.cpp \ governance/object.cpp \ governance/signing.cpp \ - governance/validators.cpp \ + governance/superblock.cpp \ governance/vote.cpp \ governance/votedb.cpp \ gsl/assert.cpp \ diff --git a/src/active/context.cpp b/src/active/context.cpp index c89162df6a7e..4479c6653fa8 100644 --- a/src/active/context.cpp +++ b/src/active/context.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -26,7 +27,8 @@ #include ActiveContext::ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman, - CDeterministicMNManager& dmnman, CGovernanceManager& govman, CMasternodeMetaMan& mn_metaman, + CDeterministicMNManager& dmnman, CGovernanceManager& govman, + governance::SuperblockManager& superblocks, CMasternodeMetaMan& mn_metaman, CSporkManager& sporkman, const chainlock::Chainlocks& chainlocks, CTxMemPool& mempool, chainlock::ChainlockHandler& clhandler, llmq::CInstantSendManager& isman, llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumManager& qman, @@ -40,7 +42,7 @@ ActiveContext::ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman dkgdbgman{std::make_unique(dmnman, qsnapman, chainman)}, qdkgsman{std::make_unique(dmnman, qsnapman, chainman, sporkman, db_params, quorums_watch)}, shareman{std::make_unique(connman, chainman, sigman, *nodeman, qman, sporkman)}, - gov_signer{std::make_unique(connman, dmnman, govman, *nodeman, chainman, mn_sync)}, + gov_signer{std::make_unique(connman, dmnman, govman, superblocks, *nodeman, chainman, mn_sync)}, ehf_sighandler{std::make_unique(chainman, sigman, *shareman, qman)}, cl_signer{std::make_unique(chainman.ActiveChainstate(), chainlocks, clhandler, isman, qman, sigman, *shareman, mn_sync)}, diff --git a/src/active/context.h b/src/active/context.h index 44b71abc8af7..af41ec7bfc84 100644 --- a/src/active/context.h +++ b/src/active/context.h @@ -31,6 +31,9 @@ class Chainlocks; class ChainlockHandler; class ChainLockSigner; } // namespace chainlock +namespace governance { +class SuperblockManager; +} // namespace governance namespace instantsend { class InstantSendSigner; } // namespace instantsend @@ -55,7 +58,8 @@ struct ActiveContext final : public llmq::QuorumRole, public CValidationInterfac ActiveContext(const ActiveContext&) = delete; ActiveContext& operator=(const ActiveContext&) = delete; explicit ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman, - CDeterministicMNManager& dmnman, CGovernanceManager& govman, CMasternodeMetaMan& mn_metaman, + CDeterministicMNManager& dmnman, CGovernanceManager& govman, + governance::SuperblockManager& superblocks, CMasternodeMetaMan& mn_metaman, CSporkManager& sporkman, const chainlock::Chainlocks& chainlocks, CTxMemPool& mempool, chainlock::ChainlockHandler& clhandler, llmq::CInstantSendManager& isman, llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumManager& qman, diff --git a/src/evo/chainhelper.cpp b/src/evo/chainhelper.cpp index a82c4a2bad8d..16f4782aa717 100644 --- a/src/evo/chainhelper.cpp +++ b/src/evo/chainhelper.cpp @@ -4,32 +4,49 @@ #include -#include - #include +#include #include #include #include +#include #include #include +#include #include +#include -CChainstateHelper::CChainstateHelper(CEvoDB& evodb, CDeterministicMNManager& dmnman, CGovernanceManager& govman, +CChainstateHelper::CChainstateHelper(CEvoDB& evodb, CDeterministicMNManager& dmnman, const CMasternodeSync& mn_sync, llmq::CInstantSendManager& isman, llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumSnapshotManager& qsnapman, const ChainstateManager& chainman, const Consensus::Params& consensus_params, const chainlock::Chainlocks& chainlocks, const llmq::CQuorumManager& qman) : isman{isman}, + mn_sync{mn_sync}, credit_pool_manager{std::make_unique(evodb, chainman)}, m_chainlocks{chainlocks}, ehf_manager{std::make_unique(evodb, chainman, qman)}, - mn_payments{std::make_unique(dmnman, govman, chainman, consensus_params)}, + superblocks{std::make_unique()}, + mn_payments{std::make_unique(dmnman, *superblocks, chainman, consensus_params)}, special_tx{std::make_unique(*credit_pool_manager, dmnman, *ehf_manager, qblockman, qsnapman, chainman, consensus_params, chainlocks, qman)} {} CChainstateHelper::~CChainstateHelper() = default; +bool CChainstateHelper::IsSuperblockValidationRequired(const CBlockIndex* const pindex) +{ + if (m_chainlocks.GetBestChainLockHeight() >= pindex->nHeight) { + LogPrint(BCLog::MNPAYMENTS, "%s -- validation of chainlocked block=%s is skipped\n", __func__, pindex->GetBlockHash().ToString()); + return false; + } + if (!mn_sync.IsSynced()) { + LogPrint(BCLog::MNPAYMENTS, "%s -- WARNING! Node is not fully synced, checked superblock for block=%s max bounds only\n", __func__, pindex->GetBlockHash().ToString()); + return false; + } + return true; +} + /** Passthrough functions to chainlock::Chainlocks */ bool CChainstateHelper::HasConflictingChainLock(int nHeight, const uint256& blockHash) const { diff --git a/src/evo/chainhelper.h b/src/evo/chainhelper.h index aa27db154774..82b78cefcb8c 100644 --- a/src/evo/chainhelper.h +++ b/src/evo/chainhelper.h @@ -13,8 +13,8 @@ class CBlockIndex; class CCreditPoolManager; class CDeterministicMNManager; class CEvoDB; -class CGovernanceManager; class ChainstateManager; +class CMasternodeSync; class CMNHFManager; class CMNPaymentsProcessor; class CSpecialTxProcessor; @@ -24,6 +24,9 @@ struct CCreditPool; namespace chainlock { class Chainlocks; } // namespace chainlock +namespace governance { +class SuperblockManager; +} // namespace governance namespace Consensus { struct Params; } // namespace Consensus @@ -37,11 +40,13 @@ class CChainstateHelper { private: llmq::CInstantSendManager& isman; + const CMasternodeSync& mn_sync; public: const std::unique_ptr credit_pool_manager; const chainlock::Chainlocks& m_chainlocks; const std::unique_ptr ehf_manager; + const std::unique_ptr superblocks; const std::unique_ptr mn_payments; const std::unique_ptr special_tx; @@ -49,13 +54,15 @@ class CChainstateHelper CChainstateHelper() = delete; CChainstateHelper(const CChainstateHelper&) = delete; CChainstateHelper& operator=(const CChainstateHelper&) = delete; - explicit CChainstateHelper(CEvoDB& evodb, CDeterministicMNManager& dmnman, CGovernanceManager& govman, + explicit CChainstateHelper(CEvoDB& evodb, CDeterministicMNManager& dmnman, const CMasternodeSync& mn_sync, llmq::CInstantSendManager& isman, llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumSnapshotManager& qsnapman, const ChainstateManager& chainman, const Consensus::Params& consensus_params, const chainlock::Chainlocks& chainlocks, const llmq::CQuorumManager& qman); ~CChainstateHelper(); + bool IsSuperblockValidationRequired(const CBlockIndex* const pindex); + /** Passthrough functions to chainlock::Chainlocks */ bool HasConflictingChainLock(int nHeight, const uint256& blockHash) const; bool HasChainLock(int nHeight, const uint256& blockHash) const; diff --git a/src/governance/classes.h b/src/governance/classes.h deleted file mode 100644 index 3994ca37b2b5..000000000000 --- a/src/governance/classes.h +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2014-2025 The Dash Core developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_GOVERNANCE_CLASSES_H -#define BITCOIN_GOVERNANCE_CLASSES_H - -#include -#include -#include