Skip to content

Commit e4ea903

Browse files
committed
refactor: drop dependency SML on DMN
1 parent c3a5355 commit e4ea903

File tree

8 files changed

+58
-57
lines changed

8 files changed

+58
-57
lines changed

src/evo/cbtx.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ bool CalcCbTxMerkleRootMNList(uint256& merkleRootRet, const CDeterministicMNList
102102
static uint256 merkleRootCached GUARDED_BY(cached_mutex);
103103
static bool mutatedCached GUARDED_BY(cached_mutex) {false};
104104

105-
std::shared_ptr<const CSimplifiedMNList> sml{mn_list.GetSML()};
105+
std::shared_ptr<const CSimplifiedMNList> sml{mn_list.to_sml()};
106106
LOCK(cached_mutex);
107107
if (sml == cached_sml || *sml == *cached_sml) {
108108
merkleRootRet = merkleRootCached;

src/evo/deterministicmns.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ uint64_t CDeterministicMN::GetInternalId() const
3838
return internalId;
3939
}
4040

41+
CSimplifiedMNListEntry CDeterministicMN::to_sml_entry() const
42+
{
43+
const CDeterministicMNState& state{*pdmnState};
44+
return CSimplifiedMNListEntry(proTxHash, state.confirmedHash, state.netInfo, state.pubKeyOperator,
45+
state.keyIDVoting, !state.IsBanned(), state.platformHTTPPort, state.platformNodeID,
46+
state.scriptPayout, state.scriptOperatorPayout, state.nVersion, nType);
47+
}
48+
4149
std::string CDeterministicMN::ToString() const
4250
{
4351
return strprintf("CDeterministicMN(proTxHash=%s, collateralOutpoint=%s, nOperatorReward=%f, state=%s", proTxHash.ToString(), collateralOutpoint.ToStringShort(), (double)nOperatorReward / 100, pdmnState->ToString());
@@ -256,11 +264,18 @@ std::vector<CDeterministicMNCPtr> CDeterministicMNList::GetProjectedMNPayees(gsl
256264
return result;
257265
}
258266

259-
gsl::not_null<std::shared_ptr<const CSimplifiedMNList>> CDeterministicMNList::GetSML() const
267+
gsl::not_null<std::shared_ptr<const CSimplifiedMNList>> CDeterministicMNList::to_sml() const
260268
{
261269
if (!m_cached_sml) {
262-
m_cached_sml = std::make_shared<const CSimplifiedMNList>(*this);
270+
std::vector<std::unique_ptr<CSimplifiedMNListEntry>> sml_entries;
271+
sml_entries.reserve(mnMap.size());
272+
273+
ForEachMN(false, [this, &sml_entries](auto& dmn) {
274+
sml_entries.emplace_back(std::make_unique<CSimplifiedMNListEntry>(dmn.to_sml_entry()));
275+
});
276+
m_cached_sml = std::make_shared<CSimplifiedMNList>(std::move(sml_entries));
263277
}
278+
264279
return m_cached_sml;
265280
}
266281

@@ -520,7 +535,7 @@ void CDeterministicMNList::UpdateMN(const CDeterministicMN& oldDmn, const std::s
520535

521536
dmn->pdmnState = pdmnState;
522537
mnMap = mnMap.set(oldDmn.proTxHash, dmn);
523-
if (m_cached_sml && CSimplifiedMNListEntry{oldDmn} != CSimplifiedMNListEntry{*dmn}) {
538+
if (m_cached_sml && oldDmn.to_sml_entry() != dmn->to_sml_entry()) {
524539
m_cached_sml = nullptr;
525540
}
526541
}
@@ -615,7 +630,7 @@ bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<co
615630
int nHeight = pindex->nHeight;
616631

617632
try {
618-
newList.GetSML(); // to fullfill cache of SML
633+
newList.to_sml(); // to fullfill cache of SML
619634

620635
LOCK(cs);
621636

src/evo/deterministicmns.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class CBlockIndex;
3131
class CCoinsViewCache;
3232
class CEvoDB;
3333
class CSimplifiedMNList;
34+
class CSimplifiedMNListEntry;
3435
class TxValidationState;
3536

3637
extern RecursiveMutex cs_main;
@@ -106,6 +107,7 @@ class CDeterministicMN
106107

107108
[[nodiscard]] uint64_t GetInternalId() const;
108109

110+
[[nodiscard]] CSimplifiedMNListEntry to_sml_entry() const;
109111
[[nodiscard]] std::string ToString() const;
110112
[[nodiscard]] UniValue ToJson() const;
111113
};
@@ -343,7 +345,7 @@ class CDeterministicMNList
343345
/**
344346
* Calculates CSimplifiedMNList for current list and cache it
345347
*/
346-
gsl::not_null<std::shared_ptr<const CSimplifiedMNList>> GetSML() const;
348+
gsl::not_null<std::shared_ptr<const CSimplifiedMNList>> to_sml() const;
347349

348350
/**
349351
* Calculates the maximum penalty which is allowed at the height of this MN list. It is dynamic and might change

src/evo/simplifiedmns.cpp

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,32 @@
44

55
#include <evo/simplifiedmns.h>
66

7+
#include <clientversion.h>
78
#include <consensus/merkle.h>
8-
#include <evo/deterministicmns.h>
99
#include <key_io.h>
1010
#include <pubkey.h>
1111
#include <serialize.h>
1212
#include <univalue.h>
1313
#include <util/underlying.h>
1414
#include <version.h>
1515

16-
CSimplifiedMNListEntry::CSimplifiedMNListEntry(const CDeterministicMN& dmn) :
17-
proRegTxHash(dmn.proTxHash),
18-
confirmedHash(dmn.pdmnState->confirmedHash),
19-
netInfo(dmn.pdmnState->netInfo),
20-
pubKeyOperator(dmn.pdmnState->pubKeyOperator),
21-
keyIDVoting(dmn.pdmnState->keyIDVoting),
22-
isValid(!dmn.pdmnState->IsBanned()),
23-
platformHTTPPort(dmn.pdmnState->platformHTTPPort),
24-
platformNodeID(dmn.pdmnState->platformNodeID),
25-
scriptPayout(dmn.pdmnState->scriptPayout),
26-
scriptOperatorPayout(dmn.pdmnState->scriptOperatorPayout),
27-
nVersion(dmn.pdmnState->nVersion),
28-
nType(dmn.nType)
16+
CSimplifiedMNListEntry::CSimplifiedMNListEntry(const uint256& proreg_tx_hash, const uint256& confirmed_hash,
17+
MnNetInfo net_info, const CBLSLazyPublicKey& pubkey_operator,
18+
const CKeyID& keyid_voting, bool is_valid, uint16_t platform_http_port,
19+
const uint160& platform_node_id, const CScript& script_payout,
20+
const CScript& script_operator_payout, uint16_t version, MnType type) :
21+
proRegTxHash(proreg_tx_hash),
22+
confirmedHash(confirmed_hash),
23+
netInfo(net_info),
24+
pubKeyOperator(pubkey_operator),
25+
keyIDVoting(keyid_voting),
26+
isValid(is_valid),
27+
platformHTTPPort(platform_http_port),
28+
platformNodeID(platform_node_id),
29+
scriptPayout(script_payout),
30+
scriptOperatorPayout(script_operator_payout),
31+
nVersion(version),
32+
nType(type)
2933
{
3034
}
3135

@@ -57,24 +61,9 @@ std::string CSimplifiedMNListEntry::ToString() const
5761
operatorPayoutAddress, platformHTTPPort, platformNodeID.ToString(), netInfo.ToString());
5862
}
5963

60-
CSimplifiedMNList::CSimplifiedMNList(const std::vector<CSimplifiedMNListEntry>& smlEntries)
64+
CSimplifiedMNList::CSimplifiedMNList(std::vector<std::unique_ptr<CSimplifiedMNListEntry>>&& smlEntries)
6165
{
62-
mnList.reserve(smlEntries.size());
63-
for (const auto& entry : smlEntries) {
64-
mnList.emplace_back(std::make_unique<CSimplifiedMNListEntry>(entry));
65-
}
66-
67-
std::sort(mnList.begin(), mnList.end(), [&](const std::unique_ptr<CSimplifiedMNListEntry>& a, const std::unique_ptr<CSimplifiedMNListEntry>& b) {
68-
return a->proRegTxHash.Compare(b->proRegTxHash) < 0;
69-
});
70-
}
71-
72-
CSimplifiedMNList::CSimplifiedMNList(const CDeterministicMNList& dmnList)
73-
{
74-
mnList.reserve(dmnList.GetAllMNsCount());
75-
dmnList.ForEachMN(false, [this](auto& dmn) {
76-
mnList.emplace_back(std::make_unique<CSimplifiedMNListEntry>(dmn));
77-
});
66+
mnList = std::move(smlEntries);
7867

7968
std::sort(mnList.begin(), mnList.end(), [&](const std::unique_ptr<CSimplifiedMNListEntry>& a, const std::unique_ptr<CSimplifiedMNListEntry>& b) {
8069
return a->proRegTxHash.Compare(b->proRegTxHash) < 0;

src/evo/simplifiedmns.h

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,10 @@
1313
#include <netaddress.h>
1414
#include <pubkey.h>
1515

16-
class UniValue;
17-
class CDeterministicMN;
18-
class CDeterministicMNList;
19-
class ChainstateManager;
16+
#include <memory>
17+
#include <vector>
2018

21-
namespace llmq {
22-
class CFinalCommitment;
23-
class CQuorumBlockProcessor;
24-
class CQuorumManager;
25-
} // namespace llmq
19+
class UniValue;
2620

2721
class CSimplifiedMNListEntry
2822
{
@@ -41,7 +35,10 @@ class CSimplifiedMNListEntry
4135
MnType nType{MnType::Regular};
4236

4337
CSimplifiedMNListEntry() = default;
44-
explicit CSimplifiedMNListEntry(const CDeterministicMN& dmn);
38+
CSimplifiedMNListEntry(const uint256& proreg_tx_hash, const uint256& confirmed_hash, MnNetInfo net_info,
39+
const CBLSLazyPublicKey& pubkey_operator, const CKeyID& keyid_voting, bool is_valid,
40+
uint16_t platform_http_port, const uint160& platform_node_id, const CScript& script_payout,
41+
const CScript& script_operator_payout, uint16_t version, MnType type);
4542

4643
bool operator==(const CSimplifiedMNListEntry& rhs) const
4744
{
@@ -99,10 +96,9 @@ class CSimplifiedMNList
9996
std::vector<std::unique_ptr<CSimplifiedMNListEntry>> mnList;
10097

10198
CSimplifiedMNList() = default;
102-
explicit CSimplifiedMNList(const CDeterministicMNList& dmnList);
10399

104100
// This constructor from std::vector is used in unit-tests
105-
explicit CSimplifiedMNList(const std::vector<CSimplifiedMNListEntry>& smlEntries);
101+
explicit CSimplifiedMNList(std::vector<std::unique_ptr<CSimplifiedMNListEntry>>&& smlEntries);
106102

107103
uint256 CalcMerkleRoot(bool* pmutated = nullptr) const;
108104
bool operator==(const CSimplifiedMNList& rhs) const;

src/evo/smldiff.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,11 @@ CSimplifiedMNListDiff BuildSimplifiedDiff(const CDeterministicMNList& from, cons
127127
to.ForEachMN(false, [&](const auto& toPtr) {
128128
auto fromPtr = from.GetMN(toPtr.proTxHash);
129129
if (fromPtr == nullptr) {
130-
CSimplifiedMNListEntry sme(toPtr);
130+
CSimplifiedMNListEntry sme{toPtr.to_sml_entry()};
131131
diffRet.mnList.push_back(std::move(sme));
132132
} else {
133-
CSimplifiedMNListEntry sme1(toPtr);
134-
CSimplifiedMNListEntry sme2(*fromPtr);
133+
CSimplifiedMNListEntry sme1{toPtr.to_sml_entry()};
134+
CSimplifiedMNListEntry sme2(fromPtr->to_sml_entry());
135135
if ((sme1 != sme2) || (extended && (sme1.scriptPayout != sme2.scriptPayout ||
136136
sme1.scriptOperatorPayout != sme2.scriptOperatorPayout))) {
137137
diffRet.mnList.push_back(std::move(sme1));

src/test/evo_simplifiedmns_tests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ BOOST_AUTO_TEST_CASE(simplifiedmns_merkleroots)
1616
{
1717
//TODO: Provide raw data for basic scheme as well
1818
bls::bls_legacy_scheme.store(true);
19-
std::vector<CSimplifiedMNListEntry> entries;
19+
std::vector<std::unique_ptr<CSimplifiedMNListEntry>> entries;
2020
for (size_t i = 1; i < 16; i++) {
2121
CSimplifiedMNListEntry smle;
2222
smle.proRegTxHash.SetHex(strprintf("%064x", i));
@@ -31,7 +31,7 @@ BOOST_AUTO_TEST_CASE(simplifiedmns_merkleroots)
3131
smle.keyIDVoting.SetHex(strprintf("%040x", i));
3232
smle.isValid = true;
3333

34-
entries.emplace_back(smle);
34+
entries.emplace_back(std::make_unique<CSimplifiedMNListEntry>(smle));
3535
}
3636

3737
std::vector<std::string> expectedHashes = {
@@ -54,13 +54,13 @@ BOOST_AUTO_TEST_CASE(simplifiedmns_merkleroots)
5454
std::vector<std::string> calculatedHashes;
5555

5656
for (auto& smle : entries) {
57-
calculatedHashes.emplace_back(smle.CalcHash().ToString());
57+
calculatedHashes.emplace_back(smle->CalcHash().ToString());
5858
//printf("\"%s\",\n", calculatedHashes.back().c_str());
5959
}
6060

6161
BOOST_CHECK(expectedHashes == calculatedHashes);
6262

63-
CSimplifiedMNList sml(entries);
63+
CSimplifiedMNList sml{std::move(entries)};
6464

6565
std::string expectedMerkleRoot = "0bae2176078cf42fa3e1fda761d4255d1c1c54777c6a793d0ab2b07c85ed4022";
6666
std::string calculatedMerkleRoot = sml.CalcMerkleRoot(nullptr).ToString();

test/lint/lint-circular-dependencies.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
"evo/deterministicmns -> llmq/utils -> net -> evo/deterministicmns",
5353
"evo/deterministicmns -> validationinterface -> evo/deterministicmns",
5454
"evo/deterministicmns -> validationinterface -> governance/vote -> evo/deterministicmns",
55-
"evo/deterministicmns -> evo/simplifiedmns -> evo/deterministicmns",
5655
"evo/mnhftx -> validation -> evo/mnhftx",
5756
"evo/smldiff -> llmq/blockprocessor -> llmq/utils -> llmq/snapshot -> evo/smldiff",
5857
"evo/specialtxman -> validation -> evo/specialtxman",

0 commit comments

Comments
 (0)