Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/evo/cbtx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ auto CachedGetQcHashesQcIndexedHashes(const CBlockIndex* pindexPrev, const llmq:
qcHashes_cached.clear();
qcIndexedHashes_cached.clear();
if (qc_hashes_cached.empty()) {
llmq::utils::InitQuorumsCache(qc_hashes_cached);
llmq::utils::InitQuorumsCache(qc_hashes_cached, Params().GetConsensus());
}

for (const auto& [llmqType, vecBlockIndexes] : quorums) {
Expand Down
7 changes: 4 additions & 3 deletions src/evo/specialtxman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ static bool CheckSpecialTxInner(CDeterministicMNManager& dmnman, llmq::CQuorumSn
}
}
case TRANSACTION_QUORUM_COMMITMENT:
return llmq::CheckLLMQCommitment(dmnman, qsnapman, chainman, tx, pindexPrev, state);
return llmq::CheckLLMQCommitment({dmnman, qsnapman, chainman, pindexPrev}, tx, state);
case TRANSACTION_MNHF_SIGNAL:
return CheckMNHFTx(chainman, qman, tx, pindexPrev, state);
case TRANSACTION_ASSET_LOCK:
Expand Down Expand Up @@ -442,8 +442,9 @@ bool CSpecialTxProcessor::RebuildListFromBlock(const CBlock& block, gsl::not_nul

// The commitment has already been validated at this point, so it's safe to use members of it

const auto members = llmq::utils::GetAllQuorumMembers(opt_qc->commitment.llmqType, m_dmnman, m_qsnapman,
m_chainman, pQuorumBaseBlockIndex);
const auto members = llmq::utils::GetAllQuorumMembers(opt_qc->commitment.llmqType,
{m_dmnman, m_qsnapman, m_chainman,
pQuorumBaseBlockIndex});
HandleQuorumCommitment(opt_qc->commitment, members, debugLogs, newList);
}
}
Expand Down
10 changes: 5 additions & 5 deletions src/llmq/blockprocessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ static void PreComputeQuorumMembers(CDeterministicMNManager& dmnman, llmq::CQuor
{
for (const Consensus::LLMQParams& params : llmq::GetEnabledQuorumParams(chainman, pindex->pprev)) {
if (llmq::IsQuorumRotationEnabled(params, pindex) && (pindex->nHeight % params.dkgInterval == 0)) {
llmq::utils::GetAllQuorumMembers(params.type, dmnman, qsnapman, chainman, pindex, reset_cache);
llmq::utils::GetAllQuorumMembers(params.type, {dmnman, qsnapman, chainman, pindex}, reset_cache);
}
}
}
Expand All @@ -52,7 +52,7 @@ CQuorumBlockProcessor::CQuorumBlockProcessor(CChainState& chainstate, CDetermini
m_evoDb{evoDb},
m_qsnapman{qsnapman}
{
utils::InitQuorumsCache(mapHasMinedCommitmentCache);
utils::InitQuorumsCache(mapHasMinedCommitmentCache, m_chainstate.m_chainman.GetConsensus());
LogPrintf("BLS verification uses %d additional threads\n", bls_threads);
m_bls_queue.StartWorkerThreads(bls_threads);
}
Expand Down Expand Up @@ -145,7 +145,7 @@ MessageProcessingResult CQuorumBlockProcessor::ProcessMessage(const CNode& peer,
}
}

if (!qc.Verify(m_dmnman, m_qsnapman, m_chainstate.m_chainman, pQuorumBaseBlockIndex, /*checkSigs=*/true)) {
if (!qc.Verify({m_dmnman, m_qsnapman, m_chainstate.m_chainman, pQuorumBaseBlockIndex}, /*checkSigs=*/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(),
ToUnderlying(qc.llmqType), qc.quorumIndex, qc.nVersion, peer.GetId());
Expand Down Expand Up @@ -215,7 +215,7 @@ bool CQuorumBlockProcessor::ProcessBlock(const CBlock& block, gsl::not_null<cons
pindex->nHeight, qc.quorumHash.ToString());
return false;
}
qc.VerifySignatureAsync(m_dmnman, m_qsnapman, m_chainstate.m_chainman, pQuorumBaseBlockIndex, &queue_control);
qc.VerifySignatureAsync({m_dmnman, m_qsnapman, m_chainstate.m_chainman, pQuorumBaseBlockIndex}, &queue_control);
}

if (!queue_control.Wait()) {
Expand Down Expand Up @@ -337,7 +337,7 @@ bool CQuorumBlockProcessor::ProcessCommitment(int nHeight, const uint256& blockH
}

// we don't validate signatures here; they already validated on previous step
if (!qc.Verify(m_dmnman, m_qsnapman, m_chainstate.m_chainman, pQuorumBaseBlockIndex, /*checksigs=*/false)) {
if (!qc.Verify({m_dmnman, m_qsnapman, m_chainstate.m_chainman, pQuorumBaseBlockIndex}, /*checksigs=*/false)) {
LogPrint(BCLog::LLMQ, /* Continued */
"%s -- height=%d, type=%d, quorumIndex=%d, quorumHash=%s, signers=%s, validMembers=%d, "
"quorumPublicKey=%s qc verify failed.\n",
Expand Down
58 changes: 30 additions & 28 deletions src/llmq/commitment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,10 @@ CFinalCommitment::CFinalCommitment(const Consensus::LLMQParams& params, const ui
{
}

bool CFinalCommitment::VerifySignatureAsync(CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman,
const ChainstateManager& chainman,
gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex,
bool CFinalCommitment::VerifySignatureAsync(const llmq::UtilParameters& util_params,
CCheckQueueControl<utils::BlsCheck>* queue_control) const
{
auto members = utils::GetAllQuorumMembers(llmqType, dmnman, qsnapman, chainman, pQuorumBaseBlockIndex);
auto members = utils::GetAllQuorumMembers(llmqType, util_params);
const auto& llmq_params_opt = Params().GetLLMQ(llmqType);
if (!llmq_params_opt.has_value()) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- q[%s] invalid llmqType=%d\n", quorumHash.ToString(),
Expand Down Expand Up @@ -96,9 +94,7 @@ bool CFinalCommitment::VerifySignatureAsync(CDeterministicMNManager& dmnman, CQu
}


bool CFinalCommitment::Verify(CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman,
const ChainstateManager& chainman,
gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex, bool checkSigs) const
bool CFinalCommitment::Verify(const llmq::UtilParameters& util_params, bool checkSigs) const
{
const auto& llmq_params_opt = Params().GetLLMQ(llmqType);
if (!llmq_params_opt.has_value()) {
Expand All @@ -107,19 +103,21 @@ bool CFinalCommitment::Verify(CDeterministicMNManager& dmnman, CQuorumSnapshotMa
}
const auto& llmq_params = llmq_params_opt.value();

const uint16_t expected_nversion{CFinalCommitment::GetVersion(IsQuorumRotationEnabled(llmq_params, pQuorumBaseBlockIndex),
DeploymentActiveAfter(pQuorumBaseBlockIndex, chainman.GetConsensus(), Consensus::DEPLOYMENT_V19))};
const uint16_t expected_nversion{
CFinalCommitment::GetVersion(IsQuorumRotationEnabled(llmq_params, util_params.m_base_index),
DeploymentActiveAfter(util_params.m_base_index, util_params.m_chainman.GetConsensus(),
Consensus::DEPLOYMENT_V19))};
if (nVersion == 0 || nVersion != expected_nversion) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- q[%s] invalid nVersion=%d expected=%d\n", quorumHash.ToString(), nVersion, expected_nversion);
return false;
}

if (pQuorumBaseBlockIndex->GetBlockHash() != quorumHash) {
if (util_params.m_base_index->GetBlockHash() != quorumHash) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- q[%s] invalid quorumHash\n", quorumHash.ToString());
return false;
}

if ((pQuorumBaseBlockIndex->nHeight % llmq_params.dkgInterval) != quorumIndex) {
if ((util_params.m_base_index->nHeight % llmq_params.dkgInterval) != quorumIndex) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- q[%s] invalid quorumIndex=%d\n", quorumHash.ToString(), quorumIndex);
return false;
}
Expand Down Expand Up @@ -152,7 +150,7 @@ bool CFinalCommitment::Verify(CDeterministicMNManager& dmnman, CQuorumSnapshotMa
LogPrint(BCLog::LLMQ, "CFinalCommitment -- q[%s] invalid vvecSig\n", quorumHash.ToString());
return false;
}
auto members = utils::GetAllQuorumMembers(llmqType, dmnman, qsnapman, chainman, pQuorumBaseBlockIndex);
auto members = utils::GetAllQuorumMembers(llmqType, util_params);
if (LogAcceptDebug(BCLog::LLMQ)) {
std::stringstream ss;
std::stringstream ss2;
Expand All @@ -176,7 +174,7 @@ bool CFinalCommitment::Verify(CDeterministicMNManager& dmnman, CQuorumSnapshotMa

// sigs are only checked when the block is processed
if (checkSigs) {
if (!VerifySignatureAsync(dmnman, qsnapman, chainman, pQuorumBaseBlockIndex, nullptr)) {
if (!VerifySignatureAsync(util_params, /*queue_control=*/nullptr)) {
return false;
}
}
Expand Down Expand Up @@ -215,20 +213,20 @@ bool CFinalCommitment::VerifySizes(const Consensus::LLMQParams& params) const
return true;
}

bool CheckLLMQCommitment(CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman,
const ChainstateManager& chainman, const CTransaction& tx,
gsl::not_null<const CBlockIndex*> pindexPrev, TxValidationState& state)
bool CheckLLMQCommitment(const llmq::UtilParameters& util_params, const CTransaction& tx, TxValidationState& state)
{
const auto opt_qcTx = GetTxPayload<CFinalCommitmentTxPayload>(tx);
if (!opt_qcTx) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] GetTxPayload LLMQCommitment failed\n", pindexPrev->nHeight);
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] GetTxPayload LLMQCommitment failed\n",
util_params.m_base_index->nHeight);
return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-qc-payload");
}
auto& qcTx = *opt_qcTx;

const auto& llmq_params_opt = Params().GetLLMQ(qcTx.commitment.llmqType);
if (!llmq_params_opt.has_value()) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] GetLLMQ failed for llmqType[%d]\n", pindexPrev->nHeight, ToUnderlying(qcTx.commitment.llmqType));
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] GetLLMQ failed for llmqType[%d]\n",
util_params.m_base_index->nHeight, ToUnderlying(qcTx.commitment.llmqType));
return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-qc-commitment-type");
}

Expand All @@ -242,40 +240,44 @@ bool CheckLLMQCommitment(CDeterministicMNManager& dmnman, CQuorumSnapshotManager
}

if (qcTx.nVersion == 0 || qcTx.nVersion > CFinalCommitmentTxPayload::CURRENT_VERSION) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] invalid qcTx.nVersion[%d]\n", pindexPrev->nHeight, qcTx.nVersion);
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] invalid qcTx.nVersion[%d]\n",
util_params.m_base_index->nHeight, qcTx.nVersion);
return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-qc-version");
}

