Skip to content

Commit 91c5daf

Browse files
fixes (#67)
1 parent a8b5d0b commit 91c5daf

File tree

1 file changed

+60
-31
lines changed
  • dash/src/sml/masternode_list_engine

1 file changed

+60
-31
lines changed

dash/src/sml/masternode_list_engine/mod.rs

Lines changed: 60 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)