mirror of
https://github.com/dashpay/dash.git
synced 2024-12-24 19:42:46 +01:00
refactor: implement c++23 inspired ToUnderlying (#5210)
## Issue being fixed or feature implemented Avoid lots of static_cast's from enums to underlying types. Communicate intention better ## What was done? implement c++23 inspired ToUnderlying, then see std::to_underlying and https://en.cppreference.com/w/cpp/types/underlying_type; Then, we use this instead of static_casts for enums -> underlying type ## How Has This Been Tested? make check ## Breaking Changes None ## Checklist: - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation **For repository code-owners and collaborators only** - [x] I have assigned this pull request to a milestone --------- Co-authored-by: Konstantin Akimov <knstqq@gmail.com>
This commit is contained in:
parent
362e1db801
commit
0ee3974d1f
@ -310,6 +310,7 @@ BITCOIN_CORE_H = \
|
||||
util/message.h \
|
||||
util/moneystr.h \
|
||||
util/ranges.h \
|
||||
util/underlying.h \
|
||||
util/serfloat.h \
|
||||
util/settings.h \
|
||||
util/sock.h \
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <consensus/validation.h>
|
||||
#include <hash.h>
|
||||
#include <script/standard.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
maybe_error CProRegTx::IsTriviallyValid(bool is_bls_legacy_scheme) const
|
||||
{
|
||||
@ -80,7 +81,7 @@ std::string CProRegTx::ToString() const
|
||||
}
|
||||
|
||||
return strprintf("CProRegTx(nVersion=%d, nType=%d, collateralOutpoint=%s, addr=%s, nOperatorReward=%f, ownerAddress=%s, pubKeyOperator=%s, votingAddress=%s, scriptPayout=%s, platformNodeID=%s, platformP2PPort=%d, platformHTTPPort=%d)",
|
||||
nVersion, static_cast<int>(nType), collateralOutpoint.ToStringShort(), addr.ToString(), (double)nOperatorReward / 100, EncodeDestination(PKHash(keyIDOwner)), pubKeyOperator.ToString(nVersion == LEGACY_BLS_VERSION), EncodeDestination(PKHash(keyIDVoting)), payee, platformNodeID.ToString(), platformP2PPort, platformHTTPPort);
|
||||
nVersion, ToUnderlying(nType), collateralOutpoint.ToStringShort(), addr.ToString(), (double)nOperatorReward / 100, EncodeDestination(PKHash(keyIDOwner)), pubKeyOperator.ToString(nVersion == LEGACY_BLS_VERSION), EncodeDestination(PKHash(keyIDVoting)), payee, platformNodeID.ToString(), platformP2PPort, platformHTTPPort);
|
||||
}
|
||||
|
||||
maybe_error CProUpServTx::IsTriviallyValid(bool is_bls_legacy_scheme) const
|
||||
@ -101,7 +102,7 @@ std::string CProUpServTx::ToString() const
|
||||
}
|
||||
|
||||
return strprintf("CProUpServTx(nVersion=%d, nType=%d, proTxHash=%s, addr=%s, operatorPayoutAddress=%s, platformNodeID=%s, platformP2PPort=%d, platformHTTPPort=%d)",
|
||||
nVersion, static_cast<int>(nType), proTxHash.ToString(), addr.ToString(), payee, platformNodeID.ToString(), platformP2PPort, platformHTTPPort);
|
||||
nVersion, ToUnderlying(nType), proTxHash.ToString(), addr.ToString(), payee, platformNodeID.ToString(), platformP2PPort, platformHTTPPort);
|
||||
}
|
||||
|
||||
maybe_error CProUpRegTx::IsTriviallyValid(bool is_bls_legacy_scheme) const
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <pubkey.h>
|
||||
#include <tinyformat.h>
|
||||
#include <univalue.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
class CBlockIndex;
|
||||
class CCoinsViewCache;
|
||||
@ -92,7 +93,7 @@ public:
|
||||
obj.clear();
|
||||
obj.setObject();
|
||||
obj.pushKV("version", nVersion);
|
||||
obj.pushKV("type", static_cast<uint16_t>(nType));
|
||||
obj.pushKV("type", ToUnderlying(nType));
|
||||
obj.pushKV("collateralHash", collateralOutpoint.hash.ToString());
|
||||
obj.pushKV("collateralIndex", (int)collateralOutpoint.n);
|
||||
obj.pushKV("service", addr.ToString(false));
|
||||
@ -178,7 +179,7 @@ public:
|
||||
obj.clear();
|
||||
obj.setObject();
|
||||
obj.pushKV("version", nVersion);
|
||||
obj.pushKV("type", static_cast<uint16_t>(nType));
|
||||
obj.pushKV("type", ToUnderlying(nType));
|
||||
obj.pushKV("proTxHash", proTxHash.ToString());
|
||||
obj.pushKV("service", addr.ToString(false));
|
||||
CTxDestination dest;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <univalue.h>
|
||||
#include <validation.h>
|
||||
#include <key_io.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
CSimplifiedMNListEntry::CSimplifiedMNListEntry(const CDeterministicMN& dmn) :
|
||||
proRegTxHash(dmn.proTxHash),
|
||||
@ -57,7 +58,7 @@ std::string CSimplifiedMNListEntry::ToString() const
|
||||
}
|
||||
|
||||
return strprintf("CSimplifiedMNListEntry(nType=%d, proRegTxHash=%s, confirmedHash=%s, service=%s, pubKeyOperator=%s, votingAddress=%s, isValid=%d, payoutAddress=%s, operatorPayoutAddress=%s, platformHTTPPort=%d, platformNodeID=%s)",
|
||||
static_cast<int>(nType), proRegTxHash.ToString(), confirmedHash.ToString(), service.ToString(false), pubKeyOperator.Get().ToString(), EncodeDestination(PKHash(keyIDVoting)), isValid, payoutAddress, operatorPayoutAddress, platformHTTPPort, platformNodeID.ToString());
|
||||
ToUnderlying(nType), proRegTxHash.ToString(), confirmedHash.ToString(), service.ToString(false), pubKeyOperator.Get().ToString(), EncodeDestination(PKHash(keyIDVoting)), isValid, payoutAddress, operatorPayoutAddress, platformHTTPPort, platformNodeID.ToString());
|
||||
}
|
||||
|
||||
void CSimplifiedMNListEntry::ToJson(UniValue& obj, bool extended) const
|
||||
@ -71,7 +72,7 @@ void CSimplifiedMNListEntry::ToJson(UniValue& obj, bool extended) const
|
||||
obj.pushKV("votingAddress", EncodeDestination(PKHash(keyIDVoting)));
|
||||
obj.pushKV("isValid", isValid);
|
||||
obj.pushKV("nVersion", nVersion);
|
||||
obj.pushKV("nType", static_cast<uint16_t>(nType));
|
||||
obj.pushKV("nType", ToUnderlying(nType));
|
||||
if (nType == MnType::HighPerformance) {
|
||||
obj.pushKV("platformHTTPPort", platformHTTPPort);
|
||||
obj.pushKV("platformNodeID", platformNodeID.ToString());
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <saltedhasher.h>
|
||||
#include <sync.h>
|
||||
#include <util/irange.h>
|
||||
#include <util/underlying.h>
|
||||
#include <validation.h>
|
||||
|
||||
#include <map>
|
||||
@ -60,7 +61,7 @@ void CQuorumBlockProcessor::ProcessMessage(const CNode& peer, std::string_view m
|
||||
|
||||
if (!Params().HasLLMQ(qc.llmqType)) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s -- invalid commitment type %d from peer=%d\n", __func__,
|
||||
uint8_t(qc.llmqType), peer.GetId());
|
||||
ToUnderlying(qc.llmqType), peer.GetId());
|
||||
WITH_LOCK(cs_main, Misbehaving(peer.GetId(), 100));
|
||||
return;
|
||||
}
|
||||
@ -100,7 +101,7 @@ void CQuorumBlockProcessor::ProcessMessage(const CNode& peer, std::string_view m
|
||||
}
|
||||
if (HasMinedCommitment(type, qc.quorumHash)) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s -- commitment for quorum hash[%s], type[%d], quorumIndex[%d] is already mined, peer=%d\n",
|
||||
__func__, qc.quorumHash.ToString(), uint8_t(type), qc.quorumIndex, peer.GetId());
|
||||
__func__, qc.quorumHash.ToString(), ToUnderlying(type), qc.quorumIndex, peer.GetId());
|
||||
// NOTE: do not punish here
|
||||
return;
|
||||
}
|
||||
@ -123,13 +124,13 @@ void CQuorumBlockProcessor::ProcessMessage(const CNode& peer, std::string_view m
|
||||
if (!qc.Verify(pQuorumBaseBlockIndex, true)) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s -- commitment for quorum %s:%d is not valid quorumIndex[%d] nversion[%d], peer=%d\n",
|
||||
__func__, qc.quorumHash.ToString(),
|
||||
uint8_t(qc.llmqType), qc.quorumIndex, qc.nVersion, peer.GetId());
|
||||
ToUnderlying(qc.llmqType), qc.quorumIndex, qc.nVersion, peer.GetId());
|
||||
WITH_LOCK(cs_main, Misbehaving(peer.GetId(), 100));
|
||||
return;
|
||||
}
|
||||
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s -- received commitment for quorum %s:%d, validMembers=%d, signers=%d, peer=%d\n", __func__,
|
||||
qc.quorumHash.ToString(), uint8_t(qc.llmqType), qc.CountValidMembers(), qc.CountSigners(), peer.GetId());
|
||||
qc.quorumHash.ToString(), ToUnderlying(qc.llmqType), qc.CountValidMembers(), qc.CountSigners(), peer.GetId());
|
||||
|
||||
AddMineableCommitment(qc);
|
||||
}
|
||||
@ -184,7 +185,7 @@ bool CQuorumBlockProcessor::ProcessBlock(const CBlock& block, const CBlockIndex*
|
||||
for (const auto& p : qcs) {
|
||||
const auto& qc = p.second;
|
||||
if (!ProcessCommitment(pindex->nHeight, blockHash, qc, state, fJustCheck, fBLSChecks)) {
|
||||
LogPrintf("[ProcessBlock] failed h[%d] llmqType[%d] version[%d] quorumIndex[%d] quorumHash[%s]\n", pindex->nHeight, static_cast<int>(qc.llmqType), qc.nVersion, qc.quorumIndex, qc.quorumHash.ToString());
|
||||
LogPrintf("[ProcessBlock] failed h[%d] llmqType[%d] version[%d] quorumIndex[%d] quorumHash[%s]\n", pindex->nHeight, ToUnderlying(qc.llmqType), qc.nVersion, qc.quorumIndex, qc.quorumHash.ToString());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -217,7 +218,7 @@ bool CQuorumBlockProcessor::ProcessCommitment(int nHeight, const uint256& blockH
|
||||
uint256 quorumHash = GetQuorumBlockHash(llmq_params, nHeight, qc.quorumIndex);
|
||||
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s height=%d, type=%d, quorumIndex=%d, quorumHash=%s, signers=%s, validMembers=%d, quorumPublicKey=%s fJustCheck[%d] processing commitment from block.\n", __func__,
|
||||
nHeight, uint8_t(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString(), fJustCheck);
|
||||
nHeight, ToUnderlying(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString(), fJustCheck);
|
||||
|
||||
// skip `bad-qc-block` checks below when replaying blocks after the crash
|
||||
if (::ChainActive().Tip() == nullptr) {
|
||||
@ -226,19 +227,19 @@ bool CQuorumBlockProcessor::ProcessCommitment(int nHeight, const uint256& blockH
|
||||
|
||||
if (quorumHash.IsNull()) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s height=%d, type=%d, quorumIndex=%d, quorumHash=%s, signers=%s, validMembers=%d, quorumPublicKey=%s quorumHash is null.\n", __func__,
|
||||
nHeight, uint8_t(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString());
|
||||
nHeight, ToUnderlying(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString());
|
||||
return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "bad-qc-block");
|
||||
}
|
||||
if (quorumHash != qc.quorumHash) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s height=%d, type=%d, quorumIndex=%d, quorumHash=%s, qc.quorumHash=%s signers=%s, validMembers=%d, quorumPublicKey=%s non equal quorumHash.\n", __func__,
|
||||
nHeight, uint8_t(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString());
|
||||
nHeight, ToUnderlying(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString());
|
||||
return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "bad-qc-block");
|
||||
}
|
||||
|
||||
if (qc.IsNull()) {
|
||||
if (!qc.VerifyNull()) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s height=%d, type=%d, quorumIndex=%d, quorumHash=%s, signers=%s, validMembers=%dqc verifynull failed.\n", __func__,
|
||||
nHeight, uint8_t(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers());
|
||||
nHeight, ToUnderlying(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers());
|
||||
return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "bad-qc-invalid-null");
|
||||
}
|
||||
return true;
|
||||
@ -258,7 +259,7 @@ bool CQuorumBlockProcessor::ProcessCommitment(int nHeight, const uint256& blockH
|
||||
|
||||
if (!qc.Verify(pQuorumBaseBlockIndex, fBLSChecks)) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s height=%d, type=%d, quorumIndex=%d, quorumHash=%s, signers=%s, validMembers=%d, quorumPublicKey=%s qc verify failed.\n", __func__,
|
||||
nHeight, uint8_t(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString());
|
||||
nHeight, ToUnderlying(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString());
|
||||
return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "bad-qc-invalid");
|
||||
}
|
||||
|
||||
@ -291,7 +292,7 @@ bool CQuorumBlockProcessor::ProcessCommitment(int nHeight, const uint256& blockH
|
||||
}
|
||||
|
||||
LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s -- processed commitment from block. type=%d, quorumIndex=%d, quorumHash=%s, signers=%s, validMembers=%d, quorumPublicKey=%s\n", __func__,
|
||||
uint8_t(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString());
|
||||
ToUnderlying(qc.llmqType), qc.quorumIndex, quorumHash.ToString(), qc.CountSigners(), qc.CountValidMembers(), qc.quorumPublicKey.ToString());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -442,10 +443,10 @@ bool CQuorumBlockProcessor::IsMiningPhase(const Consensus::LLMQParams& llmqParam
|
||||
int quorumCycleMiningEndHeight = quorumCycleStartHeight + llmqParams.dkgMiningWindowEnd;
|
||||
|
||||
if (nHeight >= quorumCycleMiningStartHeight && nHeight <= quorumCycleMiningEndHeight) {
|
||||
LogPrint(BCLog::LLMQ, "[IsMiningPhase] nHeight[%d] llmqType[%d] quorumCycleStartHeight[%d] -- mining[%d-%d]\n", nHeight, int(llmqParams.type), quorumCycleStartHeight, quorumCycleMiningStartHeight, quorumCycleMiningEndHeight);
|
||||
LogPrint(BCLog::LLMQ, "[IsMiningPhase] nHeight[%d] llmqType[%d] quorumCycleStartHeight[%d] -- mining[%d-%d]\n", nHeight, ToUnderlying(llmqParams.type), quorumCycleStartHeight, quorumCycleMiningStartHeight, quorumCycleMiningEndHeight);
|
||||
return true;
|
||||
}
|
||||
LogPrint(BCLog::LLMQ, "[IsMiningPhase] nHeight[%d] llmqType[%d] quorumCycleStartHeight[%d] -- NOT mining[%d-%d]\n", nHeight, int(llmqParams.type), quorumCycleStartHeight, quorumCycleMiningStartHeight, quorumCycleMiningEndHeight);
|
||||
LogPrint(BCLog::LLMQ, "[IsMiningPhase] nHeight[%d] llmqType[%d] quorumCycleStartHeight[%d] -- NOT mining[%d-%d]\n", nHeight, ToUnderlying(llmqParams.type), quorumCycleStartHeight, quorumCycleMiningStartHeight, quorumCycleMiningEndHeight);
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -481,11 +482,11 @@ uint256 CQuorumBlockProcessor::GetQuorumBlockHash(const Consensus::LLMQParams& l
|
||||
|
||||
uint256 quorumBlockHash;
|
||||
if (!GetBlockHash(quorumBlockHash, quorumStartHeight)) {
|
||||
LogPrint(BCLog::LLMQ, "[GetQuorumBlockHash] llmqType[%d] h[%d] qi[%d] quorumStartHeight[%d] quorumHash[EMPTY]\n", int(llmqParams.type), nHeight, quorumIndex, quorumStartHeight);
|
||||
LogPrint(BCLog::LLMQ, "[GetQuorumBlockHash] llmqType[%d] h[%d] qi[%d] quorumStartHeight[%d] quorumHash[EMPTY]\n", ToUnderlying(llmqParams.type), nHeight, quorumIndex, quorumStartHeight);
|
||||
return {};
|
||||
}
|
||||
|
||||
LogPrint(BCLog::LLMQ, "[GetQuorumBlockHash] llmqType[%d] h[%d] qi[%d] quorumStartHeight[%d] quorumHash[%s]\n", int(llmqParams.type), nHeight, quorumIndex, quorumStartHeight, quorumBlockHash.ToString());
|
||||
LogPrint(BCLog::LLMQ, "[GetQuorumBlockHash] llmqType[%d] h[%d] qi[%d] quorumStartHeight[%d] quorumHash[%s]\n", ToUnderlying(llmqParams.type), nHeight, quorumIndex, quorumStartHeight, quorumBlockHash.ToString());
|
||||
return quorumBlockHash;
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <llmq/utils.h>
|
||||
#include <logging.h>
|
||||
#include <validation.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
namespace llmq
|
||||
{
|
||||
@ -46,7 +47,7 @@ bool CFinalCommitment::Verify(const CBlockIndex* pQuorumBaseBlockIndex, bool che
|
||||
}
|
||||
|
||||
if (!Params().HasLLMQ(llmqType)) {
|
||||
LogPrintfFinalCommitment("q[%s] invalid llmqType=%d\n", quorumHash.ToString(), static_cast<uint8_t>(llmqType));
|
||||
LogPrintfFinalCommitment("q[%s] invalid llmqType=%d\n", quorumHash.ToString(), ToUnderlying(llmqType));
|
||||
return false;
|
||||
}
|
||||
const auto& llmq_params = GetLLMQParams(llmqType);
|
||||
@ -149,7 +150,7 @@ bool CFinalCommitment::Verify(const CBlockIndex* pQuorumBaseBlockIndex, bool che
|
||||
bool CFinalCommitment::VerifyNull() const
|
||||
{
|
||||
if (!Params().HasLLMQ(llmqType)) {
|
||||
LogPrintfFinalCommitment("q[%s]invalid llmqType=%d\n", quorumHash.ToString(), static_cast<uint8_t>(llmqType));
|
||||
LogPrintfFinalCommitment("q[%s]invalid llmqType=%d\n", quorumHash.ToString(), ToUnderlying(llmqType));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <primitives/transaction.h>
|
||||
#include <util/irange.h>
|
||||
#include <util/strencodings.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
#include <univalue.h>
|
||||
|
||||
@ -114,7 +115,7 @@ public:
|
||||
{
|
||||
obj.setObject();
|
||||
obj.pushKV("version", int{nVersion});
|
||||
obj.pushKV("llmqType", int(llmqType));
|
||||
obj.pushKV("llmqType", ToUnderlying(llmqType));
|
||||
obj.pushKV("quorumHash", quorumHash.ToString());
|
||||
obj.pushKV("quorumIndex", quorumIndex);
|
||||
obj.pushKV("signersCount", CountSigners());
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <evo/deterministicmns.h>
|
||||
#include <llmq/utils.h>
|
||||
#include <util/irange.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
namespace llmq
|
||||
{
|
||||
@ -30,10 +31,10 @@ UniValue CDKGDebugSessionStatus::ToJson(int quorumIndex, int detailLevel) const
|
||||
}
|
||||
}
|
||||
|
||||
ret.pushKV("llmqType", static_cast<uint8_t>(llmqType));
|
||||
ret.pushKV("llmqType", ToUnderlying(llmqType));
|
||||
ret.pushKV("quorumHash", quorumHash.ToString());
|
||||
ret.pushKV("quorumHeight", (int)quorumHeight);
|
||||
ret.pushKV("phase", (int)phase);
|
||||
ret.pushKV("phase", ToUnderlying(phase));
|
||||
|
||||
ret.pushKV("sentContributions", sentContributions);
|
||||
ret.pushKV("sentComplaint", sentComplaint);
|
||||
@ -164,7 +165,7 @@ void CDKGDebugManager::InitLocalSessionStatus(const Consensus::LLMQParams& llmqP
|
||||
session.llmqType = llmqParams.type;
|
||||
session.quorumHash = quorumHash;
|
||||
session.quorumHeight = (uint32_t)quorumHeight;
|
||||
session.phase = 0;
|
||||
session.phase = QuorumPhase{0};
|
||||
session.statusBitset = 0;
|
||||
session.members.clear();
|
||||
session.members.resize((size_t)llmqParams.size);
|
||||
|
@ -12,6 +12,8 @@
|
||||
#include <functional>
|
||||
#include <set>
|
||||
|
||||
#include <llmq/dkgsessionhandler.h>
|
||||
|
||||
class CDataStream;
|
||||
class CInv;
|
||||
class CScheduler;
|
||||
@ -51,7 +53,7 @@ public:
|
||||
Consensus::LLMQType llmqType{Consensus::LLMQType::LLMQ_NONE};
|
||||
uint256 quorumHash;
|
||||
uint32_t quorumHeight{0};
|
||||
uint8_t phase{0};
|
||||
QuorumPhase phase{0};
|
||||
|
||||
union {
|
||||
struct
|
||||
|
@ -21,21 +21,22 @@
|
||||
#include <cxxtimer.hpp>
|
||||
#include <memory>
|
||||
#include <util/irange.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
namespace llmq
|
||||
{
|
||||
static std::array<std::atomic<double>, int(DKGError::type::_COUNT)> simDkgErrorMap{};
|
||||
static std::array<std::atomic<double>, ToUnderlying(DKGError::type::_COUNT)> simDkgErrorMap{};
|
||||
|
||||
void SetSimulatedDKGErrorRate(DKGError::type type, double rate)
|
||||
{
|
||||
if (int(type) >= DKGError::type::_COUNT) return;
|
||||
simDkgErrorMap[int(type)] = rate;
|
||||
if (type >= DKGError::type::_COUNT) return;
|
||||
simDkgErrorMap[ToUnderlying(type)] = rate;
|
||||
}
|
||||
|
||||
double GetSimulatedErrorRate(DKGError::type type)
|
||||
{
|
||||
if (int(type) >= DKGError::type::_COUNT) return 0;
|
||||
return simDkgErrorMap[int(type)];
|
||||
if (ToUnderlying(type) >= DKGError::type::_COUNT) return 0;
|
||||
return simDkgErrorMap[ToUnderlying(type)];
|
||||
}
|
||||
|
||||
bool CDKGSession::ShouldSimulateError(DKGError::type type) const
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
#include <llmq/commitment.h>
|
||||
#include <llmq/utils.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
#include <optional>
|
||||
|
||||
@ -42,7 +43,7 @@ public:
|
||||
template<typename Stream>
|
||||
inline void SerializeWithoutSig(Stream& s) const
|
||||
{
|
||||
s << uint8_t(llmqType);
|
||||
s << ToUnderlying(llmqType);
|
||||
s << quorumHash;
|
||||
s << proTxHash;
|
||||
s << *vvec;
|
||||
|
@ -16,10 +16,31 @@
|
||||
#include <chainparams.h>
|
||||
#include <net_processing.h>
|
||||
#include <validation.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
namespace llmq
|
||||
{
|
||||
|
||||
CDKGSessionHandler::CDKGSessionHandler(const Consensus::LLMQParams& _params, CBLSWorker& _blsWorker, CDKGSessionManager& _dkgManager,
|
||||
CDKGDebugManager& _dkgDebugManager, CQuorumBlockProcessor& _quorumBlockProcessor, CConnman& _connman, int _quorumIndex) :
|
||||
params(_params),
|
||||
connman(_connman),
|
||||
quorumIndex(_quorumIndex),
|
||||
blsWorker(_blsWorker),
|
||||
dkgManager(_dkgManager),
|
||||
dkgDebugManager(_dkgDebugManager),
|
||||
quorumBlockProcessor(_quorumBlockProcessor),
|
||||
curSession(std::make_unique<CDKGSession>(_params, _blsWorker, _dkgManager, _dkgDebugManager, _connman)),
|
||||
pendingContributions((size_t)_params.size * 2, MSG_QUORUM_CONTRIB), // we allow size*2 messages as we need to make sure we see bad behavior (double messages)
|
||||
pendingComplaints((size_t)_params.size * 2, MSG_QUORUM_COMPLAINT),
|
||||
pendingJustifications((size_t)_params.size * 2, MSG_QUORUM_JUSTIFICATION),
|
||||
pendingPrematureCommitments((size_t)_params.size * 2, MSG_QUORUM_PREMATURE_COMMITMENT)
|
||||
{
|
||||
if (params.type == Consensus::LLMQType::LLMQ_NONE) {
|
||||
throw std::runtime_error("Can't initialize CDKGSessionHandler with LLMQ_NONE type.");
|
||||
}
|
||||
}
|
||||
|
||||
void CDKGPendingMessages::PushPendingMessage(NodeId from, CDataStream& vRecv)
|
||||
{
|
||||
// this will also consume the data, even if we bail out early
|
||||
@ -99,12 +120,12 @@ void CDKGSessionHandler::UpdatedBlockTip(const CBlockIndex* pindexNew)
|
||||
bool fNewPhase = (quorumStageInt % params.dkgPhaseBlocks) == 0;
|
||||
int phaseInt = quorumStageInt / params.dkgPhaseBlocks + 1;
|
||||
QuorumPhase oldPhase = phase;
|
||||
if (fNewPhase && phaseInt >= int(QuorumPhase::Initialized) && phaseInt <= int(QuorumPhase::Idle)) {
|
||||
if (fNewPhase && phaseInt >= ToUnderlying(QuorumPhase::Initialized) && phaseInt <= ToUnderlying(QuorumPhase::Idle)) {
|
||||
phase = static_cast<QuorumPhase>(phaseInt);
|
||||
}
|
||||
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionHandler::%s -- %s qi[%d] currentHeight=%d, pQuorumBaseBlockIndex->nHeight=%d, oldPhase=%d, newPhase=%d\n", __func__,
|
||||
params.name, quorumIndex, currentHeight, pQuorumBaseBlockIndex->nHeight, int(oldPhase), int(phase));
|
||||
params.name, quorumIndex, currentHeight, pQuorumBaseBlockIndex->nHeight, ToUnderlying(oldPhase), ToUnderlying(phase));
|
||||
}
|
||||
|
||||
void CDKGSessionHandler::ProcessMessage(const CNode& pfrom, const std::string& msg_type, CDataStream& vRecv)
|
||||
@ -127,7 +148,7 @@ void CDKGSessionHandler::StartThread()
|
||||
throw std::runtime_error("Tried to start an already started CDKGSessionHandler thread.");
|
||||
}
|
||||
|
||||
std::string threadName = strprintf("llmq-%d-%d", (uint8_t)params.type, quorumIndex);
|
||||
std::string threadName = strprintf("llmq-%d-%d", ToUnderlying(params.type), quorumIndex);
|
||||
phaseHandlerThread = std::thread(&TraceThread<std::function<void()> >, threadName, std::function<void()>(std::bind(&CDKGSessionHandler::PhaseHandlerThread, this)));
|
||||
}
|
||||
|
||||
@ -171,7 +192,7 @@ void CDKGSessionHandler::WaitForNextPhase(std::optional<QuorumPhase> curPhase,
|
||||
const uint256& expectedQuorumHash,
|
||||
const WhileWaitFunc& shouldNotWait) const
|
||||
{
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - starting, curPhase=%d, nextPhase=%d\n", __func__, params.name, quorumIndex, curPhase.has_value() ? int(*curPhase) : -1, int(nextPhase));
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - starting, curPhase=%d, nextPhase=%d\n", __func__, params.name, quorumIndex, curPhase.has_value() ? ToUnderlying(*curPhase) : -1, ToUnderlying(nextPhase));
|
||||
|
||||
while (true) {
|
||||
if (stopRequested) {
|
||||
@ -187,7 +208,7 @@ void CDKGSessionHandler::WaitForNextPhase(std::optional<QuorumPhase> curPhase,
|
||||
break;
|
||||
}
|
||||
if (curPhase.has_value() && _phase != curPhase) {
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - aborting due unexpected phase change, _phase=%d, curPhase=%d\n", __func__, params.name, quorumIndex, int(_phase), curPhase.has_value() ? int(*curPhase) : -1);
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - aborting due unexpected phase change, _phase=%d, curPhase=%d\n", __func__, params.name, quorumIndex, ToUnderlying(_phase), curPhase.has_value() ? ToUnderlying(*curPhase) : -1);
|
||||
throw AbortPhaseException();
|
||||
}
|
||||
if (!shouldNotWait()) {
|
||||
@ -195,14 +216,14 @@ void CDKGSessionHandler::WaitForNextPhase(std::optional<QuorumPhase> curPhase,
|
||||
}
|
||||
}
|
||||
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - done, curPhase=%d, nextPhase=%d\n", __func__, params.name, quorumIndex, curPhase.has_value() ? int(*curPhase) : -1, int(nextPhase));
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - done, curPhase=%d, nextPhase=%d\n", __func__, params.name, quorumIndex, curPhase.has_value() ? ToUnderlying(*curPhase) : -1, ToUnderlying(nextPhase));
|
||||
|
||||
if (nextPhase == QuorumPhase::Initialized) {
|
||||
dkgDebugManager.ResetLocalSessionStatus(params.type, quorumIndex);
|
||||
} else {
|
||||
dkgDebugManager.UpdateLocalSessionStatus(params.type, quorumIndex, [&](CDKGDebugSessionStatus& status) {
|
||||
bool changed = status.phase != (uint8_t) nextPhase;
|
||||
status.phase = (uint8_t) nextPhase;
|
||||
bool changed = status.phase != nextPhase;
|
||||
status.phase = nextPhase;
|
||||
return changed;
|
||||
});
|
||||
}
|
||||
@ -260,7 +281,7 @@ void CDKGSessionHandler::SleepBeforePhase(QuorumPhase curPhase,
|
||||
int heightStart{-1};
|
||||
heightTmp = heightStart = WITH_LOCK(cs, return currentHeight);
|
||||
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - starting sleep for %d ms, curPhase=%d\n", __func__, params.name, quorumIndex, sleepTime, int(curPhase));
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - starting sleep for %d ms, curPhase=%d\n", __func__, params.name, quorumIndex, sleepTime, ToUnderlying(curPhase));
|
||||
|
||||
while (GetTimeMillis() < endTime) {
|
||||
if (stopRequested) {
|
||||
@ -289,7 +310,7 @@ void CDKGSessionHandler::SleepBeforePhase(QuorumPhase curPhase,
|
||||
}
|
||||
}
|
||||
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - done, curPhase=%d\n", __func__, params.name, quorumIndex, int(curPhase));
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - done, curPhase=%d\n", __func__, params.name, quorumIndex, ToUnderlying(curPhase));
|
||||
}
|
||||
|
||||
void CDKGSessionHandler::HandlePhase(QuorumPhase curPhase,
|
||||
@ -299,13 +320,13 @@ void CDKGSessionHandler::HandlePhase(QuorumPhase curPhase,
|
||||
const StartPhaseFunc& startPhaseFunc,
|
||||
const WhileWaitFunc& runWhileWaiting)
|
||||
{
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - starting, curPhase=%d, nextPhase=%d\n", __func__, params.name, quorumIndex, int(curPhase), int(nextPhase));
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - starting, curPhase=%d, nextPhase=%d\n", __func__, params.name, quorumIndex, ToUnderlying(curPhase), ToUnderlying(nextPhase));
|
||||
|
||||
SleepBeforePhase(curPhase, expectedQuorumHash, randomSleepFactor, runWhileWaiting);
|
||||
startPhaseFunc();
|
||||
WaitForNextPhase(curPhase, nextPhase, expectedQuorumHash, runWhileWaiting);
|
||||
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - done, curPhase=%d, nextPhase=%d\n", __func__, params.name, quorumIndex, int(curPhase), int(nextPhase));
|
||||
LogPrint(BCLog::LLMQ_DKG, "CDKGSessionManager::%s -- %s qi[%d] - done, curPhase=%d, nextPhase=%d\n", __func__, params.name, quorumIndex, ToUnderlying(curPhase), ToUnderlying(nextPhase));
|
||||
}
|
||||
|
||||
// returns a set of NodeIds which sent invalid messages
|
||||
@ -482,8 +503,8 @@ void CDKGSessionHandler::HandleDKGRound()
|
||||
}
|
||||
|
||||
dkgDebugManager.UpdateLocalSessionStatus(params.type, quorumIndex, [&](CDKGDebugSessionStatus& status) {
|
||||
bool changed = status.phase != (uint8_t) QuorumPhase::Initialized;
|
||||
status.phase = (uint8_t) QuorumPhase::Initialized;
|
||||
bool changed = status.phase != QuorumPhase::Initialized;
|
||||
status.phase = QuorumPhase::Initialized;
|
||||
return changed;
|
||||
});
|
||||
|
||||
|
@ -132,24 +132,7 @@ private:
|
||||
|
||||
public:
|
||||
CDKGSessionHandler(const Consensus::LLMQParams& _params, CBLSWorker& _blsWorker, CDKGSessionManager& _dkgManager,
|
||||
CDKGDebugManager& _dkgDebugManager, CQuorumBlockProcessor& _quorumBlockProcessor, CConnman& _connman, int _quorumIndex) :
|
||||
params(_params),
|
||||
connman(_connman),
|
||||
quorumIndex(_quorumIndex),
|
||||
blsWorker(_blsWorker),
|
||||
dkgManager(_dkgManager),
|
||||
dkgDebugManager(_dkgDebugManager),
|
||||
quorumBlockProcessor(_quorumBlockProcessor),
|
||||
curSession(std::make_unique<CDKGSession>(_params, _blsWorker, _dkgManager, _dkgDebugManager, _connman)),
|
||||
pendingContributions((size_t)_params.size * 2, MSG_QUORUM_CONTRIB), // we allow size*2 messages as we need to make sure we see bad behavior (double messages)
|
||||
pendingComplaints((size_t)_params.size * 2, MSG_QUORUM_COMPLAINT),
|
||||
pendingJustifications((size_t)_params.size * 2, MSG_QUORUM_JUSTIFICATION),
|
||||
pendingPrematureCommitments((size_t)_params.size * 2, MSG_QUORUM_PREMATURE_COMMITMENT)
|
||||
{
|
||||
if (params.type == Consensus::LLMQType::LLMQ_NONE) {
|
||||
throw std::runtime_error("Can't initialize CDKGSessionHandler with LLMQ_NONE type.");
|
||||
}
|
||||
}
|
||||
CDKGDebugManager& _dkgDebugManager, CQuorumBlockProcessor& _quorumBlockProcessor, CConnman& _connman, int _quorumIndex);
|
||||
~CDKGSessionHandler() = default;
|
||||
|
||||
void UpdatedBlockTip(const CBlockIndex *pindexNew);
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <net_processing.h>
|
||||
#include <spork.h>
|
||||
#include <util/irange.h>
|
||||
#include <util/underlying.h>
|
||||
#include <validation.h>
|
||||
|
||||
namespace llmq
|
||||
@ -198,7 +199,7 @@ void CDKGSessionManager::ProcessMessage(CNode& pfrom, const CQuorumManager& quor
|
||||
|
||||
if (!Params().HasLLMQ(llmqType)) {
|
||||
LOCK(cs_main);
|
||||
LogPrintf("CDKGSessionManager -- invalid llmqType [%d]\n", uint8_t(llmqType));
|
||||
LogPrintf("CDKGSessionManager -- invalid llmqType [%d]\n", ToUnderlying(llmqType));
|
||||
Misbehaving(pfrom.GetId(), 100);
|
||||
return;
|
||||
}
|
||||
@ -227,7 +228,7 @@ void CDKGSessionManager::ProcessMessage(CNode& pfrom, const CQuorumManager& quor
|
||||
|
||||
if (!utils::IsQuorumTypeEnabled(llmqType, quorum_manager, pQuorumBaseBlockIndex->pprev)) {
|
||||
LOCK(cs_main);
|
||||
LogPrintf("CDKGSessionManager -- llmqType [%d] quorums aren't active\n", uint8_t(llmqType));
|
||||
LogPrintf("CDKGSessionManager -- llmqType [%d] quorums aren't active\n", ToUnderlying(llmqType));
|
||||
Misbehaving(pfrom.GetId(), 100);
|
||||
return;
|
||||
}
|
||||
@ -464,7 +465,7 @@ void CDKGSessionManager::CleanupOldContributions() const
|
||||
// For how many blocks recent DKG info should be kept
|
||||
const int MAX_STORE_DEPTH = 2 * params.signingActiveQuorumCount * params.dkgInterval;
|
||||
|
||||
LogPrint(BCLog::LLMQ, "CDKGSessionManager::%s -- looking for old entries for llmq type %d\n", __func__, uint8_t(params.type));
|
||||
LogPrint(BCLog::LLMQ, "CDKGSessionManager::%s -- looking for old entries for llmq type %d\n", __func__, ToUnderlying(params.type));
|
||||
|
||||
CDBBatch batch(*db);
|
||||
size_t cnt_old{0}, cnt_all{0};
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <netmessagemaker.h>
|
||||
#include <univalue.h>
|
||||
#include <util/irange.h>
|
||||
#include <util/underlying.h>
|
||||
#include <validation.h>
|
||||
|
||||
#include <cxxtimer.hpp>
|
||||
@ -226,7 +227,7 @@ void CQuorumManager::TriggerQuorumDataRecoveryThreads(const CBlockIndex* pIndex)
|
||||
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- Process block %s\n", __func__, pIndex->GetBlockHash().ToString());
|
||||
|
||||
for (auto& params : Params().GetConsensus().llmqs) {
|
||||
for (const auto& params : Params().GetConsensus().llmqs) {
|
||||
const auto vecQuorums = ScanQuorums(params.type, pIndex, params.keepOldConnections);
|
||||
|
||||
// First check if we are member of any quorum of this type
|
||||
@ -257,7 +258,7 @@ void CQuorumManager::TriggerQuorumDataRecoveryThreads(const CBlockIndex* pIndex)
|
||||
|
||||
if (nDataMask == 0) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- No data needed from (%d, %s) at height %d\n",
|
||||
__func__, static_cast<uint8_t>(pQuorum->qc->llmqType), pQuorum->qc->quorumHash.ToString(), pIndex->nHeight);
|
||||
__func__, ToUnderlying(pQuorum->qc->llmqType), pQuorum->qc->quorumHash.ToString(), pIndex->nHeight);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -312,12 +313,12 @@ void CQuorumManager::CheckQuorumConnections(const Consensus::LLMQParams& llmqPar
|
||||
connmanQuorumsToDelete.erase(curDkgBlock);
|
||||
}
|
||||
}
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] keeping mn quorum connections for rotated quorums: [%s]\n", __func__, int(llmqParams.type), pindexNew->nHeight, ss.str());
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] keeping mn quorum connections for rotated quorums: [%s]\n", __func__, ToUnderlying(llmqParams.type), pindexNew->nHeight, ss.str());
|
||||
} else {
|
||||
int curDkgHeight = pindexNew->nHeight - (pindexNew->nHeight % llmqParams.dkgInterval);
|
||||
auto curDkgBlock = pindexNew->GetAncestor(curDkgHeight)->GetBlockHash();
|
||||
connmanQuorumsToDelete.erase(curDkgBlock);
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] keeping mn quorum connections for quorum: [%d:%s]\n", __func__, int(llmqParams.type), pindexNew->nHeight, curDkgHeight, curDkgBlock.ToString());
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] keeping mn quorum connections for quorum: [%d:%s]\n", __func__, ToUnderlying(llmqParams.type), pindexNew->nHeight, curDkgHeight, curDkgBlock.ToString());
|
||||
}
|
||||
|
||||
const auto myProTxHash = WITH_LOCK(activeMasternodeInfoCs, return activeMasternodeInfo.proTxHash);
|
||||
@ -332,7 +333,7 @@ void CQuorumManager::CheckQuorumConnections(const Consensus::LLMQParams& llmqPar
|
||||
for (const auto& quorum : lastQuorums) {
|
||||
if (utils::EnsureQuorumConnections(llmqParams, quorum->m_quorum_base_block_index, connman, myProTxHash)) {
|
||||
if (connmanQuorumsToDelete.erase(quorum->qc->quorumHash) > 0) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] keeping mn quorum connections for quorum: [%d:%s]\n", __func__, int(llmqParams.type), pindexNew->nHeight, quorum->m_quorum_base_block_index->nHeight, quorum->m_quorum_base_block_index->GetBlockHash().ToString());
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] keeping mn quorum connections for quorum: [%d:%s]\n", __func__, ToUnderlying(llmqParams.type), pindexNew->nHeight, quorum->m_quorum_base_block_index->nHeight, quorum->m_quorum_base_block_index->GetBlockHash().ToString());
|
||||
}
|
||||
} else if (watchOtherISQuorums && !quorum->IsMember(myProTxHash)) {
|
||||
std::set<uint256> connections;
|
||||
@ -342,12 +343,12 @@ void CQuorumManager::CheckQuorumConnections(const Consensus::LLMQParams& llmqPar
|
||||
}
|
||||
if (!connections.empty()) {
|
||||
if (!connman.HasMasternodeQuorumNodes(llmqParams.type, quorum->m_quorum_base_block_index->GetBlockHash())) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] adding mn inter-quorum connections for quorum: [%d:%s]\n", __func__, int(llmqParams.type), pindexNew->nHeight, quorum->m_quorum_base_block_index->nHeight, quorum->m_quorum_base_block_index->GetBlockHash().ToString());
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] adding mn inter-quorum connections for quorum: [%d:%s]\n", __func__, ToUnderlying(llmqParams.type), pindexNew->nHeight, quorum->m_quorum_base_block_index->nHeight, quorum->m_quorum_base_block_index->GetBlockHash().ToString());
|
||||
connman.SetMasternodeQuorumNodes(llmqParams.type, quorum->m_quorum_base_block_index->GetBlockHash(), connections);
|
||||
connman.SetMasternodeQuorumRelayMembers(llmqParams.type, quorum->m_quorum_base_block_index->GetBlockHash(), connections);
|
||||
}
|
||||
if (connmanQuorumsToDelete.erase(quorum->qc->quorumHash) > 0) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] keeping mn inter-quorum connections for quorum: [%d:%s]\n", __func__, int(llmqParams.type), pindexNew->nHeight, quorum->m_quorum_base_block_index->nHeight, quorum->m_quorum_base_block_index->GetBlockHash().ToString());
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] h[%d] keeping mn inter-quorum connections for quorum: [%d:%s]\n", __func__, ToUnderlying(llmqParams.type), pindexNew->nHeight, quorum->m_quorum_base_block_index->nHeight, quorum->m_quorum_base_block_index->GetBlockHash().ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -367,7 +368,7 @@ CQuorumPtr CQuorumManager::BuildQuorumFromCommitment(const Consensus::LLMQType l
|
||||
uint256 minedBlockHash;
|
||||
CFinalCommitmentPtr qc = quorumBlockProcessor.GetMinedCommitment(llmqType, quorumHash, minedBlockHash);
|
||||
if (qc == nullptr) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- No mined commitment for llmqType[%d] nHeight[%d] quorumHash[%s]\n", __func__, uint8_t(llmqType), pQuorumBaseBlockIndex->nHeight, pQuorumBaseBlockIndex->GetBlockHash().ToString());
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- No mined commitment for llmqType[%d] nHeight[%d] quorumHash[%s]\n", __func__, ToUnderlying(llmqType), pQuorumBaseBlockIndex->nHeight, pQuorumBaseBlockIndex->GetBlockHash().ToString());
|
||||
return nullptr;
|
||||
}
|
||||
assert(qc->quorumHash == pQuorumBaseBlockIndex->GetBlockHash());
|
||||
@ -385,7 +386,7 @@ CQuorumPtr CQuorumManager::BuildQuorumFromCommitment(const Consensus::LLMQType l
|
||||
quorum->WriteContributions(m_evoDb);
|
||||
hasValidVvec = true;
|
||||
} else {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] quorumIndex[%d] quorum.ReadContributions and BuildQuorumContributions for quorumHash[%s] failed\n", __func__, uint8_t(llmqType), quorum->qc->quorumIndex, quorum->qc->quorumHash.ToString());
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- llmqType[%d] quorumIndex[%d] quorum.ReadContributions and BuildQuorumContributions for quorumHash[%s] failed\n", __func__, ToUnderlying(llmqType), quorum->qc->quorumIndex, quorum->qc->quorumHash.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
@ -452,7 +453,7 @@ bool CQuorumManager::RequestQuorumData(CNode* pfrom, Consensus::LLMQType llmqTyp
|
||||
return false;
|
||||
}
|
||||
if (!Params().HasLLMQ(llmqType)) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- Invalid llmqType: %d\n", __func__, static_cast<uint8_t>(llmqType));
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- Invalid llmqType: %d\n", __func__, ToUnderlying(llmqType));
|
||||
return false;
|
||||
}
|
||||
if (pQuorumBaseBlockIndex == nullptr) {
|
||||
@ -460,7 +461,7 @@ bool CQuorumManager::RequestQuorumData(CNode* pfrom, Consensus::LLMQType llmqTyp
|
||||
return false;
|
||||
}
|
||||
if (GetQuorum(llmqType, pQuorumBaseBlockIndex) == nullptr) {
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- Quorum not found: %s, %d\n", __func__, pQuorumBaseBlockIndex->GetBlockHash().ToString(), static_cast<uint8_t>(llmqType));
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- Quorum not found: %s, %d\n", __func__, pQuorumBaseBlockIndex->GetBlockHash().ToString(), ToUnderlying(llmqType));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -841,7 +842,7 @@ void CQuorumManager::StartQuorumDataRecoveryThread(const CQuorumCPtr pQuorum, co
|
||||
auto printLog = [&](const std::string& strMessage) {
|
||||
const std::string strMember{pCurrentMemberHash == nullptr ? "nullptr" : pCurrentMemberHash->ToString()};
|
||||
LogPrint(BCLog::LLMQ, "CQuorumManager::StartQuorumDataRecoveryThread -- %s - for llmqType %d, quorumHash %s, nDataMask (%d/%d), pCurrentMemberHash %s, nTries %d\n",
|
||||
strMessage, static_cast<uint8_t>(pQuorum->qc->llmqType), pQuorum->qc->quorumHash.ToString(), nDataMask, nDataMaskIn, strMember, nTries);
|
||||
strMessage, ToUnderlying(pQuorum->qc->llmqType), pQuorum->qc->quorumHash.ToString(), nDataMask, nDataMaskIn, strMember, nTries);
|
||||
};
|
||||
printLog("Start");
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <netmessagemaker.h>
|
||||
#include <scheduler.h>
|
||||
#include <util/irange.h>
|
||||
#include <util/underlying.h>
|
||||
#include <validation.h>
|
||||
|
||||
#include <algorithm>
|
||||
@ -27,7 +28,7 @@ namespace llmq
|
||||
UniValue CRecoveredSig::ToJson() const
|
||||
{
|
||||
UniValue ret(UniValue::VOBJ);
|
||||
ret.pushKV("llmqType", (int)llmqType);
|
||||
ret.pushKV("llmqType", ToUnderlying(llmqType));
|
||||
ret.pushKV("quorumHash", quorumHash.ToString());
|
||||
ret.pushKV("id", id.ToString());
|
||||
ret.pushKV("msgHash", msgHash.ToString());
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <netmessagemaker.h>
|
||||
#include <spork.h>
|
||||
#include <util/irange.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
#include <cxxtimer.hpp>
|
||||
|
||||
@ -31,7 +32,7 @@ void CSigShare::UpdateKey()
|
||||
std::string CSigSesAnn::ToString() const
|
||||
{
|
||||
return strprintf("sessionId=%d, llmqType=%d, quorumHash=%s, id=%s, msgHash=%s",
|
||||
sessionId, static_cast<uint8_t>(getLlmqType()), getQuorumHash().ToString(), getId().ToString(), getMsgHash().ToString());
|
||||
sessionId, ToUnderlying(getLlmqType()), getQuorumHash().ToString(), getId().ToString(), getMsgHash().ToString());
|
||||
}
|
||||
|
||||
void CSigSharesInv::Merge(const CSigSharesInv& inv2)
|
||||
@ -1516,7 +1517,7 @@ std::optional<CSigShare> CSigSharesManager::CreateSigShare(const CQuorumCPtr& qu
|
||||
sigShare.UpdateKey();
|
||||
|
||||
LogPrint(BCLog::LLMQ_SIGS, "CSigSharesManager::%s -- created sigShare. signHash=%s, id=%s, msgHash=%s, llmqType=%d, quorum=%s, time=%s\n", __func__,
|
||||
signHash.ToString(), sigShare.getId().ToString(), sigShare.getMsgHash().ToString(), static_cast<uint8_t>(quorum->params.type), quorum->qc->quorumHash.ToString(), t.count());
|
||||
signHash.ToString(), sigShare.getId().ToString(), sigShare.getMsgHash().ToString(), ToUnderlying(quorum->params.type), quorum->qc->quorumHash.ToString(), t.count());
|
||||
|
||||
return sigShare;
|
||||
}
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <timedata.h>
|
||||
#include <util/irange.h>
|
||||
#include <util/ranges.h>
|
||||
#include <util/underlying.h>
|
||||
#include <validation.h>
|
||||
#include <versionbits.h>
|
||||
|
||||
@ -148,7 +149,7 @@ std::vector<std::vector<CDeterministicMNCPtr>> ComputeQuorumMembersByQuarterRota
|
||||
LOCK(deterministicMNManager->cs);
|
||||
const CBlockIndex* pWorkBlockIndex = pCycleQuorumBaseBlockIndex->GetAncestor(pCycleQuorumBaseBlockIndex->nHeight - 8);
|
||||
auto allMns = deterministicMNManager->GetListForBlock(pWorkBlockIndex);
|
||||
LogPrint(BCLog::LLMQ, "ComputeQuorumMembersByQuarterRotation llmqType[%d] nHeight[%d] allMns[%d]\n", static_cast<int>(llmqType), pCycleQuorumBaseBlockIndex->nHeight, allMns.GetValidMNsCount());
|
||||
LogPrint(BCLog::LLMQ, "ComputeQuorumMembersByQuarterRotation llmqType[%d] nHeight[%d] allMns[%d]\n", ToUnderlying(llmqType), pCycleQuorumBaseBlockIndex->nHeight, allMns.GetValidMNsCount());
|
||||
|
||||
PreviousQuorumQuarters previousQuarters = GetPreviousQuorumQuarterMembers(llmqParams, pBlockHMinusCIndex, pBlockHMinus2CIndex, pBlockHMinus3CIndex, pCycleQuorumBaseBlockIndex->nHeight);
|
||||
|
||||
@ -952,7 +953,7 @@ bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, const CQuorumMana
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw std::runtime_error(strprintf("%s: Unknown LLMQ type %d", __func__, static_cast<uint8_t>(llmqType)));
|
||||
throw std::runtime_error(strprintf("%s: Unknown LLMQ type %d", __func__, ToUnderlying(llmqType)));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <validation.h> // for DEFAULT_SCRIPTCHECK_THREADS and MAX_SCRIPTCHECK_THREADS
|
||||
#include <netbase.h>
|
||||
#include <txdb.h> // for -dbcache defaults
|
||||
#include <util/underlying.h>
|
||||
|
||||
#include <QButtonGroup>
|
||||
#include <QDataWidgetMapper>
|
||||
@ -291,7 +292,7 @@ void OptionsDialog::setModel(OptionsModel *_model)
|
||||
|
||||
void OptionsDialog::setCurrentTab(OptionsDialog::Tab tab)
|
||||
{
|
||||
showPage(int(tab));
|
||||
showPage(ToUnderlying(tab));
|
||||
}
|
||||
|
||||
void OptionsDialog::setMapper()
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <rpc/client.h>
|
||||
#include <util/strencodings.h>
|
||||
#include <util/system.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
#include <univalue.h>
|
||||
|
||||
@ -519,7 +520,7 @@ RPCConsole::RPCConsole(interfaces::Node& node, QWidget* parent, Qt::WindowFlags
|
||||
pageButtons->addButton(ui->btnRepair, pageButtons->buttons().size());
|
||||
connect(pageButtons, QOverload<int>::of(&QButtonGroup::buttonClicked), this, &RPCConsole::showPage);
|
||||
|
||||
showPage(int(TabTypes::INFO));
|
||||
showPage(ToUnderlying(TabTypes::INFO));
|
||||
|
||||
reloadThemedWidgets();
|
||||
}
|
||||
@ -1412,12 +1413,12 @@ void RPCConsole::showOrHideBanTableIfRequired()
|
||||
|
||||
void RPCConsole::setTabFocus(enum TabTypes tabType)
|
||||
{
|
||||
showPage(int(tabType));
|
||||
showPage(ToUnderlying(tabType));
|
||||
}
|
||||
|
||||
QString RPCConsole::tabTitle(TabTypes tab_type) const
|
||||
{
|
||||
return pageButtons->button(int(tab_type))->text();
|
||||
return pageButtons->button(ToUnderlying(tab_type))->text();
|
||||
}
|
||||
|
||||
QKeySequence RPCConsole::tabShortcut(TabTypes tab_type) const
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include <llmq/dkgsession.h>
|
||||
#include <util/irange.h>
|
||||
#include <util/underlying.h>
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
@ -12,7 +13,7 @@ BOOST_AUTO_TEST_SUITE(llmq_dkg_tests)
|
||||
BOOST_AUTO_TEST_CASE(llmq_dkgerror)
|
||||
{
|
||||
using namespace llmq;
|
||||
for (auto i : irange::range(int(llmq::DKGError::type::_COUNT))) {
|
||||
for (auto i : irange::range(ToUnderlying(llmq::DKGError::type::_COUNT))) {
|
||||
BOOST_ASSERT(GetSimulatedErrorRate(llmq::DKGError::type(i)) == 0.0);
|
||||
SetSimulatedDKGErrorRate(llmq::DKGError::type(i), 1.0);
|
||||
BOOST_ASSERT(GetSimulatedErrorRate(llmq::DKGError::type(i)) == 1.0);
|
||||
|
14
src/util/underlying.h
Normal file
14
src/util/underlying.h
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright (c) 2023 The Dash Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_UTIL_UNDERLYING_H
|
||||
#define BITCOIN_UTIL_UNDERLYING_H
|
||||
#include <type_traits>
|
||||
|
||||
template <typename E>
|
||||
[[nodiscard]] inline constexpr typename std::underlying_type<E>::type ToUnderlying(E e) noexcept {
|
||||
return static_cast<typename std::underlying_type<E>::type>(e);
|
||||
}
|
||||
|
||||
#endif //BITCOIN_UTIL_UNDERLYING_H
|
@ -89,6 +89,8 @@ EXPECTED_CIRCULAR_DEPENDENCIES=(
|
||||
"llmq/snapshot -> llmq/utils -> llmq/snapshot"
|
||||
"spork -> validation -> spork"
|
||||
"governance/governance -> validation -> governance/governance"
|
||||
"llmq/debug -> llmq/dkgsessionhandler -> llmq/debug"
|
||||
"llmq/debug -> llmq/dkgsessionhandler -> llmq/dkgsession -> llmq/debug"
|
||||
)
|
||||
|
||||
EXIT_CODE=0
|
||||
|
Loading…
Reference in New Issue
Block a user