if (qcTx.nHeight != uint32_t(pindexPrev->nHeight + 1)) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] invalid qcTx.nHeight[%d]\n", pindexPrev->nHeight, qcTx.nHeight);
if (qcTx.nHeight != uint32_t(util_params.m_base_index->nHeight + 1)) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] invalid qcTx.nHeight[%d]\n", util_params.m_base_index->nHeight,
qcTx.nHeight);
return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-qc-height");
}

const CBlockIndex* pQuorumBaseBlockIndex = WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(qcTx.commitment.quorumHash));
const CBlockIndex* pQuorumBaseBlockIndex =
WITH_LOCK(::cs_main, return util_params.m_chainman.m_blockman.LookupBlockIndex(qcTx.commitment.quorumHash));
if (pQuorumBaseBlockIndex == nullptr) {
return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-qc-quorum-hash");
}


if (pQuorumBaseBlockIndex != pindexPrev->GetAncestor(pQuorumBaseBlockIndex->nHeight)) {
if (pQuorumBaseBlockIndex != util_params.m_base_index->GetAncestor(pQuorumBaseBlockIndex->nHeight)) {
// not part of active chain
return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-qc-quorum-hash");
}

if (qcTx.commitment.IsNull()) {
if (!qcTx.commitment.VerifyNull()) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] invalid qcTx.commitment[%s] VerifyNull failed\n", pindexPrev->nHeight, qcTx.commitment.quorumHash.ToString());
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] invalid qcTx.commitment[%s] VerifyNull failed\n",
util_params.m_base_index->nHeight, qcTx.commitment.quorumHash.ToString());
return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-qc-invalid-null");
}
return true;
}

