From 9ac7a998be7e0399078cd6c82aea7767b8080395 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 2 Jul 2019 22:44:29 +0200 Subject: [PATCH] Add "isValidMember" and "memberIndex" to "quorum memberof" and allow to specify quorum scan count (#3009) * Add "isValidMember" and "memberIndex" to output of "quorum memberof" * Allow to specify how many quorums to scan for in "quorum memberof" --- src/rpc/rpcquorums.cpp | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/rpc/rpcquorums.cpp b/src/rpc/rpcquorums.cpp index 4cfd5caf24..b9709ef8c9 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; { @@ -219,26 +228,25 @@ 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); + size_t count = params.signingActiveQuorumCount; + if (scanQuorumsCount != -1) { + count = (size_t)scanQuorumsCount; + } + auto quorums = llmq::quorumManager->ScanQuorums(params.type, count); 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; }