Skip to content

Commit 7125330

Browse files
committed
refactor: pass llmq::CQuorumSnapshotManager by argument
1 parent dda0cc6 commit 7125330

33 files changed

+249
-153
lines changed

src/evo/cbtx.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ bool CheckCbTx(const CTransaction& tx, const CBlockIndex* pindexPrev, TxValidati
6262

6363
// This can only be done after the block has been fully processed, as otherwise we won't have the finished MN list
6464
bool CheckCbTxMerkleRoots(const CBlock& block, const CBlockIndex* pindex, CDeterministicMNManager& dmnman,
65-
const llmq::CQuorumBlockProcessor& quorum_block_processor, BlockValidationState& state,
66-
const CCoinsViewCache& view)
65+
llmq::CQuorumSnapshotManager& qsnapman, const llmq::CQuorumBlockProcessor& quorum_block_processor,
66+
BlockValidationState& state, const CCoinsViewCache& view)
6767
{
6868
if (block.vtx[0]->nType != TRANSACTION_COINBASE) {
6969
return true;
@@ -87,7 +87,7 @@ bool CheckCbTxMerkleRoots(const CBlock& block, const CBlockIndex* pindex, CDeter
8787
static int64_t nTimeMerkleQuorum = 0;
8888

8989
uint256 calculatedMerkleRoot;
90-
if (!CalcCbTxMerkleRootMNList(block, pindex->pprev, calculatedMerkleRoot, dmnman, state, view)) {
90+
if (!CalcCbTxMerkleRootMNList(block, pindex->pprev, calculatedMerkleRoot, state, dmnman, qsnapman, view)) {
9191
// pass the state returned by the function above
9292
return false;
9393
}
@@ -117,7 +117,8 @@ bool CheckCbTxMerkleRoots(const CBlock& block, const CBlockIndex* pindex, CDeter
117117
}
118118

119119
bool CalcCbTxMerkleRootMNList(const CBlock& block, const CBlockIndex* pindexPrev, uint256& merkleRootRet,
120-
CDeterministicMNManager& dmnman, BlockValidationState& state, const CCoinsViewCache& view)
120+
BlockValidationState& state, CDeterministicMNManager& dmnman,
121+
llmq::CQuorumSnapshotManager& qsnapman, const CCoinsViewCache& view)
121122
{
122123
try {
123124
static std::atomic<int64_t> nTimeDMN = 0;
@@ -127,7 +128,7 @@ bool CalcCbTxMerkleRootMNList(const CBlock& block, const CBlockIndex* pindexPrev
127128
int64_t nTime1 = GetTimeMicros();
128129

129130
CDeterministicMNList tmpMNList;
130-
if (!dmnman.BuildNewListFromBlock(block, pindexPrev, state, view, tmpMNList, false)) {
131+
if (!dmnman.BuildNewListFromBlock(block, pindexPrev, state, view, tmpMNList, qsnapman, false)) {
131132
// pass the state returned by the function above
132133
return false;
133134
}

src/evo/cbtx.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ class CDeterministicMNManager;
1919
class TxValidationState;
2020

2121
namespace llmq {
22-
class CQuorumBlockProcessor;
2322
class CChainLocksHandler;
23+
class CQuorumBlockProcessor;
24+
class CQuorumSnapshotManager;
2425
}// namespace llmq
2526

2627
// Forward declaration from core_io to get rid of circular dependency
@@ -87,10 +88,11 @@ template<> struct is_serializable_enum<CCbTx::Version> : std::true_type {};
8788
bool CheckCbTx(const CTransaction& tx, const CBlockIndex* pindexPrev, TxValidationState& state);
8889

8990
bool CheckCbTxMerkleRoots(const CBlock& block, const CBlockIndex* pindex, CDeterministicMNManager& dmnman,
90-
const llmq::CQuorumBlockProcessor& quorum_block_processor, BlockValidationState& state,
91-
const CCoinsViewCache& view);
91+
llmq::CQuorumSnapshotManager& qsnapman, const llmq::CQuorumBlockProcessor& quorum_block_processor,
92+
BlockValidationState& state, const CCoinsViewCache& view);
9293
bool CalcCbTxMerkleRootMNList(const CBlock& block, const CBlockIndex* pindexPrev, uint256& merkleRootRet,
93-
CDeterministicMNManager& dmnman, BlockValidationState& state, const CCoinsViewCache& view);
94+
BlockValidationState& state, CDeterministicMNManager& dmnman,
95+
llmq::CQuorumSnapshotManager& qsnapman, const CCoinsViewCache& view);
9496
bool CalcCbTxMerkleRootQuorums(const CBlock& block, const CBlockIndex* pindexPrev,
9597
const llmq::CQuorumBlockProcessor& quorum_block_processor, uint256& merkleRootRet,
9698
BlockValidationState& state);

src/evo/chainhelper.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@
1111
#include <masternode/payments.h>
1212

1313
CChainstateHelper::CChainstateHelper(CCreditPoolManager& cpoolman, CDeterministicMNManager& dmnman,
14-
CMNHFManager& mnhfman, CGovernanceManager& govman,
15-
llmq::CInstantSendManager& isman, llmq::CQuorumBlockProcessor& qblockman,
14+
CMNHFManager& mnhfman, CGovernanceManager& govman, llmq::CInstantSendManager& isman,
15+
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumSnapshotManager& qsnapman,
1616
const ChainstateManager& chainman, const Consensus::Params& consensus_params,
1717
const CMasternodeSync& mn_sync, const CSporkManager& sporkman,
1818
const llmq::CChainLocksHandler& clhandler, const llmq::CQuorumManager& qman) :
1919
isman{isman},
2020
clhandler{clhandler},
2121
mn_payments{std::make_unique<CMNPaymentsProcessor>(dmnman, govman, chainman, consensus_params, mn_sync, sporkman)},
22-
special_tx{std::make_unique<CSpecialTxProcessor>(cpoolman, dmnman, mnhfman, qblockman, chainman, consensus_params,
23-
clhandler, qman)}
22+
special_tx{std::make_unique<CSpecialTxProcessor>(cpoolman, dmnman, mnhfman, qblockman, qsnapman, chainman,
23+
consensus_params, clhandler, qman)}
2424
{}
2525

2626
CChainstateHelper::~CChainstateHelper() = default;

src/evo/chainhelper.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class CChainLocksHandler;
2626
class CInstantSendManager;
2727
class CQuorumBlockProcessor;
2828
class CQuorumManager;
29+
class CQuorumSnapshotManager;
2930
}
3031

3132
class CChainstateHelper
@@ -37,10 +38,10 @@ class CChainstateHelper
3738
public:
3839
explicit CChainstateHelper(CCreditPoolManager& cpoolman, CDeterministicMNManager& dmnman, CMNHFManager& mnhfman,
3940
CGovernanceManager& govman, llmq::CInstantSendManager& isman,
40-
llmq::CQuorumBlockProcessor& qblockman, const ChainstateManager& chainman,
41-
const Consensus::Params& consensus_params, const CMasternodeSync& mn_sync,
42-
const CSporkManager& sporkman, const llmq::CChainLocksHandler& clhandler,
43-
const llmq::CQuorumManager& qman);
41+
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumSnapshotManager& qsnapman,
42+
const ChainstateManager& chainman, const Consensus::Params& consensus_params,
43+
const CMasternodeSync& mn_sync, const CSporkManager& sporkman,
44+
const llmq::CChainLocksHandler& clhandler, const llmq::CQuorumManager& qman);
4445
~CChainstateHelper();
4546

4647
CChainstateHelper() = delete;

src/evo/deterministicmns.cpp

+15-6
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,10 @@ void CDeterministicMNList::RemoveMN(const uint256& proTxHash)
595595
mnInternalIdMap = mnInternalIdMap.erase(dmn->GetInternalId());
596596
}
597597

598-
bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state, const CCoinsViewCache& view, bool fJustCheck, std::optional<MNListUpdates>& updatesRet)
598+
bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex,
599+
BlockValidationState& state, const CCoinsViewCache& view,
600+
llmq::CQuorumSnapshotManager& qsnapman, bool fJustCheck,
601+
std::optional<MNListUpdates>& updatesRet)
599602
{
600603
AssertLockHeld(cs_main);
601604

@@ -610,7 +613,7 @@ bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<co
610613
int nHeight = pindex->nHeight;
611614

612615
try {
613-
if (!BuildNewListFromBlock(block, pindex->pprev, state, view, newList, true)) {
616+
if (!BuildNewListFromBlock(block, pindex->pprev, state, view, newList, qsnapman, true)) {
614617
// pass the state returned by the function above
615618
return false;
616619
}
@@ -700,7 +703,10 @@ void CDeterministicMNManager::UpdatedBlockTip(gsl::not_null<const CBlockIndex*>
700703
tipIndex = pindex;
701704
}
702705

703-
bool CDeterministicMNManager::BuildNewListFromBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindexPrev, BlockValidationState& state, const CCoinsViewCache& view, CDeterministicMNList& mnListRet, bool debugLogs)
706+
bool CDeterministicMNManager::BuildNewListFromBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindexPrev,
707+
BlockValidationState& state, const CCoinsViewCache& view,
708+
CDeterministicMNList& mnListRet,
709+
llmq::CQuorumSnapshotManager& qsnapman, bool debugLogs)
704710
{
705711
int nHeight = pindexPrev->nHeight + 1;
706712

@@ -923,7 +929,7 @@ bool CDeterministicMNManager::BuildNewListFromBlock(const CBlock& block, gsl::no
923929
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-qc-quorum-hash");
924930
}
925931

926-
HandleQuorumCommitment(opt_qc->commitment, pQuorumBaseBlockIndex, newList, debugLogs);
932+
HandleQuorumCommitment(opt_qc->commitment, pQuorumBaseBlockIndex, newList, qsnapman, debugLogs);
927933
}
928934
}
929935
}
@@ -995,11 +1001,14 @@ bool CDeterministicMNManager::BuildNewListFromBlock(const CBlock& block, gsl::no
9951001
return true;
9961002
}
9971003

