Skip to content

Commit 38f02de

Browse files
Merge #7330: refactor: separate governance from consensus code
58ab8b3 fix: register NetGovernance unconditionally and tie SuperblockManager lifetime to govman (UdjinM6) 28f339e refactor: move validators to governance/object.h; remove lonely empty header and cpp (Konstantin Akimov) 8d4989f refactor: replace class CProposalValidator with a simple function (Konstantin Akimov) 7b08205 refactor: drop friend CGovernanceObject from CGovernanceManager (Konstantin Akimov) 853c81d refactor: pass reference to CDeterministicMNManager instead of reference to unique_ptr (Konstantin Akimov) abced0f refactor: simplify after governance refactoring: drop unused forward declarations & includes, move more network code to NetGovernance (Konstantin Akimov) c08fcae refactor: merge governance/exceptions into governance/object where it is used (Konstantin Akimov) 2366761 refactor: move code from governance/classes to governance/superblock where it belongs (Konstantin Akimov) 8579a1a refactor: cleanup governance/governance includes and forward declarations (Konstantin Akimov) b7baf0b fmt: clang-apply (Konstantin Akimov) 9237c62 refactor: break circular dependency between governance/object <-> governance/governance (Konstantin Akimov) 95d5dcc refactor: extract SuperblockManager from CGovernanceManager (Konstantin Akimov) 57ba90f refactor: drop useless GovernanceSignerParent (Konstantin Akimov) Pull request description: ## Issue being fixed or feature implemented The `dash-chainstate` (see #7234) requires as dependency full governance implementation, even if it is not functional or relevant to dash-chainstate (the governance uses off-chain objects and they can't be retrieved without p2p communication). It brings extra files to compilation unit of kernel / dash-chainstate: governance/classes.cpp \ governance/common.cpp \ governance/exceptions.cpp \ governance/governance.cpp \ governance/object.cpp \ governance/validators.cpp \ governance/vote.cpp \ governance/votedb.cpp \ Also, Governance blocks backporting https://github.com/bitcoin/bitcoin/pull/25064/files because it uses timedata.cpp Also, Governance requires extra dependency of node/txindex (and recursively index/base which is out-of-scope for kernel) ## What was done? The only usage of governance in coinsensus code is a validation of superblocks (CMNPaymentsProcessor); superblock validator has been extracted from CGovernanceManager to own file and class `governance::SuperblockManager`. It can be simply replaced to stub NullSuperblockmanager, same as `class NullNodeSyncNotifier final : public NodeSyncNotifier` for kernel project. There are also several relevant refactorings: - governance/exception files are removed; `CGovernanceException` moved to `governance/object.h` where it's used - governance/validators files are removed; the class `CProposalValidator` is replaced by a simple helper `governance::ValidateProposal` and moved to `governance/object.h' - the dependency CGovermentManager -> GovernanceSigner is reverted; `CGovermentManager` should not know anything about signer if it's not a masternode. Abstract interface `GovernanceSignerParent` is removed. ## How Has This Been Tested? 2 circular dependencies disappeared: - "governance/classes -> governance/object -> governance/governance -> governance/classes", - "governance/governance -> governance/signing -> governance/object -> governance/governance", Unit & functional tests succeed. Mock proposal is created on testnet with Dash-Qt. ## Breaking Changes N/A ## Checklist: - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: UdjinM6: utACK 58ab8b3 Tree-SHA512: 1090981c656d4ba98e8676bf38a8e22d837b7830837406f58532208021d212662028899348e474436a06262be4548bb48e6433ec10f2a6e105e41434fdeae406
2 parents baac304 + 58ab8b3 commit 38f02de

45 files changed

Lines changed: 1167 additions & 1260 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/Makefile.am

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,12 @@ BITCOIN_CORE_H = \
234234
evo/types.h \
235235
external_signer.h \
236236
dsnotificationinterface.h \
237-
governance/classes.h \
238237
governance/common.h \
239-
governance/exceptions.h \
240238
governance/governance.h \
241239
governance/net_governance.h \
242240
governance/object.h \
243241
governance/signing.h \
244-
governance/validators.h \
242+
governance/superblock.h \
245243
governance/vote.h \
246244
governance/votedb.h \
247245
gsl/assert.h \
@@ -525,13 +523,11 @@ libbitcoin_node_a_SOURCES = \
525523
evo/specialtx_filter.cpp \
526524
evo/specialtxman.cpp \
527525
flatfile.cpp \
528-
governance/classes.cpp \
529-
governance/exceptions.cpp \
530526
governance/governance.cpp \
531527
governance/net_governance.cpp \
532528
governance/object.cpp \
533529
governance/signing.cpp \
534-
governance/validators.cpp \
530+
governance/superblock.cpp \
535531
governance/vote.cpp \
536532
governance/votedb.cpp \
537533
gsl/assert.cpp \

