Skip to content

Commit b0260e9

Browse files
committed
Do not maintain CService in masternodeQuorumNodes
Not needed anymore as we retrieve the service/address of a masternode on-the-fly in ThreadOpenMasternodeConnections.
1 parent 60788ce commit b0260e9

File tree

6 files changed

+56
-31
lines changed

6 files changed

+56
-31
lines changed

src/llmq/quorums.cpp

+14-6
Original file line numberDiff line numberDiff line change
@@ -190,21 +190,29 @@ void CQuorumManager::EnsureQuorumConnections(Consensus::LLMQType llmqType, const
190190
}
191191

192192
if (!g_connman->HasMasternodeQuorumNodes(llmqType, quorum->qc.quorumHash)) {
193-
std::map<CService, uint256> connections;
193+
std::set<uint256> connections;
194194
if (quorum->IsMember(myProTxHash)) {
195195
connections = CLLMQUtils::GetQuorumConnections(llmqType, quorum->qc.quorumHash, myProTxHash);
196196
} else {
197197
auto cindexes = CLLMQUtils::CalcDeterministicWatchConnections(llmqType, quorum->qc.quorumHash, quorum->members.size(), 1);
198198
for (auto idx : cindexes) {
199-
connections.emplace(quorum->members[idx]->pdmnState->addr, quorum->members[idx]->proTxHash);
199+
connections.emplace(quorum->members[idx]->proTxHash);
200200
}
201201
}
202202
if (!connections.empty()) {
203-
std::string debugMsg = strprintf("CQuorumManager::%s -- adding masternodes quorum connections for quorum %s:\n", __func__, quorum->qc.quorumHash.ToString());
204-
for (auto& c : connections) {
205-
debugMsg += strprintf(" %s\n", c.first.ToString(false));
203+
if (LogAcceptCategory("llmq")) {
204+
auto mnList = deterministicMNManager->GetListAtChainTip();
205+
std::string debugMsg = strprintf("CQuorumManager::%s -- adding masternodes quorum connections for quorum %s:\n", __func__, quorum->qc.quorumHash.ToString());
206+
for (auto& c : connections) {
207+
auto dmn = mnList.GetValidMN(c);
208+
if (!dmn) {
209+
debugMsg += strprintf(" %s (not in valid MN set anymore)\n", c.ToString());
210+
} else {
211+
debugMsg += strprintf(" %s (%s)\n", c.ToString(), dmn->pdmnState->addr.ToString(false));
212+
}
213+
}
214+
LogPrint("llmq", debugMsg);
206215
}
207-
LogPrint("llmq", debugMsg);
208216
g_connman->AddMasternodeQuorumNodes(llmqType, quorum->qc.quorumHash, connections);
209217
}
210218
}

src/llmq/quorums_dkgsessionhandler.cpp

+14-6
Original file line numberDiff line numberDiff line change
@@ -468,21 +468,29 @@ void CDKGSessionHandler::HandleDKGRound()
468468
});
469469

