From 072efca3a2880ec08b7a03c77475013069332575 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 1 Jul 2019 10:06:25 +0200 Subject: [PATCH 1/2] Add "isValidMember" and "memberIndex" to output of "quorum memberof" --- src/rpc/rpcquorums.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/rpc/rpcquorums.cpp b/src/rpc/rpcquorums.cpp index 4cfd5caf24a8a..d0f7a4dcd8985 100644 --- a/src/rpc/rpcquorums.cpp +++ b/src/rpc/rpcquorums.cpp @@ -219,26 +219,21 @@ UniValue quorum_memberof(const JSONRPCRequest& request) throw JSONRPCError(RPC_INVALID_PARAMETER, "masternode not found"); } - std::set> quorumHashes; + UniValue result(UniValue::VARR); + for (const auto& p : Params().GetConsensus().llmqs) { auto& params = p.second; auto quorums = llmq::quorumManager->ScanQuorums(params.type, params.signingActiveQuorumCount); for (auto& quorum : quorums) { - for (auto& m : quorum->members) { - if (m->proTxHash == dmn->proTxHash) { - quorumHashes.emplace(params.type, quorum->qc.quorumHash); - } + if (quorum->IsMember(dmn->proTxHash)) { + auto json = BuildQuorumInfo(quorum, false, false); + json.push_back(Pair("isValidMember", quorum->IsValidMember(dmn->proTxHash))); + json.push_back(Pair("memberIndex", quorum->GetMemberIndex(dmn->proTxHash))); + result.push_back(json); } } } - UniValue result(UniValue::VARR); - for (auto& p : quorumHashes) { - auto quorum = llmq::quorumManager->GetQuorum(p.first, p.second); - assert(quorum); - result.push_back(BuildQuorumInfo(quorum, false, false)); - } - return result; } From cb688b707cc9f094281a19358a465d895a8e2c28 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 1 Jul 2019 10:10:54 +0200 Subject: [PATCH 2/2] Allow to specify how many quorums to scan for in "quorum memberof" --- src/rpc/rpcquorums.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/rpc/rpcquorums.cpp b/src/rpc/rpcquorums.cpp index d0f7a4dcd8985..b9709ef8c9020 100644 --- a/src/rpc/rpcquorums.cpp +++ b/src/rpc/rpcquorums.cpp @@ -192,20 +192,29 @@ UniValue quorum_dkgstatus(const JSONRPCRequest& request) void quorum_memberof_help() { throw std::runtime_error( - "quorum memberof \"proTxHash\"\n" + "quorum memberof \"proTxHash\" (quorumCount)\n" "Checks which quorums the given masternode is a member of.\n" "\nArguments:\n" "1. \"proTxHash\" (string, required) ProTxHash of the masternode.\n" + "2. scanQuorumsCount (number, optional) Number of quorums to scan for. If not specified,\n" + " the active quorum count for each specific quorum type is used." ); } UniValue quorum_memberof(const JSONRPCRequest& request) { - if (request.fHelp || (request.params.size() != 2)) { + if (request.fHelp || (request.params.size() < 2 || request.params.size() > 3)) { quorum_memberof_help(); } uint256 protxHash = ParseHashV(request.params[1], "proTxHash"); + int scanQuorumsCount = -1; + if (request.params.size() >= 3) { + scanQuorumsCount = ParseInt32V(request.params[2], "scanQuorumsCount"); + if (scanQuorumsCount <= 0) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "invalid scanQuorumsCount parameter"); + } + } const CBlockIndex* pindexTip; { @@ -223,7 +232,11 @@ UniValue quorum_memberof(const JSONRPCRequest& request) for (const auto& p : Params().GetConsensus().llmqs) { auto& params = p.second; - auto quorums = llmq::quorumManager->ScanQuorums(params.type, params.signingActiveQuorumCount); + size_t count = params.signingActiveQuorumCount; + if (scanQuorumsCount != -1) { + count = (size_t)scanQuorumsCount; + } + auto quorums = llmq::quorumManager->ScanQuorums(params.type, count); for (auto& quorum : quorums) { if (quorum->IsMember(dmn->proTxHash)) { auto json = BuildQuorumInfo(quorum, false, false);