src/active/context.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <evo/deterministicmns.h>
1313
#include <governance/governance.h>
1414
#include <governance/signing.h>
15+
#include <governance/superblock.h>
1516
#include <instantsend/instantsend.h>
1617
#include <instantsend/signing.h>
1718
#include <llmq/debug.h>
@@ -26,7 +27,8 @@
2627
#include <validationinterface.h>
2728

2829
ActiveContext::ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman,
29-
CDeterministicMNManager& dmnman, CGovernanceManager& govman, CMasternodeMetaMan& mn_metaman,
30+
CDeterministicMNManager& dmnman, CGovernanceManager& govman,
31+
governance::SuperblockManager& superblocks, CMasternodeMetaMan& mn_metaman,
3032
CSporkManager& sporkman, const chainlock::Chainlocks& chainlocks, CTxMemPool& mempool,
3133
chainlock::ChainlockHandler& clhandler, llmq::CInstantSendManager& isman,
3234
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumManager& qman,
@@ -40,7 +42,7 @@ ActiveContext::ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman
4042
dkgdbgman{std::make_unique<llmq::CDKGDebugManager>(dmnman, qsnapman, chainman)},
4143
qdkgsman{std::make_unique<llmq::CDKGSessionManager>(dmnman, qsnapman, chainman, sporkman, db_params, quorums_watch)},
4244
shareman{std::make_unique<llmq::CSigSharesManager>(connman, chainman, sigman, *nodeman, qman, sporkman)},
43-
gov_signer{std::make_unique<GovernanceSigner>(connman, dmnman, govman, *nodeman, chainman, mn_sync)},
45+
gov_signer{std::make_unique<GovernanceSigner>(connman, dmnman, govman, superblocks, *nodeman, chainman, mn_sync)},
4446
ehf_sighandler{std::make_unique<llmq::CEHFSignalsHandler>(chainman, sigman, *shareman, qman)},
4547
cl_signer{std::make_unique<chainlock::ChainLockSigner>(chainman.ActiveChainstate(), chainlocks, clhandler, isman,
4648
qman, sigman, *shareman, mn_sync)},

src/active/context.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class Chainlocks;
3131
class ChainlockHandler;
3232
class ChainLockSigner;
3333
} // namespace chainlock
34+
namespace governance {
35+
class SuperblockManager;
36+
} // namespace governance
3437
namespace instantsend {
3538
class InstantSendSigner;
3639
} // namespace instantsend
@@ -55,7 +58,8 @@ struct ActiveContext final : public llmq::QuorumRole, public CValidationInterfac
5558
ActiveContext(const ActiveContext&) = delete;
5659
ActiveContext& operator=(const ActiveContext&) = delete;
5760
explicit ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman,
58-
CDeterministicMNManager& dmnman, CGovernanceManager& govman, CMasternodeMetaMan& mn_metaman,
61+
CDeterministicMNManager& dmnman, CGovernanceManager& govman,
62+
governance::SuperblockManager& superblocks, CMasternodeMetaMan& mn_metaman,
5963
CSporkManager& sporkman, const chainlock::Chainlocks& chainlocks, CTxMemPool& mempool,
6064
chainlock::ChainlockHandler& clhandler, llmq::CInstantSendManager& isman,
6165
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumManager& qman,

src/evo/chainhelper.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,49 @@
44

55
#include <evo/chainhelper.h>
66

7-
#include <chainparams.h>
8-
97
#include <chainlock/chainlock.h>
8+
#include <chainparams.h>
109
#include <evo/creditpool.h>
1110
#include <evo/mnhftx.h>
1211
#include <evo/specialtxman.h>
12+
#include <governance/superblock.h>
1313
#include <instantsend/instantsend.h>
1414
#include <instantsend/lock.h>
15+
#include <logging.h>
1516
#include <masternode/payments.h>
17+
#include <masternode/sync.h>
1618

