Skip to content

Commit 1cc06cc

Browse files
committed
refactor: introduce MasternodeListBuilder
1 parent 068822b commit 1cc06cc

File tree

3 files changed

+75
-49
lines changed

3 files changed

+75
-49
lines changed

dash/src/sml/masternode_list/apply_diff.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::network::message_sml::MnListDiff;
22
use crate::prelude::CoreBlockHeight;
33
use crate::sml::error::SmlError;
4-
use crate::sml::masternode_list::MasternodeList;
4+
use crate::sml::masternode_list::{MasternodeList, MasternodeListBuilder};
55

66
impl MasternodeList {
77
/// Applies an `MnListDiff` to update the current masternode list.
@@ -76,12 +76,13 @@ impl MasternodeList {
7676
}
7777

7878
// Create and return the new MasternodeList
79-
Ok(MasternodeList::new(
79+
let builder = MasternodeListBuilder::new(
8080
updated_masternodes,
8181
updated_quorums,
8282
diff.block_hash,
83-
diff_end_height,
84-
true, // Assume quorums are active
85-
))
83+
diff_end_height,
84+
);
85+
86+
Ok(builder.build())
8687
}
8788
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use std::collections::BTreeMap;
2+
use crate::{BlockHash, ProTxHash, QuorumHash};
3+
use crate::hash_types::{MerkleRootMasternodeList, MerkleRootQuorums};
4+
use crate::sml::llmq_type::LLMQType;
5+
use crate::sml::masternode_list::MasternodeList;
6+
use crate::sml::masternode_list_entry::qualified_masternode_list_entry::QualifiedMasternodeListEntry;
7+
use crate::sml::quorum_entry::qualified_quorum_entry::QualifiedQuorumEntry;
8+
9+
pub struct MasternodeListBuilder {
10+
pub block_hash: BlockHash,
11+
pub block_height: u32,
12+
pub masternode_merkle_root: Option<MerkleRootMasternodeList>,
13+
pub llmq_merkle_root: Option<MerkleRootQuorums>,
14+
pub masternodes: BTreeMap<ProTxHash, QualifiedMasternodeListEntry>,
15+
pub quorums: BTreeMap<LLMQType, BTreeMap<QuorumHash, QualifiedQuorumEntry>>,
16+
}
17+
18+
impl MasternodeListBuilder {
19+
pub fn empty(block_hash: BlockHash, block_height: u32) -> Self {
20+
Self::new(BTreeMap::default(), BTreeMap::new(), block_hash, block_height)
21+
}
22+
23+
pub fn new(
24+
masternodes: BTreeMap<ProTxHash, QualifiedMasternodeListEntry>,
25+
quorums: BTreeMap<LLMQType, BTreeMap<QuorumHash, QualifiedQuorumEntry>>,
26+
block_hash: BlockHash,
27+
block_height: u32,
28+
) -> Self {
29+
Self {
30+
quorums,
31+
block_hash,
32+
block_height,
33+
masternode_merkle_root: None,
34+
llmq_merkle_root: None,
35+
masternodes,
36+
}
37+
}
38+
39+
pub fn with_merkle_roots(
40+
mut self,
41+
masternode_merkle_root: MerkleRootMasternodeList,
42+
llmq_merkle_root: Option<MerkleRootQuorums>,
43+
) -> Self {
44+
self.masternode_merkle_root = Some(masternode_merkle_root);
45+
self.llmq_merkle_root = llmq_merkle_root;
46+
self
47+
}
48+
49+
pub fn build(self) -> MasternodeList {
50+
let mut list = MasternodeList {
51+
block_hash: self.block_hash,
52+
known_height: self.block_height,
53+
masternode_merkle_root: self.masternode_merkle_root,
54+
llmq_merkle_root: self.llmq_merkle_root,
55+
masternodes: self.masternodes,
56+
quorums: self.quorums,
57+
};
58+
59+
if self.masternode_merkle_root.is_none() {
60+
list.masternode_merkle_root = list.calculate_masternodes_merkle_root(self.block_height);
61+
list.llmq_merkle_root = list.calculate_llmq_merkle_root();
62+
}
63+
64+
list
65+
}
66+
}

dash/src/sml/masternode_list/mod.rs

Lines changed: 3 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@ mod peer_addresses;
88
mod quorum_helpers;
99
mod rotated_quorums_info;
1010
mod scores_for_quorum;
11+
mod builder;
1112

1213
use std::collections::BTreeMap;
1314

15+
pub use builder::MasternodeListBuilder;
16+
1417
#[cfg(feature = "bincode")]
1518
use bincode::{Decode, Encode};
1619

@@ -34,47 +37,3 @@ pub struct MasternodeList {
3437
pub masternodes: BTreeMap<ProTxHash, QualifiedMasternodeListEntry>,
3538
pub quorums: BTreeMap<LLMQType, BTreeMap<QuorumHash, QualifiedQuorumEntry>>,
3639
}
37-
38-
impl MasternodeList {
39-
pub fn empty(block_hash: BlockHash, block_height: u32, quorums_active: bool) -> Self {
40-
Self::new(BTreeMap::default(), BTreeMap::new(), block_hash, block_height, quorums_active)
41-
}
42-
pub fn new(
43-
masternodes: BTreeMap<ProTxHash, QualifiedMasternodeListEntry>,
44-
quorums: BTreeMap<LLMQType, BTreeMap<QuorumHash, QualifiedQuorumEntry>>,
45-
block_hash: BlockHash,
46-
block_height: u32,
47-
quorums_active: bool,
48-
) -> Self {
49-
let mut list = Self {
50-
quorums,
51-
block_hash,
52-
known_height: block_height,
53-
masternode_merkle_root: None,
54-
llmq_merkle_root: None,
55-
masternodes,
56-
};
57-
list.masternode_merkle_root = list.calculate_masternodes_merkle_root(block_height);
58-
if quorums_active {
59-
list.llmq_merkle_root = list.calculate_llmq_merkle_root();
60-
}
61-
list
62-
}
63-
pub fn with_merkle_roots(
64-
masternodes: BTreeMap<ProTxHash, QualifiedMasternodeListEntry>,
65-
quorums: BTreeMap<LLMQType, BTreeMap<QuorumHash, QualifiedQuorumEntry>>,
66-
block_hash: BlockHash,
67-
block_height: u32,
68-
masternode_merkle_root: MerkleRootMasternodeList,
69-
llmq_merkle_root: Option<MerkleRootQuorums>,
70-
) -> Self {
71-
Self {
72-
quorums,
73-
block_hash,
74-
known_height: block_height,
75-
masternode_merkle_root: Some(masternode_merkle_root),
76-
llmq_merkle_root,
77-
masternodes,
78-
}
79-
}
80-
}

0 commit comments

Comments
 (0)