@@ -263,6 +263,22 @@ impl MasternodeListEngine {
263263 . and_then ( |height| self . masternode_lists . get ( & height) )
264264 }
265265
266+ pub fn known_qualified_quorum_entry (
267+ & self ,
268+ quorum_entry : & QuorumEntry ,
269+ ) -> Option < QualifiedQuorumEntry > {
270+ // Iterate over rotated_quorums_per_cycle to find the quorum_entry with the same hash
271+ self . rotated_quorums_per_cycle
272+ . values ( )
273+ . find_map ( |qualified_entries| {
274+ qualified_entries. iter ( ) . find ( |qualified_entry| {
275+ qualified_entry. quorum_entry . quorum_hash == quorum_entry. quorum_hash
276+ && qualified_entry. quorum_entry . llmq_type == quorum_entry. llmq_type
277+ } )
278+ } )
279+ . cloned ( )
280+ }
281+
266282 pub fn feed_block_height ( & mut self , height : CoreBlockHeight , block_hash : BlockHash ) {
267283 self . block_container . feed_block_height ( height, block_hash)
268284 }
@@ -438,36 +454,23 @@ impl MasternodeListEngine {
438454 self . known_snapshots
439455 . insert ( mn_list_diff_at_h_minus_2c. block_hash , quorum_snapshot_at_h_minus_2c) ;
440456 let mn_list_diff_at_h_minus_2c_block_hash = mn_list_diff_at_h_minus_2c. block_hash ;
441- let sigm2 = self . apply_diff ( mn_list_diff_at_h_minus_2c, None , false , None ) ?. ok_or (
442- QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (
443- 2 ,
444- mn_list_diff_at_h_minus_2c_block_hash,
445- ) ,
446- ) ?;
457+ let maybe_sigm2 = self . apply_diff ( mn_list_diff_at_h_minus_2c, None , false , None ) ?;
447458 self . known_snapshots
448459 . insert ( mn_list_diff_at_h_minus_c. block_hash , quorum_snapshot_at_h_minus_c) ;
449460 let mn_list_diff_at_h_minus_c_block_hash = mn_list_diff_at_h_minus_c. block_hash ;
450- let sigm1 = self . apply_diff ( mn_list_diff_at_h_minus_c, None , false , None ) ?. ok_or (
451- QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (
452- 1 ,
453- mn_list_diff_at_h_minus_c_block_hash,
454- ) ,
455- ) ?;
461+ let maybe_sigm1 = self . apply_diff ( mn_list_diff_at_h_minus_c, None , false , None ) ?;
456462 let mn_list_diff_at_h_block_hash = mn_list_diff_h. block_hash ;
457- let sigm0 = self . apply_diff ( mn_list_diff_h, None , false , None ) ?. ok_or (
458- QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (
459- 0 ,
460- mn_list_diff_at_h_block_hash,
461- ) ,
462- ) ?;
463+ let maybe_sigm0 = self . apply_diff ( mn_list_diff_h, None , false , None ) ?;
464+
465+ let sigs = if maybe_sigm2. is_some ( ) && maybe_sigm1. is_some ( ) && maybe_sigm0. is_some ( ) {
466+ Some ( [ maybe_sigm2. unwrap ( ) , maybe_sigm1. unwrap ( ) , maybe_sigm0. unwrap ( ) ] )
467+ } else {
468+ None
469+ } ;
470+
463471 let mn_list_diff_tip_block_hash = mn_list_diff_tip. block_hash ;
464472 let sigmtip = self
465- . apply_diff (
466- mn_list_diff_tip,
467- None ,
468- verify_tip_non_rotated_quorums,
469- Some ( [ sigm2, sigm1, sigm0] ) ,
470- ) ?
473+ . apply_diff ( mn_list_diff_tip, None , verify_tip_non_rotated_quorums, sigs) ?
471474 . ok_or ( QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (
472475 0 ,
473476 mn_list_diff_tip_block_hash,
@@ -476,14 +479,40 @@ impl MasternodeListEngine {
476479 let qualified_last_commitment_per_index = last_commitment_per_index
477480 . into_iter ( )
478481 . map ( |quorum_entry| {
479- let mut qualified_quorum_entry: QualifiedQuorumEntry = quorum_entry. into ( ) ;
480- qualified_quorum_entry. verifying_chain_lock_signature =
481- Some ( VerifyingChainLockSignaturesType :: Rotating ( [
482- sigm2, sigm1, sigm0, sigmtip,
483- ] ) ) ;
484- qualified_quorum_entry
482+ if let Some ( qualified_quorum_entry) =
483+ self . known_qualified_quorum_entry ( & quorum_entry)
484+ {
485+ Ok ( qualified_quorum_entry)
486+ } else {
487+ let sigm2 = maybe_sigm2. ok_or (
488+ QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (
489+ 2 ,
490+ mn_list_diff_at_h_minus_2c_block_hash,
491+ ) ,
492+ ) ?;
493+
494+ let sigm1 = maybe_sigm1. ok_or (
495+ QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (
496+ 1 ,
497+ mn_list_diff_at_h_minus_c_block_hash,
498+ ) ,
499+ ) ?;
500+
501+ let sigm0 = maybe_sigm0. ok_or (
502+ QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (
503+ 0 ,
504+ mn_list_diff_at_h_block_hash,
505+ ) ,
506+ ) ?;
507+ let mut qualified_quorum_entry: QualifiedQuorumEntry = quorum_entry. into ( ) ;
508+ qualified_quorum_entry. verifying_chain_lock_signature =
509+ Some ( VerifyingChainLockSignaturesType :: Rotating ( [
510+ sigm2, sigm1, sigm0, sigmtip,
511+ ] ) ) ;
512+ Ok ( qualified_quorum_entry)
513+ }
485514 } )
486- . collect :: < Vec < QualifiedQuorumEntry > > ( ) ;
515+ . collect :: < Result < Vec < QualifiedQuorumEntry > , QuorumValidationError > > ( ) ? ;
487516
488517 #[ cfg( feature = "quorum_validation" ) ]
489518 if verify_rotated_quorums {
0 commit comments