17-
CChainstateHelper::CChainstateHelper(CEvoDB& evodb, CDeterministicMNManager& dmnman, CGovernanceManager& govman,
19+
CChainstateHelper::CChainstateHelper(CEvoDB& evodb, CDeterministicMNManager& dmnman, const CMasternodeSync& mn_sync,
1820
llmq::CInstantSendManager& isman, llmq::CQuorumBlockProcessor& qblockman,
1921
llmq::CQuorumSnapshotManager& qsnapman, const ChainstateManager& chainman,
2022
const Consensus::Params& consensus_params, const chainlock::Chainlocks& chainlocks,
2123
const llmq::CQuorumManager& qman) :
2224
isman{isman},
25+
mn_sync{mn_sync},
2326
credit_pool_manager{std::make_unique<CCreditPoolManager>(evodb, chainman)},
2427
m_chainlocks{chainlocks},
2528
ehf_manager{std::make_unique<CMNHFManager>(evodb, chainman, qman)},
26-
mn_payments{std::make_unique<CMNPaymentsProcessor>(dmnman, govman, chainman, consensus_params)},
29+
superblocks{std::make_unique<governance::SuperblockManager>()},
30+
mn_payments{std::make_unique<CMNPaymentsProcessor>(dmnman, *superblocks, chainman, consensus_params)},
2731
special_tx{std::make_unique<CSpecialTxProcessor>(*credit_pool_manager, dmnman, *ehf_manager, qblockman, qsnapman,
2832
chainman, consensus_params, chainlocks, qman)}
2933
{}
3034

3135
CChainstateHelper::~CChainstateHelper() = default;
3236

37+
bool CChainstateHelper::IsSuperblockValidationRequired(const CBlockIndex* const pindex)
38+
{
39+
if (m_chainlocks.GetBestChainLockHeight() >= pindex->nHeight) {
40+
LogPrint(BCLog::MNPAYMENTS, "%s -- validation of chainlocked block=%s is skipped\n", __func__, pindex->GetBlockHash().ToString());
41+
return false;
42+
}
43+
if (!mn_sync.IsSynced()) {
44+
LogPrint(BCLog::MNPAYMENTS, "%s -- WARNING! Node is not fully synced, checked superblock for block=%s max bounds only\n", __func__, pindex->GetBlockHash().ToString());
45+
return false;
46+
}
47+
return true;
48+
}
49+
3350
/** Passthrough functions to chainlock::Chainlocks */
3451
bool CChainstateHelper::HasConflictingChainLock(int nHeight, const uint256& blockHash) const
3552
{

src/evo/chainhelper.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ class CBlockIndex;
1313
class CCreditPoolManager;
1414
class CDeterministicMNManager;
1515
class CEvoDB;
16-
class CGovernanceManager;
1716
class ChainstateManager;
17+
class CMasternodeSync;
1818
class CMNHFManager;
1919
class CMNPaymentsProcessor;
2020
class CSpecialTxProcessor;
@@ -24,6 +24,9 @@ struct CCreditPool;
2424
namespace chainlock {
2525
class Chainlocks;
2626
} // namespace chainlock
27+
namespace governance {
28+
class SuperblockManager;
29+
} // namespace governance
2730
namespace Consensus {
2831
struct Params;
2932
} // namespace Consensus
@@ -37,25 +40,29 @@ class CChainstateHelper
3740
{
3841
private:
3942
llmq::CInstantSendManager& isman;
43+
const CMasternodeSync& mn_sync;
4044

4145
public:
4246
const std::unique_ptr<CCreditPoolManager> credit_pool_manager;
4347
const chainlock::Chainlocks& m_chainlocks;
4448
const std::unique_ptr<CMNHFManager> ehf_manager;
49+
const std::unique_ptr<governance::SuperblockManager> superblocks;
4550
const std::unique_ptr<CMNPaymentsProcessor> mn_payments;
4651
const std::unique_ptr<CSpecialTxProcessor> special_tx;
4752

4853
public:
4954
CChainstateHelper() = delete;
5055
CChainstateHelper(const CChainstateHelper&) = delete;
5156
CChainstateHelper& operator=(const CChainstateHelper&) = delete;
52-
explicit CChainstateHelper(CEvoDB& evodb, CDeterministicMNManager& dmnman, CGovernanceManager& govman,
57+
explicit CChainstateHelper(CEvoDB& evodb, CDeterministicMNManager& dmnman, const CMasternodeSync& mn_sync,
5358
llmq::CInstantSendManager& isman, llmq::CQuorumBlockProcessor& qblockman,
5459
llmq::CQuorumSnapshotManager& qsnapman, const ChainstateManager& chainman,
5560
const Consensus::Params& consensus_params, const chainlock::Chainlocks& chainlocks,
5661
const llmq::CQuorumManager& qman);
5762
~CChainstateHelper();
5863

64+
bool IsSuperblockValidationRequired(const CBlockIndex* const pindex);
65+
5966
/** Passthrough functions to chainlock::Chainlocks */
6067
bool HasConflictingChainLock(int nHeight, const uint256& blockHash) const;
6168
bool HasChainLock(int nHeight, const uint256& blockHash) const;

src/governance/classes.h

Lines changed: 0 additions & 117 deletions
This file was deleted.

src/governance/core_write.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
// Distributed under the MIT software license, see the accompanying
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

5+
#include <core_io.h>
56
#include <governance/common.h>
67
#include <governance/governance.h>
7-
8-
#include <core_io.h>
8+
#include <governance/object.h>
99
#include <rpc/util.h>
10+
#include <tinyformat.h>
1011
#include <util/check.h>
1112

1213
#include <univalue.h>

src/governance/exceptions.cpp

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)