if (!qcTx.commitment.Verify(dmnman, qsnapman, chainman, pQuorumBaseBlockIndex, false)) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] invalid qcTx.commitment[%s] Verify failed\n", pindexPrev->nHeight, qcTx.commitment.quorumHash.ToString());
if (!qcTx.commitment.Verify(util_params.replace_index(pQuorumBaseBlockIndex), false)) {
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] invalid qcTx.commitment[%s] Verify failed\n",
util_params.m_base_index->nHeight, qcTx.commitment.quorumHash.ToString());
return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-qc-invalid");
}

LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] CheckLLMQCommitment VALID\n", pindexPrev->nHeight);
LogPrint(BCLog::LLMQ, "CFinalCommitment -- h[%d] CheckLLMQCommitment VALID\n", util_params.m_base_index->nHeight);

return true;
}
Expand Down
14 changes: 6 additions & 8 deletions src/llmq/commitment.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,15 @@ class TxValidationState;
template <typename T>
class CCheckQueueControl;
struct RPCResult;

namespace llmq {
class CQuorumSnapshotManager;
struct UtilParameters;
namespace utils {
struct BlsCheck;
} // namespace utils
} // namespace llmq

namespace llmq {
// This message is an aggregation of all received premature commitments and only valid if
// enough (>=threshold) premature commitments were aggregated
// This is mined on-chain as part of TRANSACTION_QUORUM_COMMITMENT
Expand Down Expand Up @@ -74,11 +76,9 @@ class CFinalCommitment
return int(std::count(validMembers.begin(), validMembers.end(), true));
}