470470
if (curSession->AreWeMember() || GetBoolArg("-watchquorums", DEFAULT_WATCH_QUORUMS)) {
471-
std::map<CService, uint256> connections;
471+
std::set<uint256> connections;
472472
if (curSession->AreWeMember()) {
473473
connections = CLLMQUtils::GetQuorumConnections(params.type, curQuorumHash, curSession->myProTxHash);
474474
} else {
475475
auto cindexes = CLLMQUtils::CalcDeterministicWatchConnections(params.type, curQuorumHash, curSession->members.size(), 1);
476476
for (auto idx : cindexes) {
477-
connections.emplace(curSession->members[idx]->dmn->pdmnState->addr, curSession->members[idx]->dmn->proTxHash);
477+
connections.emplace(curSession->members[idx]->dmn->proTxHash);
478478
}
479479
}
480480
if (!connections.empty()) {
481-
std::string debugMsg = strprintf("CDKGSessionManager::%s -- adding masternodes quorum connections for quorum %s:\n", __func__, curSession->quorumHash.ToString());
482-
for (const auto& c : connections) {
483-
debugMsg += strprintf(" %s\n", c.first.ToString(false));
481+
if (LogAcceptCategory("llmq-dkg")) {
482+
std::string debugMsg = strprintf("CDKGSessionManager::%s -- adding masternodes quorum connections for quorum %s:\n", __func__, curSession->quorumHash.ToString());
483+
auto mnList = deterministicMNManager->GetListAtChainTip();
484+
for (const auto& c : connections) {
485+
auto dmn = mnList.GetValidMN(c);
486+
if (!dmn) {
487+
debugMsg += strprintf(" %s (not in valid MN set anymore)\n", c.ToString());
488+
} else {
489+
debugMsg += strprintf(" %s (%s)\n", c.ToString(), dmn->pdmnState->addr.ToString(false));
490+
}
491+
}
492+
LogPrint("llmq-dkg", debugMsg);
484493
}
485-
LogPrint("llmq-dkg", debugMsg);
486494
g_connman->AddMasternodeQuorumNodes(params.type, curQuorumHash, connections);
487495
}
488496
}

src/llmq/quorums_utils.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ uint256 CLLMQUtils::BuildSignHash(Consensus::LLMQType llmqType, const uint256& q
4141
return h.GetHash();
4242
}
4343

44-
std::map<CService, uint256> CLLMQUtils::GetQuorumConnections(Consensus::LLMQType llmqType, const uint256& blockHash, const uint256& forMember)
44+
std::set<uint256> CLLMQUtils::GetQuorumConnections(Consensus::LLMQType llmqType, const uint256& blockHash, const uint256& forMember)
4545
{
4646
auto& params = Params().GetConsensus().llmqs.at(llmqType);
4747

4848
auto mns = GetAllQuorumMembers(llmqType, blockHash);
49-
std::map<CService, uint256> result;
49+
std::set<uint256> result;
5050
for (size_t i = 0; i < mns.size(); i++) {
5151
auto& dmn = mns[i];
5252
if (dmn->proTxHash == forMember) {
@@ -62,7 +62,7 @@ std::map<CService, uint256> CLLMQUtils::GetQuorumConnections(Consensus::LLMQType
6262
if (otherDmn == dmn) {
6363
continue;
6464
}
65-
result.emplace(otherDmn->pdmnState->addr, otherDmn->proTxHash);
65+
result.emplace(otherDmn->proTxHash);
6666
gap <<= 1;
6767
k++;
6868
}

src/llmq/quorums_utils.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class CLLMQUtils
3131
return BuildSignHash((Consensus::LLMQType)s.llmqType, s.quorumHash, s.id, s.msgHash);
3232
}
3333

34-
static std::map<CService, uint256> GetQuorumConnections(Consensus::LLMQType llmqType, const uint256& blockHash, const uint256& forMember);
34+
static std::set<uint256> GetQuorumConnections(Consensus::LLMQType llmqType, const uint256& blockHash, const uint256& forMember);
3535
static std::set<size_t> CalcDeterministicWatchConnections(Consensus::LLMQType llmqType, const uint256& blockHash, size_t memberCount, size_t connectionCount);
3636

3737
static bool IsQuorumActive(Consensus::LLMQType llmqType, const uint256& quorumHash);

src/net.cpp

+22-13
Original file line numberDiff line numberDiff line change
@@ -2070,8 +2070,7 @@ void CConnman::ThreadOpenMasternodeConnections()
20702070

20712071
std::vector<CService> pending;
20722072
for (const auto& group : masternodeQuorumNodes) {
2073-
for (const auto& p : group.second) {
2074-
const auto& proRegTxHash = p.second;
2073+
for (const auto& proRegTxHash : group.second) {
20752074
auto dmn = mnList.GetValidMN(proRegTxHash);
20762075
if (!dmn) {
20772076
continue;
@@ -2725,14 +2724,14 @@ bool CConnman::AddPendingMasternode(const CService& service)
27252724
return true;
27262725
}
27272726

2728-
bool CConnman::AddMasternodeQuorumNodes(Consensus::LLMQType llmqType, const uint256& quorumHash, const std::map<CService, uint256>& addresses)
2727+
bool CConnman::AddMasternodeQuorumNodes(Consensus::LLMQType llmqType, const uint256& quorumHash, const std::set<uint256>& proTxHashes)
27292728
{
27302729
LOCK(cs_vPendingMasternodes);
27312730
auto it = masternodeQuorumNodes.find(std::make_pair(llmqType, quorumHash));
27322731
if (it != masternodeQuorumNodes.end()) {
27332732
return false;
27342733
}
2735-
masternodeQuorumNodes.emplace(std::make_pair(llmqType, quorumHash), addresses);
2734+
masternodeQuorumNodes.emplace(std::make_pair(llmqType, quorumHash), proTxHashes);
27362735
return true;
27372736
}
27382737

@@ -2762,18 +2761,14 @@ std::set<NodeId> CConnman::GetMasternodeQuorumNodes(Consensus::LLMQType llmqType
27622761
if (it == masternodeQuorumNodes.end()) {
27632762
return {};
27642763
}
2765-
std::set<uint256> proRegTxHashes;
2766-
for (auto& p : it->second) {
2767-
proRegTxHashes.emplace(p.second);
2768-
}
2764+
const auto& proRegTxHashes = it->second;
27692765

27702766
std::set<NodeId> nodes;
27712767
for (const auto pnode : vNodes) {
27722768
if (pnode->fDisconnect) {
27732769
continue;
27742770
}
2775-
if (!pnode->qwatch && !it->second.count(pnode->addr) &&
2776-
(pnode->verifiedProRegTxHash.IsNull() || !proRegTxHashes.count(pnode->verifiedProRegTxHash))) {
2771+
if (!pnode->qwatch && (pnode->verifiedProRegTxHash.IsNull() || !proRegTxHashes.count(pnode->verifiedProRegTxHash))) {
27772772
continue;
27782773
}
27792774
nodes.emplace(pnode->id);
@@ -2789,13 +2784,27 @@ void CConnman::RemoveMasternodeQuorumNodes(Consensus::LLMQType llmqType, const u
27892784

27902785
bool CConnman::IsMasternodeQuorumNode(const CNode* pnode)
27912786
{
2787+
// Let's see if this is an outgoing connection to an address that is known to be a masternode
2788+
// We however only need to know this if the node did not authenticate itself as a MN yet
2789+
uint256 assumedProTxHash;
2790+
if (pnode->verifiedProRegTxHash.IsNull() && !pnode->fInbound) {
2791+
auto mnList = deterministicMNManager->GetListAtChainTip();
2792+
auto dmn = mnList.GetValidMNByService(pnode->addr);
2793+
if (dmn == nullptr) {
2794+
// This is definitely not a masternode
2795+
return false;
2796+
}
2797+
assumedProTxHash = dmn->proTxHash;
2798+
}
2799+
27922800
LOCK(cs_vPendingMasternodes);
27932801
for (const auto& p : masternodeQuorumNodes) {
2794-
for (const auto& p2 : p.second) {
2795-
if (p2.first == (CService)pnode->addr) {
2802+
if (!pnode->verifiedProRegTxHash.IsNull()) {
2803+
if (p.second.count(pnode->verifiedProRegTxHash)) {
27962804
return true;
27972805
}
2798-
if (!pnode->verifiedProRegTxHash.IsNull() && p2.second == pnode->verifiedProRegTxHash) {
2806+
} else if (!assumedProTxHash.IsNull()) {
2807+
if (p.second.count(assumedProTxHash)) {
27992808
return true;
28002809
}
28012810
}

src/net.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ class CConnman
356356
std::vector<AddedNodeInfo> GetAddedNodeInfo();
357357

358358
bool AddPendingMasternode(const CService& addr);
359-
bool AddMasternodeQuorumNodes(Consensus::LLMQType llmqType, const uint256& quorumHash, const std::map<CService, uint256>& addresses);
359+
bool AddMasternodeQuorumNodes(Consensus::LLMQType llmqType, const uint256& quorumHash, const std::set<uint256>& proTxHashes);
360360
bool HasMasternodeQuorumNodes(Consensus::LLMQType llmqType, const uint256& quorumHash);
361361
std::set<uint256> GetMasternodeQuorums(Consensus::LLMQType llmqType);
362362
// also returns QWATCH nodes
@@ -492,7 +492,7 @@ class CConnman
492492
std::vector<std::string> vAddedNodes;
493493
CCriticalSection cs_vAddedNodes;
494494
std::vector<CService> vPendingMasternodes;
495-
std::map<std::pair<Consensus::LLMQType, uint256>, std::map<CService, uint256>> masternodeQuorumNodes; // protected by cs_vPendingMasternodes
495+
std::map<std::pair<Consensus::LLMQType, uint256>, std::set<uint256>> masternodeQuorumNodes; // protected by cs_vPendingMasternodes
496496
mutable CCriticalSection cs_vPendingMasternodes;
497497
std::vector<CNode*> vNodes;
498498
std::list<CNode*> vNodesDisconnected;

0 commit comments

Comments
 (0)