Skip to content

Commit b0b6ba1

Browse files
Merge #6115: backport: v21.0.x rc.2
db82817 Merge #6106: feat: create new composite quorum-command platformsign (pasta) a45e6df Merge #6104: fix: adjust incorrect parameter description that says there is a default that doesn't exist (pasta) 7330982 Merge #6100: feat: make whitelist works with composite commands for platform needs (pasta) 9998ffd Merge #6096: feat: split type of error in submitchainlock - return enum in CL verifying code (pasta) cdf7a25 Merge #6095: fix: createwallet to require 'load_on_startup' for descriptor wallets (pasta) c1c2c55 Merge #6092: fix: mixing for partially unlocked descriptor wallets (pasta) 1175486 Merge #6073: feat: add logging for RPC HTTP requests: command, user, http-code, time of running (pasta) Pull request description: ## Issue being fixed or feature implemented Backports a set of 6 PRs needed in rc.2 ## What was done? Backported PRs with labels ## How Has This Been Tested? ## Breaking Changes ## Checklist: _Go over all the following points, and put an `x` in all the boxes that apply._ - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: kwvg: LGTM, utACK db82817 UdjinM6: utACK db82817 Tree-SHA512: 1b242c5db04bd5873ef622543bc2a25e29567f15962c677ea51ff05cb784291968d18f419bf611c206b912e8f15d687208ae75af33aab89038b6f0167d99c4bf
2 parents 6e5d3f1 + db82817 commit b0b6ba1

23 files changed

+250
-123
lines changed

doc/release-notes-16528.md

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Descriptor Wallet should be created.
3535

3636
Without those options being set, a Legacy Wallet will be created instead.
3737

38+
3839
#### `IsMine` Semantics
3940

4041
`IsMine` refers to the function used to determine whether a script belongs to the wallet.
@@ -117,3 +118,4 @@ descriptors with private keys for now as explained earlier.
117118
## RPC changes
118119
- `createwallet` has changed list of arguments: `createwallet "wallet_name" ( disable_private_keys blank "passphrase" avoid_reuse descriptors load_on_startup )`
119120
`load_on_startup` used to be an argument 5 but now has a number 6.
121+
- `createwallet` requires specifying the `load_on_startup` flag when creating descriptor wallets due to breaking changes in v21.

doc/release-notes-6100.md

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
## Remote Procedure Call (RPC) Changes
2+
3+
### Improved support of composite commands
4+
5+
Dash Core's composite commands such as `quorum list` or `bls generate` now are compatible with a whitelist feature.
6+
7+
For example, whitelist `getblockcount,quorumlist` will let to call commands `getblockcount`, `quorum list`, but not `quorum sign`
8+
9+
Note, that adding simple `quorum` in whitelist will allow to use all kind of `quorum...` commands, such as `quorum`, `quorum list`, `quorum sign`, etc

doc/release-notes-6106.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
## Remote Procedure Call (RPC) Changes
2+
3+
### The new RPCs are:
4+
5+
- `quorum signplatform` This RPC is added for Platform needs. This composite command let to limit quorum type for signing by platform. It is equivalent of `quorum sign <platform type>`.
6+