bool VerifySignatureAsync(CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman,
const ChainstateManager& chainman, gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex,
bool VerifySignatureAsync(const llmq::UtilParameters& util_params,
CCheckQueueControl<utils::BlsCheck>* queue_control) const;
bool Verify(CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman, const ChainstateManager& chainman,
gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex, bool checkSigs) const;
bool Verify(const llmq::UtilParameters& util_params, bool checkSigs) const;
bool VerifyNull() const;
bool VerifySizes(const Consensus::LLMQParams& params) const;

Expand Down Expand Up @@ -164,9 +164,7 @@ class CFinalCommitmentTxPayload
[[nodiscard]] UniValue ToJson() const;
};

bool CheckLLMQCommitment(CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman,
const ChainstateManager& chainman, const CTransaction& tx,
gsl::not_null<const CBlockIndex*> pindexPrev, TxValidationState& state);
bool CheckLLMQCommitment(const llmq::UtilParameters& util_params, const CTransaction& tx, TxValidationState& state);

uint256 BuildCommitmentHash(Consensus::LLMQType llmqType, const uint256& blockHash, const std::vector<bool>& validMembers, const CBLSPublicKey& pubKey, const uint256& vvecHash);

Expand Down
18 changes: 9 additions & 9 deletions src/llmq/core_write.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,22 +182,22 @@ UniValue CQuorumRotationInfo::ToJson() const
UniValue obj(UniValue::VOBJ);
obj.pushKV("extraShare", extraShare);

obj.pushKV("quorumSnapshotAtHMinusC", quorumSnapshotAtHMinusC.ToJson());
obj.pushKV("quorumSnapshotAtHMinus2C", quorumSnapshotAtHMinus2C.ToJson());
obj.pushKV("quorumSnapshotAtHMinus3C", quorumSnapshotAtHMinus3C.ToJson());
obj.pushKV("quorumSnapshotAtHMinusC", cycleHMinusC.m_snap.ToJson());
obj.pushKV("quorumSnapshotAtHMinus2C", cycleHMinus2C.m_snap.ToJson());
obj.pushKV("quorumSnapshotAtHMinus3C", cycleHMinus3C.m_snap.ToJson());

if (extraShare) {
obj.pushKV("quorumSnapshotAtHMinus4C", quorumSnapshotAtHMinus4C.ToJson());
obj.pushKV("quorumSnapshotAtHMinus4C", CHECK_NONFATAL(cycleHMinus4C)->m_snap.ToJson());
}

obj.pushKV("mnListDiffTip", mnListDiffTip.ToJson());
obj.pushKV("mnListDiffH", mnListDiffH.ToJson());
obj.pushKV("mnListDiffAtHMinusC", mnListDiffAtHMinusC.ToJson());
obj.pushKV("mnListDiffAtHMinus2C", mnListDiffAtHMinus2C.ToJson());
obj.pushKV("mnListDiffAtHMinus3C", mnListDiffAtHMinus3C.ToJson());
obj.pushKV("mnListDiffAtHMinusC", cycleHMinusC.m_diff.ToJson());
obj.pushKV("mnListDiffAtHMinus2C", cycleHMinus2C.m_diff.ToJson());
obj.pushKV("mnListDiffAtHMinus3C", cycleHMinus3C.m_diff.ToJson());

