PIVX Core  5.6.99
P2P Digital Currency
quorums_commitment.cpp
Go to the documentation of this file.
1 // Copyright (c) 2018-2019 The Dash Core developers
2 // Copyright (c) 2021-2022 The PIVX Core developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
7 
8 #include "bls/key_io.h"
9 #include "chainparams.h"
10 #include "llmq/quorums_utils.h"
11 #include "logging.h"
12 
13 
14 namespace llmq
15 {
16 
18  llmqType(params.type),
19  quorumHash(_quorumHash),
20  signers(params.size),
21  validMembers(params.size)
22 {
23 }
24 
26 {
27  if (CountSigners() > 0 || CountValidMembers() > 0) {
28  return false;
29  }
30 
31  if (quorumPublicKey.IsValid() ||
33  membersSig.IsValid() ||
34  quorumSig.IsValid()) {
35  return false;
36  }
37 
38  return true;
39 }
40 
42 {
43  obj.setObject();
44  obj.pushKV("version", (int)nVersion);
45  obj.pushKV("llmqType", (int)llmqType);
46  obj.pushKV("quorumHash", quorumHash.ToString());
47  obj.pushKV("signersCount", CountSigners());
48  obj.pushKV("signers", utils::ToHexStr(signers));
49  obj.pushKV("validMembersCount", CountValidMembers());
50  obj.pushKV("validMembers", utils::ToHexStr(validMembers));
51  obj.pushKV("quorumPublicKey", bls::EncodePublic(Params(), quorumPublicKey));
52  obj.pushKV("quorumVvecHash", quorumVvecHash.ToString());
53  obj.pushKV("quorumSig", quorumSig.ToString());
54  obj.pushKV("membersSig", membersSig.ToString());
55 }
56 
57 template<typename... Args>
58 static bool errorFinalCommitment(const char* fmt, const Args&... args)
59 {
60  try {
61  LogPrint(BCLog::LLMQ, "Invalid Final Commitment -- %s\n", tfm::format(fmt, args...));
62  } catch (tinyformat::format_error &e) {
63  LogPrintf("Error (%s) while formatting message %s\n", std::string(e.what()), fmt);
64  }
65  return false;
66 }
67 
68 bool CFinalCommitment::Verify(const std::vector<CBLSPublicKey>& allkeys, const Consensus::LLMQParams& params) const
69 {
70  int count_validmembers = CountValidMembers();
71  if (count_validmembers < params.minSize) {
72  return errorFinalCommitment("valid members count (%d < %d)", count_validmembers, params.minSize);
73  }
74  int count_signers = CountSigners();
75  if (count_signers < params.minSize) {
76  return errorFinalCommitment("signers count (%d < %d)", count_signers, params.minSize);
77  }
78 
79  if (!quorumPublicKey.IsValid()) {
80  return errorFinalCommitment("public key");
81  }
82  if (quorumVvecHash.IsNull()) {
83  return errorFinalCommitment("quorumVvecHash");
84  }
85  if (!membersSig.IsValid()) {
86  return errorFinalCommitment("membersSig");
87  }
88  if (!quorumSig.IsValid()) {
89  return errorFinalCommitment("quorumSig");
90  }
91 
92  for (int i = allkeys.size(); i < params.size; i++) {
93  if (validMembers[i]) {
94  return errorFinalCommitment("validMembers bitset (bit %d should not be set)", i);
95  }
96  if (signers[i]) {
97  return errorFinalCommitment("signers bitset (bit %d should not be set)", i);
98  }
99  }
100 
101  // check signatures
103  std::vector<CBLSPublicKey> memberPubKeys;
104  for (size_t i = 0; i < allkeys.size(); i++) {
105  if (!signers[i]) {
106  continue;
107  }
108  memberPubKeys.emplace_back(allkeys[i]);
109  }
110  if (!membersSig.VerifySecureAggregated(memberPubKeys, commitmentHash)) {
111  return errorFinalCommitment("aggregated members signature");
112  }
113  if (!quorumSig.VerifyInsecure(quorumPublicKey, commitmentHash)) {
114  return errorFinalCommitment("invalid quorum signature");
115  }
116 
117  return true;
118 }
119 
121 {
122  if ((int)signers.size() != params.size) {
123  return errorFinalCommitment("signers size (%d != %d)", signers.size(), params.size);
124  }
125  if ((int)validMembers.size() != params.size) {
126  return errorFinalCommitment("validMembers size (%d != %d)", validMembers.size(), params.size);
127  }
128  return true;
129 }
130 
131 void LLMQCommPL::ToJson(UniValue& obj) const
132 {
133  obj.setObject();
134  obj.pushKV("version", (int)nVersion);
135  obj.pushKV("height", (int)nHeight);
136 
137  UniValue qcObj;
138  commitment.ToJson(qcObj);
139  obj.pushKV("commitment", qcObj);
140 }
141 
142 } // namespace llmq
const CChainParams & Params()
Return the currently selected parameters.
bool VerifyInsecure(const CBLSPublicKey &pubKey, const uint256 &hash) const
bool VerifySecureAggregated(const std::vector< CBLSPublicKey > &pks, const uint256 &hash) const
bool IsValid() const
Definition: bls_wrapper.h:87
std::string ToString() const
Definition: bls_wrapper.h:164
bool setObject()
Definition: univalue.cpp:101
bool pushKV(const std::string &key, const UniValue &val)
Definition: univalue.cpp:133
std::string ToString() const
Definition: uint256.cpp:65
bool IsNull() const
Definition: uint256.h:36
void ToJson(UniValue &obj) const
bool Verify(const std::vector< CBLSPublicKey > &allkeys, const Consensus::LLMQParams &params) const
std::vector< bool > validMembers
std::vector< bool > signers
bool VerifySizes(const Consensus::LLMQParams &params) const
void ToJson(UniValue &obj) const
CFinalCommitment commitment
256-bit opaque blob.
Definition: uint256.h:138
#define LogPrint(category,...)
Definition: logging.h:163
@ LLMQ
Definition: logging.h:66
std::string EncodePublic(const CChainParams &params, const CBLSPublicKey &pk)
Definition: key_io.cpp:55
std::string ToHexStr(const std::vector< bool > &vBits)
uint256 BuildCommitmentHash(Consensus::LLMQType llmqType, const uint256 &blockHash, const std::vector< bool > &validMembers, const CBLSPublicKey &pubKey, const uint256 &vvecHash)
Definition: quorums.cpp:26
void format(std::ostream &out, const char *fmt, const Args &... args)
Format list of arguments to the stream according to given format string.
Definition: tinyformat.h:958