998-
void CDeterministicMNManager::HandleQuorumCommitment(const llmq::CFinalCommitment& qc, gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex, CDeterministicMNList& mnList, bool debugLogs)
1004+
void CDeterministicMNManager::HandleQuorumCommitment(const llmq::CFinalCommitment& qc,
1005+
gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex,
1006+
CDeterministicMNList& mnList,
1007+
llmq::CQuorumSnapshotManager& qsnapman, bool debugLogs)
9991008
{
10001009
// The commitment has already been validated at this point, so it's safe to use members of it
10011010

1002-
auto members = llmq::utils::GetAllQuorumMembers(qc.llmqType, *this, pQuorumBaseBlockIndex);
1011+
auto members = llmq::utils::GetAllQuorumMembers(qc.llmqType, *this, qsnapman, pQuorumBaseBlockIndex);
10031012

10041013
for (size_t i = 0; i < members.size(); i++) {
10051014
if (!mnList.HasMN(members[i]->proTxHash)) {

src/evo/deterministicmns.h

+10-7
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ class TxValidationState;
3535

3636
extern RecursiveMutex cs_main;
3737

38-
namespace llmq
39-
{
40-
class CFinalCommitment;
38+
namespace llmq {
39+
class CFinalCommitment;
40+
class CQuorumSnapshotManager;
4141
} // namespace llmq
4242

4343
class CDeterministicMN
@@ -598,15 +598,18 @@ class CDeterministicMNManager
598598
~CDeterministicMNManager() = default;
599599

600600
bool ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state,
601-
const CCoinsViewCache& view, bool fJustCheck, std::optional<MNListUpdates>& updatesRet) EXCLUSIVE_LOCKS_REQUIRED(!cs, cs_main);
601+
const CCoinsViewCache& view, llmq::CQuorumSnapshotManager& qsnapman, bool fJustCheck,
602+
std::optional<MNListUpdates>& updatesRet) EXCLUSIVE_LOCKS_REQUIRED(!cs, cs_main);
602603
bool UndoBlock(gsl::not_null<const CBlockIndex*> pindex, std::optional<MNListUpdates>& updatesRet) EXCLUSIVE_LOCKS_REQUIRED(!cs);
603604

604605
void UpdatedBlockTip(gsl::not_null<const CBlockIndex*> pindex) EXCLUSIVE_LOCKS_REQUIRED(!cs);
605606

606607
// the returned list will not contain the correct block hash (we can't know it yet as the coinbase TX is not updated yet)
607-
bool BuildNewListFromBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindexPrev, BlockValidationState& state, const CCoinsViewCache& view,
608-
CDeterministicMNList& mnListRet, bool debugLogs) EXCLUSIVE_LOCKS_REQUIRED(!cs);
609-
void HandleQuorumCommitment(const llmq::CFinalCommitment& qc, gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex, CDeterministicMNList& mnList, bool debugLogs);
608+
bool BuildNewListFromBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindexPrev,
609+
BlockValidationState& state, const CCoinsViewCache& view, CDeterministicMNList& mnListRet,
610+
llmq::CQuorumSnapshotManager& qsnapman, bool debugLogs) EXCLUSIVE_LOCKS_REQUIRED(!cs);
611+
void HandleQuorumCommitment(const llmq::CFinalCommitment& qc, gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex,
612+
CDeterministicMNList& mnList, llmq::CQuorumSnapshotManager& qsnapman, bool debugLogs);
610613