if (extraShare) {
obj.pushKV("mnListDiffAtHMinus4C", mnListDiffAtHMinus4C.ToJson());
obj.pushKV("mnListDiffAtHMinus4C", CHECK_NONFATAL(cycleHMinus4C)->m_diff.ToJson());
}
UniValue hqclists(UniValue::VARR);
for (const auto& qc : lastCommitmentPerIndex) {
Expand Down Expand Up @@ -242,7 +242,7 @@ UniValue CQuorumSnapshot::ToJson() const
activeQ.push_back(h);
}
obj.pushKV("activeQuorumMembers", activeQ);
obj.pushKV("mnSkipListMode", mnSkipListMode);
obj.pushKV("mnSkipListMode", ToUnderlying(mnSkipListMode));
UniValue skipList(UniValue::VARR);
for (const auto& h : mnSkipList) {
// cppcheck-suppress useStlAlgorithm
Expand Down
2 changes: 1 addition & 1 deletion src/llmq/debug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ UniValue CDKGDebugSessionStatus::ToJson(CDeterministicMNManager& dmnman, CQuorum
if (detailLevel == 2) {
const CBlockIndex* pindex = WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(quorumHash));
if (pindex != nullptr) {
dmnMembers = utils::GetAllQuorumMembers(llmqType, dmnman, qsnapman, chainman, pindex);
dmnMembers = utils::GetAllQuorumMembers(llmqType, {dmnman, qsnapman, chainman, pindex});
}
}

Expand Down
10 changes: 5 additions & 5 deletions src/llmq/dkgsession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ CDKGSession::CDKGSession(const CBlockIndex* pQuorumBaseBlockIndex, const Consens

bool CDKGSession::Init(const uint256& _myProTxHash, int _quorumIndex)
{
const auto mns = utils::GetAllQuorumMembers(params.type, m_dmnman, m_qsnapman, m_chainman, m_quorum_base_block_index);
const auto mns = utils::GetAllQuorumMembers(params.type, {m_dmnman, m_qsnapman, m_chainman, m_quorum_base_block_index});
quorumIndex = _quorumIndex;
members.resize(mns.size());
memberIds.resize(members.size());
Expand Down Expand Up @@ -137,8 +137,8 @@ bool CDKGSession::Init(const uint256& _myProTxHash, int _quorumIndex)

if (!myProTxHash.IsNull()) {
dkgDebugManager.InitLocalSessionStatus(params, quorumIndex, m_quorum_base_block_index->GetBlockHash(), m_quorum_base_block_index->nHeight);
relayMembers = utils::GetQuorumRelayMembers(params, m_dmnman, m_qsnapman, m_chainman, m_quorum_base_block_index,
myProTxHash, true);
relayMembers = utils::GetQuorumRelayMembers(params, {m_dmnman, m_qsnapman, m_chainman, m_quorum_base_block_index}, myProTxHash,
/*onlyOutbound=*/true);
if (LogAcceptDebug(BCLog::LLMQ)) {
std::stringstream ss;
for (const auto& r : relayMembers) {
Expand Down Expand Up @@ -1280,7 +1280,7 @@ std::vector<CFinalCommitment> CDKGSession::FinalizeCommitments()
t2.stop();

cxxtimer::Timer t3(true);
if (!fqc.Verify(m_dmnman, m_qsnapman, m_chainman, m_quorum_base_block_index, true)) {
if (!fqc.Verify({m_dmnman, m_qsnapman, m_chainman, m_quorum_base_block_index}, true)) {
logger.Batch("failed to verify final commitment");
continue;
}
Expand Down Expand Up @@ -1343,7 +1343,7 @@ CFinalCommitment CDKGSession::FinalizeSingleCommitment()
fqc.quorumSig = fqc.membersSig;
}

if (!fqc.Verify(m_dmnman, m_qsnapman, m_chainman, m_quorum_base_block_index, true)) {
if (!fqc.Verify({m_dmnman, m_qsnapman, m_chainman, m_quorum_base_block_index}, true)) {
logger.Batch("failed to verify final commitment");
assert(false);
}
Expand Down
Loading
Loading