src/chainparamsbase.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ void SetupChainParamsBaseOptions(ArgsManager& argsman)
2525
argsman.AddArg("-highsubsidyblocks=<n>", "The number of blocks with a higher than normal subsidy to mine at the start of a chain. Block after that height will have fixed subsidy base. (default: 0, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
2626
argsman.AddArg("-highsubsidyfactor=<n>", "The factor to multiply the normal block subsidy by while in the highsubsidyblocks window of a chain (default: 1, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
2727
argsman.AddArg("-llmqchainlocks=<quorum name>", "Override the default LLMQ type used for ChainLocks. Allows using ChainLocks with smaller LLMQs. (default: llmq_devnet, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
28-
argsman.AddArg("-llmqdevnetparams=<size>:<threshold>", "Override the default LLMQ size for the LLMQ_DEVNET quorum (default: 3:2, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
28+
argsman.AddArg("-llmqdevnetparams=<size>:<threshold>", "Override the default LLMQ size for the LLMQ_DEVNET quorum (devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
2929
argsman.AddArg("-llmqinstantsenddip0024=<quorum name>", "Override the default LLMQ type used for InstantSendDIP0024. (default: llmq_devnet_dip0024, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
3030
argsman.AddArg("-llmqplatform=<quorum name>", "Override the default LLMQ type used for Platform. (default: llmq_devnet_platform, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
3131
argsman.AddArg("-llmqmnhf=<quorum name>", "Override the default LLMQ type used for EHF. (default: llmq_devnet, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);

src/evo/cbtx.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ bool CheckCbTxBestChainlock(const CBlock& block, const CBlockIndex* pindex,
374374
return true;
375375
}
376376
uint256 curBlockCoinbaseCLBlockHash = pindex->GetAncestor(curBlockCoinbaseCLHeight)->GetBlockHash();
377-
if (!chainlock_handler.VerifyChainLock(llmq::CChainLockSig(curBlockCoinbaseCLHeight, curBlockCoinbaseCLBlockHash, opt_cbTx->bestCLSignature))) {
377+
if (chainlock_handler.VerifyChainLock(llmq::CChainLockSig(curBlockCoinbaseCLHeight, curBlockCoinbaseCLBlockHash, opt_cbTx->bestCLSignature)) != llmq::VerifyRecSigStatus::Valid) {
378378
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-invalid-clsig");
379379
}
380380
} else if (opt_cbTx->bestCLHeightDiff != 0) {

src/httprpc.cpp

+63-25
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,47 @@ static std::vector<std::vector<std::string>> g_rpcauth;
7272
static std::map<std::string, std::set<std::string>> g_rpc_whitelist;
7373
static bool g_rpc_whitelist_default = false;
7474

75-
static void JSONErrorReply(HTTPRequest* req, const UniValue& objError, const UniValue& id)
75+
extern std::vector<std::string> g_external_usernames;
76+
class RpcHttpRequest
77+
{
78+
public:
79+
HTTPRequest* m_req;
80+
int64_t m_startTime;
81+
int m_status{0};
82+
std::string user;
83+
std::string command;
84+
85+
RpcHttpRequest(HTTPRequest* req) :
86+
m_req{req},
87+
m_startTime{GetTimeMicros()}
88+
{}
89+
90+
~RpcHttpRequest()
91+
{
92+
const bool is_external = find(g_external_usernames.begin(), g_external_usernames.end(), user) != g_external_usernames.end();
93+
LogPrint(BCLog::BENCHMARK, "HTTP RPC request handled: user=%s command=%s external=%s status=%d elapsed_time_ms=%d\n", user, command, is_external, m_status, (GetTimeMicros() - m_startTime) / 1000);
94+
}
95+
96+
bool send_reply(int status, const std::string& response = "")
97+
{
98+
m_status = status;
99+
m_req->WriteReply(status, response);
100+
return m_status == HTTP_OK;
101+
}
102+
};
103+
104+
static bool whitelisted(JSONRPCRequest jreq)
105+
{
106+
if (g_rpc_whitelist[jreq.authUser].count(jreq.strMethod)) return true;
107+
108+
// check for composite command after
109+
if (!jreq.params.isArray() || jreq.params.empty()) return false;
110+
if (!jreq.params[0].isStr()) return false;
111+
112+
return g_rpc_whitelist[jreq.authUser].count(jreq.strMethod + jreq.params[0].get_str());
113+
}
114+
115+
static bool JSONErrorReply(RpcHttpRequest& rpcRequest, const UniValue& objError, const UniValue& id)
76116
{
77117
// Send error reply from json-rpc error object
78118
int nStatus = HTTP_INTERNAL_SERVER_ERROR;
@@ -88,8 +128,8 @@ static void JSONErrorReply(HTTPRequest* req, const UniValue& objError, const Uni
88128

89129
std::string strReply = JSONRPCReply(NullUniValue, objError, id);
90130

91-
req->WriteHeader("Content-Type", "application/json");
92-
req->WriteReply(nStatus, strReply);
131+
rpcRequest.m_req->WriteHeader("Content-Type", "application/json");
132+
return rpcRequest.send_reply(nStatus, strReply);
93133
}
94134

95135
//This function checks username and password against -rpcauth
@@ -146,24 +186,25 @@ static bool RPCAuthorized(const std::string& strAuth, std::string& strAuthUserna
146186
return multiUserAuthorized(strUserPass);
147187
}
148188

149-
static bool HTTPReq_JSONRPC(const CoreContext& context, HTTPRequest* req, bool external = false)
189+
static bool HTTPReq_JSONRPC(const CoreContext& context, HTTPRequest* req)
150190
{
191+
RpcHttpRequest rpcRequest(req);
192+
151193
// JSONRPC handles only POST
152194
if (req->GetRequestMethod() != HTTPRequest::POST) {
153-
req->WriteReply(HTTP_BAD_METHOD, "JSONRPC server handles only POST requests");
154-
return false;
195+
return rpcRequest.send_reply(HTTP_BAD_METHOD, "JSONRPC server handles only POST requests");
155196
}
156197
// Check authorization
157198
std::pair<bool, std::string> authHeader = req->GetHeader("authorization");
158199
if (!authHeader.first) {
159200
req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA);
160-
req->WriteReply(HTTP_UNAUTHORIZED);
161-
return false;
201+
return rpcRequest.send_reply(HTTP_UNAUTHORIZED);
162202
}
163203

164204
JSONRPCRequest jreq(context);
205+
165206
jreq.peerAddr = req->GetPeer().ToString();
166-
if (!RPCAuthorized(authHeader.second, jreq.authUser)) {
207+
if (!RPCAuthorized(authHeader.second, rpcRequest.user)) {
167208
LogPrintf("ThreadRPCServer incorrect password attempt from %s\n", jreq.peerAddr);
168209

169210
/* Deter brute-forcing
@@ -172,9 +213,9 @@ static bool HTTPReq_JSONRPC(const CoreContext& context, HTTPRequest* req, bool e
172213
UninterruptibleSleep(std::chrono::milliseconds{250});
173214

174215
req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA);
175-
req->WriteReply(HTTP_UNAUTHORIZED);
176-
return false;
216+
return rpcRequest.send_reply(HTTP_UNAUTHORIZED);
177217
}
218+
jreq.authUser = rpcRequest.user;
178219

179220
try {
180221
// Parse request
@@ -189,16 +230,16 @@ static bool HTTPReq_JSONRPC(const CoreContext& context, HTTPRequest* req, bool e
189230
bool user_has_whitelist = g_rpc_whitelist.count(jreq.authUser);
190231
if (!user_has_whitelist && g_rpc_whitelist_default) {
191232
LogPrintf("RPC User %s not allowed to call any methods\n", jreq.authUser);
192-
req->WriteReply(HTTP_FORBIDDEN);
193-
return false;
233+
return rpcRequest.send_reply(HTTP_FORBIDDEN);
194234

195235
// singleton request
196236
} else if (valRequest.isObject()) {
197237
jreq.parse(valRequest);
198-
if (user_has_whitelist && !g_rpc_whitelist[jreq.authUser].count(jreq.strMethod)) {
238+
rpcRequest.command = jreq.strMethod;
239+
240+
if (user_has_whitelist && !whitelisted(jreq)) {
199241
LogPrintf("RPC User %s not allowed to call method %s\n", jreq.authUser, jreq.strMethod);
200-
req->WriteReply(HTTP_FORBIDDEN);
201-
return false;
242+
return rpcRequest.send_reply(HTTP_FORBIDDEN);
202243
}
203244
UniValue result = tableRPC.execute(jreq);
204245

@@ -215,10 +256,9 @@ static bool HTTPReq_JSONRPC(const CoreContext& context, HTTPRequest* req, bool e
215256
const UniValue& request = valRequest[reqIdx].get_obj();
216257
// Parse method
217258
std::string strMethod = find_value(request, "method").get_str();
218-
if (!g_rpc_whitelist[jreq.authUser].count(strMethod)) {
259+
if (!whitelisted(jreq)) {
219260
LogPrintf("RPC User %s not allowed to call method %s\n", jreq.authUser, strMethod);
220-
req->WriteReply(HTTP_FORBIDDEN);
221-
return false;
261+
return rpcRequest.send_reply(HTTP_FORBIDDEN);
222262
}
223263
}
224264
}
@@ -229,15 +269,13 @@ static bool HTTPReq_JSONRPC(const CoreContext& context, HTTPRequest* req, bool e
229269
throw JSONRPCError(RPC_PARSE_ERROR, "Top-level object parse error");
230270

231271
req->WriteHeader("Content-Type", "application/json");
232-
req->WriteReply(HTTP_OK, strReply);
272+
return rpcRequest.send_reply(HTTP_OK, strReply);
233273
} catch (const UniValue& objError) {
234-
JSONErrorReply(req, objError, jreq.id);
235-
return false;
274+
return JSONErrorReply(rpcRequest, objError, jreq.id);
236275
} catch (const std::exception& e) {
237-
JSONErrorReply(req, JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id);
238-
return false;
276+
return JSONErrorReply(rpcRequest, JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id);
239277
}
240-
return true;
278+
assert(false);
241279
}
242280

243281
static bool InitRPCAuthentication()

src/httpserver.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ static struct evhttp* eventHTTP = nullptr;
154154
static std::vector<CSubNet> rpc_allow_subnets;
155155
//! Work queue for handling longer requests off the event loop thread
156156
static std::unique_ptr<WorkQueue<HTTPClosure>> g_work_queue{nullptr};
157-
//! List of 'external' RPC users
158-
static std::vector<std::string> g_external_usernames;
157+
//! List of 'external' RPC users (global variable, used by httprpc)
158+
std::vector<std::string> g_external_usernames;
159159
//! Handlers for (sub)paths
160160
static std::vector<HTTPPathHandler> pathHandlers;
161161
//! Bound listening sockets

src/llmq/chainlocks.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <txmempool.h>
2020
#include <util/thread.h>
2121
#include <util/time.h>
22+
#include <util/underlying.h>
2223
#include <validation.h>
2324
#include <validationinterface.h>
2425

@@ -130,8 +131,8 @@ PeerMsgRet CChainLocksHandler::ProcessNewChainLock(const NodeId from, const llmq
130131
}
131132
}
132133

133-
if (!VerifyChainLock(clsig)) {
134-
LogPrint(BCLog::CHAINLOCKS, "CChainLocksHandler::%s -- invalid CLSIG (%s), peer=%d\n", __func__, clsig.ToString(), from);
134+
if (const auto ret = VerifyChainLock(clsig); ret != VerifyRecSigStatus::Valid) {
135+
LogPrint(BCLog::CHAINLOCKS, "CChainLocksHandler::%s -- invalid CLSIG (%s), status=%d peer=%d\n", __func__, clsig.ToString(), ToUnderlying(ret), from);
135136
if (from != -1) {
136137
return tl::unexpected{10};
137138
}
@@ -551,10 +552,12 @@ bool CChainLocksHandler::HasChainLock(int nHeight, const uint256& blockHash) con
551552
return InternalHasChainLock(nHeight, blockHash);
552553
}
553554

554-
bool CChainLocksHandler::VerifyChainLock(const CChainLockSig& clsig) const
555+
556+
VerifyRecSigStatus CChainLocksHandler::VerifyChainLock(const CChainLockSig& clsig) const
555557
{
556558
const auto llmqType = Params().GetConsensus().llmqTypeChainLocks;
557559
const uint256 nRequestId = ::SerializeHash(std::make_pair(llmq::CLSIG_REQUESTID_PREFIX, clsig.getHeight()));
560+
558561
return llmq::VerifyRecoveredSig(llmqType, m_chainstate.m_chain, qman, clsig.getHeight(), nRequestId, clsig.getBlockHash(), clsig.getSig());
559562
}
560563

src/llmq/chainlocks.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <crypto/common.h>
1111
#include <llmq/signing.h>
12+
#include <llmq/quorums.h>
1213
#include <net.h>
1314
#include <net_types.h>
1415
#include <primitives/block.h>
@@ -114,7 +115,7 @@ class CChainLocksHandler : public CRecoveredSigsListener
114115

115116
bool HasChainLock(int nHeight, const uint256& blockHash) const EXCLUSIVE_LOCKS_REQUIRED(!cs);
116117
bool HasConflictingChainLock(int nHeight, const uint256& blockHash) const EXCLUSIVE_LOCKS_REQUIRED(!cs);
117-
bool VerifyChainLock(const CChainLockSig& clsig) const;
118+
VerifyRecSigStatus VerifyChainLock(const CChainLockSig& clsig) const;
118119

119120
bool IsTxSafeForMining(const uint256& txid) const EXCLUSIVE_LOCKS_REQUIRED(!cs);
120121

src/llmq/quorums.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -1169,18 +1169,19 @@ CQuorumCPtr SelectQuorumForSigning(const Consensus::LLMQParams& llmq_params, con
11691169
}
11701170
}
11711171

1172-
bool VerifyRecoveredSig(Consensus::LLMQType llmqType, const CChain& active_chain, const CQuorumManager& qman,
1172+
VerifyRecSigStatus VerifyRecoveredSig(Consensus::LLMQType llmqType, const CChain& active_chain, const CQuorumManager& qman,
11731173
int signedAtHeight, const uint256& id, const uint256& msgHash, const CBLSSignature& sig,
11741174
const int signOffset)
11751175
{
11761176
const auto& llmq_params_opt = Params().GetLLMQ(llmqType);
11771177
assert(llmq_params_opt.has_value());
11781178
auto quorum = SelectQuorumForSigning(llmq_params_opt.value(), active_chain, qman, id, signedAtHeight, signOffset);
11791179
if (!quorum) {
1180-
return false;
1180+
return VerifyRecSigStatus::NoQuorum;
11811181
}
11821182

11831183
uint256 signHash = BuildSignHash(llmqType, quorum->qc->quorumHash, id, msgHash);
1184-
return sig.VerifyInsecure(quorum->qc->quorumPublicKey, signHash);
1184+
const bool ret = sig.VerifyInsecure(quorum->qc->quorumPublicKey, signHash);
1185+
return ret ? VerifyRecSigStatus::Valid : VerifyRecSigStatus::Invalid;
11851186
}
11861187
} // namespace llmq

src/llmq/quorums.h

+10-3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ using CDeterministicMNCPtr = std::shared_ptr<const CDeterministicMN>;
3636

3737
namespace llmq
3838
{
39+
enum class VerifyRecSigStatus
40+
{
41+
NoQuorum,
42+
Invalid,
43+
Valid,
44+
};
45+
3946
class CDKGSessionManager;
4047
class CQuorumBlockProcessor;
4148

@@ -298,9 +305,9 @@ CQuorumCPtr SelectQuorumForSigning(const Consensus::LLMQParams& llmq_params, con
298305
const uint256& selectionHash, int signHeight = -1 /*chain tip*/, int signOffset = SIGN_HEIGHT_OFFSET);
299306

300307
// Verifies a recovered sig that was signed while the chain tip was at signedAtTip
301-
bool VerifyRecoveredSig(Consensus::LLMQType llmqType, const CChain& active_chain, const CQuorumManager& qman,
302-
int signedAtHeight, const uint256& id, const uint256& msgHash, const CBLSSignature& sig,
303-
int signOffset = SIGN_HEIGHT_OFFSET);
308+
VerifyRecSigStatus VerifyRecoveredSig(Consensus::LLMQType llmqType, const CChain& active_chain, const CQuorumManager& qman,
309+
int signedAtHeight, const uint256& id, const uint256& msgHash, const CBLSSignature& sig,
310+
int signOffset = SIGN_HEIGHT_OFFSET);
304311
} // namespace llmq
305312

306313
template<typename T> struct SaltedHasherImpl;

src/llmq/signing.cpp

+24-24
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,30 @@ PeerMsgRet CSigningManager::ProcessMessage(const CNode& pfrom, const std::string
578578
return {};
579579
}
580580

581+
static bool PreVerifyRecoveredSig(const CQuorumManager& quorum_manager, const CRecoveredSig& recoveredSig, bool& retBan)
582+
{
583+
retBan = false;
584+
585+
auto llmqType = recoveredSig.getLlmqType();
586+
if (!Params().GetLLMQ(llmqType).has_value()) {
587+
retBan = true;
588+
return false;
589+
}
590+
591+
CQuorumCPtr quorum = quorum_manager.GetQuorum(llmqType, recoveredSig.getQuorumHash());
592+
593+
if (!quorum) {
594+
LogPrint(BCLog::LLMQ, "CSigningManager::%s -- quorum %s not found\n", __func__,
595+
recoveredSig.getQuorumHash().ToString());
596+
return false;
597+
}
598+
if (!IsQuorumActive(llmqType, quorum_manager, quorum->qc->quorumHash)) {
599+
return false;
600+
}
601+
602+
return true;
603+
}
604+
581605
PeerMsgRet CSigningManager::ProcessMessageRecoveredSig(const CNode& pfrom, const std::shared_ptr<const CRecoveredSig>& recoveredSig)
582606
{
583607
{
@@ -614,30 +638,6 @@ PeerMsgRet CSigningManager::ProcessMessageRecoveredSig(const CNode& pfrom, const
614638
return {};
615639
}
616640

617-
bool CSigningManager::PreVerifyRecoveredSig(const CQuorumManager& quorum_manager, const CRecoveredSig& recoveredSig, bool& retBan)
618-
{
619-
retBan = false;
620-
621-
auto llmqType = recoveredSig.getLlmqType();
622-
if (!Params().GetLLMQ(llmqType).has_value()) {
623-
retBan = true;
624-
return false;
625-
}
626-
627-
CQuorumCPtr quorum = quorum_manager.GetQuorum(llmqType, recoveredSig.getQuorumHash());
628-
629-
if (!quorum) {
630-
LogPrint(BCLog::LLMQ, "CSigningManager::%s -- quorum %s not found\n", __func__,
631-
recoveredSig.getQuorumHash().ToString());
632-
return false;
633-
}
634-
if (!IsQuorumActive(llmqType, quorum_manager, quorum->qc->quorumHash)) {
635-
return false;
636-
}
637-
638-
return true;
639-
}
640-
641641
void CSigningManager::CollectPendingRecoveredSigsToVerify(
642642
size_t maxUniqueSessions,
643643
std::unordered_map<NodeId, std::list<std::shared_ptr<const CRecoveredSig>>>& retSigShares,

src/llmq/signing.h

-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,6 @@ class CSigningManager
201201

202202
private:
203203
PeerMsgRet ProcessMessageRecoveredSig(const CNode& pfrom, const std::shared_ptr<const CRecoveredSig>& recoveredSig);
204-
static bool PreVerifyRecoveredSig(const CQuorumManager& quorum_manager, const CRecoveredSig& recoveredSig, bool& retBan);
205204

206205
void CollectPendingRecoveredSigsToVerify(size_t maxUniqueSessions,
207206
std::unordered_map<NodeId, std::list<std::shared_ptr<const CRecoveredSig>>>& retSigShares,

0 commit comments

Comments
 (0)