611614
CDeterministicMNList GetListForBlock(gsl::not_null<const CBlockIndex*> pindex) EXCLUSIVE_LOCKS_REQUIRED(!cs) {
612615
LOCK(cs);

src/evo/specialtxman.cpp

+12-9
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@
1919
#include <primitives/block.h>
2020
#include <validation.h>
2121

22-
static bool CheckSpecialTxInner(CDeterministicMNManager& dmnman, const ChainstateManager& chainman,
23-
const llmq::CQuorumManager& qman, const CTransaction& tx, const CBlockIndex* pindexPrev,
24-
const CCoinsViewCache& view, const std::optional<CRangesSet>& indexes, bool check_sigs,
25-
TxValidationState& state) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
22+
static bool CheckSpecialTxInner(CDeterministicMNManager& dmnman, llmq::CQuorumSnapshotManager& qsnapman,
23+
const ChainstateManager& chainman, const llmq::CQuorumManager& qman,
24+
const CTransaction& tx, const CBlockIndex* pindexPrev, const CCoinsViewCache& view,
25+
const std::optional<CRangesSet>& indexes, bool check_sigs, TxValidationState& state)
26+
EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
2627
{
2728
AssertLockHeld(cs_main);
2829

@@ -47,7 +48,7 @@ static bool CheckSpecialTxInner(CDeterministicMNManager& dmnman, const Chainstat
4748
case TRANSACTION_COINBASE:
4849
return CheckCbTx(tx, pindexPrev, state);
4950
case TRANSACTION_QUORUM_COMMITMENT:
50-
return llmq::CheckLLMQCommitment(dmnman, chainman, tx, pindexPrev, state);
51+
return llmq::CheckLLMQCommitment(dmnman, qsnapman, chainman, tx, pindexPrev, state);
5152
case TRANSACTION_MNHF_SIGNAL:
5253
return CheckMNHFTx(chainman, qman, tx, pindexPrev, state);
5354
case TRANSACTION_ASSET_LOCK:
@@ -66,7 +67,8 @@ static bool CheckSpecialTxInner(CDeterministicMNManager& dmnman, const Chainstat
6667
bool CSpecialTxProcessor::CheckSpecialTx(const CTransaction& tx, const CBlockIndex* pindexPrev, const CCoinsViewCache& view, bool check_sigs, TxValidationState& state)
6768
{
6869
AssertLockHeld(cs_main);
69-
return CheckSpecialTxInner(m_dmnman, m_chainman, m_qman, tx, pindexPrev, view, std::nullopt, check_sigs, state);
70+
return CheckSpecialTxInner(m_dmnman, m_qsnapman, m_chainman, m_qman, tx, pindexPrev, view, std::nullopt, check_sigs,
71+
state);
7072
}
7173

7274
[[nodiscard]] bool CSpecialTxProcessor::ProcessSpecialTx(const CTransaction& tx, const CBlockIndex* pindex, TxValidationState& state)
@@ -145,7 +147,8 @@ bool CSpecialTxProcessor::ProcessSpecialTxsInBlock(const CBlock& block, const CB
145147
TxValidationState tx_state;
146148
// At this moment CheckSpecialTx() and ProcessSpecialTx() may fail by 2 possible ways:
147149
// consensus failures and "TX_BAD_SPECIAL"
148-
if (!CheckSpecialTxInner(m_dmnman, m_chainman, m_qman, *ptr_tx, pindex->pprev, view, creditPool.indexes, fCheckCbTxMerkleRoots, tx_state)) {
150+
if (!CheckSpecialTxInner(m_dmnman, m_qsnapman, m_chainman, m_qman, *ptr_tx, pindex->pprev, view,
151+
creditPool.indexes, fCheckCbTxMerkleRoots, tx_state)) {
149152
assert(tx_state.GetResult() == TxValidationResult::TX_CONSENSUS || tx_state.GetResult() == TxValidationResult::TX_BAD_SPECIAL);
150153
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, tx_state.GetRejectReason(),
151154
strprintf("Special Transaction check failed (tx hash %s) %s", ptr_tx->GetHash().ToString(), tx_state.GetDebugMessage()));
@@ -170,7 +173,7 @@ bool CSpecialTxProcessor::ProcessSpecialTxsInBlock(const CBlock& block, const CB
170173
nTimeQuorum += nTime3 - nTime2;
171174
LogPrint(BCLog::BENCHMARK, " - m_qblockman: %.2fms [%.2fs]\n", 0.001 * (nTime3 - nTime2), nTimeQuorum * 0.000001);
172175

173-
if (!m_dmnman.ProcessBlock(block, pindex, state, view, fJustCheck, updatesRet)) {
176+
if (!m_dmnman.ProcessBlock(block, pindex, state, view, m_qsnapman, fJustCheck, updatesRet)) {
174177
// pass the state returned by the function above
175178
return false;
176179
}
@@ -179,7 +182,7 @@ bool CSpecialTxProcessor::ProcessSpecialTxsInBlock(const CBlock& block, const CB
179182
nTimeDMN += nTime4 - nTime3;
180183
LogPrint(BCLog::BENCHMARK, " - m_dmnman: %.2fms [%.2fs]\n", 0.001 * (nTime4 - nTime3), nTimeDMN * 0.000001);
181184

182-
if (fCheckCbTxMerkleRoots && !CheckCbTxMerkleRoots(block, pindex, m_dmnman, m_qblockman, state, view)) {
185+
if (fCheckCbTxMerkleRoots && !CheckCbTxMerkleRoots(block, pindex, m_dmnman, m_qsnapman, m_qblockman, state, view)) {
183186
// pass the state returned by the function above
184187
return false;
185188
}

src/evo/specialtxman.h

+16-4
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ struct MNListUpdates;
2525

2626
namespace Consensus { struct Params; }
2727
namespace llmq {
28+
class CChainLocksHandler;
2829
class CQuorumBlockProcessor;
2930
class CQuorumManager;
30-
class CChainLocksHandler;
31+
class CQuorumSnapshotManager;
3132
} // namespace llmq
3233

3334
extern RecursiveMutex cs_main;
@@ -39,6 +40,7 @@ class CSpecialTxProcessor
3940
CDeterministicMNManager& m_dmnman;
4041
CMNHFManager& m_mnhfman;
4142
llmq::CQuorumBlockProcessor& m_qblockman;
43+
llmq::CQuorumSnapshotManager& m_qsnapman;
4244
const ChainstateManager& m_chainman;
4345
const Consensus::Params& m_consensus_params;
4446
const llmq::CChainLocksHandler& m_clhandler;
@@ -50,10 +52,20 @@ class CSpecialTxProcessor
5052

5153
public:
5254
explicit CSpecialTxProcessor(CCreditPoolManager& cpoolman, CDeterministicMNManager& dmnman, CMNHFManager& mnhfman,
53-
llmq::CQuorumBlockProcessor& qblockman, const ChainstateManager& chainman, const Consensus::Params& consensus_params,
55+
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumSnapshotManager& qsnapman,
56+
const ChainstateManager& chainman, const Consensus::Params& consensus_params,
5457
const llmq::CChainLocksHandler& clhandler, const llmq::CQuorumManager& qman) :
55-
m_cpoolman(cpoolman), m_dmnman{dmnman}, m_mnhfman{mnhfman}, m_qblockman{qblockman}, m_chainman(chainman), m_consensus_params{consensus_params},
56-
m_clhandler{clhandler}, m_qman{qman} {}
58+
m_cpoolman(cpoolman),
59+
m_dmnman{dmnman},
60+
m_mnhfman{mnhfman},
61+
m_qblockman{qblockman},
62+
m_qsnapman{qsnapman},
63+
m_chainman(chainman),
64+
m_consensus_params{consensus_params},
65+
m_clhandler{clhandler},
66+
m_qman{qman}
67+
{
68+
}
5769

5870
bool CheckSpecialTx(const CTransaction& tx, const CBlockIndex* pindexPrev, const CCoinsViewCache& view, bool check_sigs, TxValidationState& state)
5971
EXCLUSIVE_LOCKS_REQUIRED(cs_main);

0 commit comments

Comments
 (0)