@@ -27,6 +27,57 @@ CFinalCommitment::CFinalCommitment(const Consensus::LLMQParams& params, const ui
2727{
2828}
2929
30+ bool CFinalCommitment::VerifySignature (CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman,
31+ gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex) const
32+ {
33+ auto members = utils::GetAllQuorumMembers (llmqType, dmnman, qsnapman, pQuorumBaseBlockIndex);
34+ const auto & llmq_params_opt = Params ().GetLLMQ (llmqType);
35+ if (!llmq_params_opt.has_value ()) {
36+ LogPrint (BCLog::LLMQ, " CFinalCommitment -- q[%s] invalid llmqType=%d\n " , quorumHash.ToString (),
37+ ToUnderlying (llmqType));
38+ return false ;
39+ }
40+ const auto & llmq_params = llmq_params_opt.value ();
41+
42+ uint256 commitmentHash = BuildCommitmentHash (llmq_params.type , quorumHash, validMembers, quorumPublicKey,
43+ quorumVvecHash);
44+ if (LogAcceptDebug (BCLog::LLMQ)) {
45+ std::stringstream ss3;
46+ for (const auto & mn : members) {
47+ ss3 << mn->proTxHash .ToString ().substr (0 , 4 ) << " | " ;
48+ }
49+ LogPrint (BCLog::LLMQ, " CFinalCommitment::%s members[%s] quorumPublicKey[%s] commitmentHash[%s]\n " , __func__,
50+ ss3.str (), quorumPublicKey.ToString (), commitmentHash.ToString ());
51+ }
52+ if (llmq_params.size == 1 ) {
53+ LogPrintf (" pubkey operator: %s\n " , members[0 ]->pdmnState ->pubKeyOperator .Get ().ToString ());
54+ if (!membersSig.VerifyInsecure (members[0 ]->pdmnState ->pubKeyOperator .Get (), commitmentHash)) {
55+ LogPrint (BCLog::LLMQ, " CFinalCommitment -- q[%s] invalid member signature\n " , quorumHash.ToString ());
56+ return false ;
57+ }
58+ } else {
59+ std::vector<CBLSPublicKey> memberPubKeys;
60+ for (const auto i : irange::range (members.size ())) {
61+ if (!signers[i]) {
62+ continue ;
63+ }
64+ memberPubKeys.emplace_back (members[i]->pdmnState ->pubKeyOperator .Get ());
65+ }
66+
67+ if (!membersSig.VerifySecureAggregated (memberPubKeys, commitmentHash)) {
68+ LogPrint (BCLog::LLMQ, " CFinalCommitment -- q[%s] invalid aggregated members signature\n " ,
69+ quorumHash.ToString ());
70+ return false ;
71+ }
72+ }
73+ if (!quorumSig.VerifyInsecure (quorumPublicKey, commitmentHash)) {
74+ LogPrint (BCLog::LLMQ, " CFinalCommitment -- q[%s] invalid quorum signature\n " , quorumHash.ToString ());
75+ return false ;
76+ }
77+ return true ;
78+ }
79+
80+
3081bool CFinalCommitment::Verify (CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman,
3182 gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex, bool checkSigs) const
3283{
@@ -106,38 +157,7 @@ bool CFinalCommitment::Verify(CDeterministicMNManager& dmnman, CQuorumSnapshotMa
106157
107158 // sigs are only checked when the block is processed
108159 if (checkSigs) {
109- uint256 commitmentHash = BuildCommitmentHash (llmq_params.type , quorumHash, validMembers, quorumPublicKey, quorumVvecHash);
110- if (LogAcceptDebug (BCLog::LLMQ)) {
111- std::stringstream ss3;
112- for (const auto &mn: members) {
113- ss3 << mn->proTxHash .ToString ().substr (0 , 4 ) << " | " ;
114- }
115- LogPrint (BCLog::LLMQ, " CFinalCommitment::%s members[%s] quorumPublicKey[%s] commitmentHash[%s]\n " ,
116- __func__, ss3.str (), quorumPublicKey.ToString (), commitmentHash.ToString ());
117- }
118- if (llmq_params.size == 1 ) {
119- LogPrintf (" pubkey operator: %s\n " , members[0 ]->pdmnState ->pubKeyOperator .Get ().ToString ());
120- if (!membersSig.VerifyInsecure (members[0 ]->pdmnState ->pubKeyOperator .Get (), commitmentHash)) {
121- LogPrint (BCLog::LLMQ, " CFinalCommitment -- q[%s] invalid member signature\n " , quorumHash.ToString ());
122- return false ;
123- }
124- } else {
125- std::vector<CBLSPublicKey> memberPubKeys;
126- for (const auto i : irange::range (members.size ())) {
127- if (!signers[i]) {
128- continue ;
129- }
130- memberPubKeys.emplace_back (members[i]->pdmnState ->pubKeyOperator .Get ());
131- }
132-
133- if (!membersSig.VerifySecureAggregated (memberPubKeys, commitmentHash)) {
134- LogPrint (BCLog::LLMQ, " CFinalCommitment -- q[%s] invalid aggregated members signature\n " ,
135- quorumHash.ToString ());
136- return false ;
137- }
138- }
139- if (!quorumSig.VerifyInsecure (quorumPublicKey, commitmentHash)) {
140- LogPrint (BCLog::LLMQ, " CFinalCommitment -- q[%s] invalid quorum signature\n " , quorumHash.ToString ());
160+ if (!VerifySignature (dmnman, qsnapman, pQuorumBaseBlockIndex)) {
141161 return false ;
142162 }
143163 }
0 commit comments