Skip to content

Commit d6be845

Browse files
quorum info message
1 parent ff6873c commit d6be845

File tree

4 files changed

+98
-21
lines changed

4 files changed

+98
-21
lines changed

dash/src/consensus/encode.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use crate::hash_types::{
4646
BlockHash, FilterHash, FilterHeader, MerkleRootMasternodeList, TxMerkleNode,
4747
};
4848
use crate::io::{self, Cursor, Read};
49-
use crate::network::message_sml::{DeletedQuorum, MnListDiff};
49+
use crate::network::message_sml::{DeletedQuorum, MnListDiff, QuorumCLSigObject};
5050
#[cfg(feature = "std")]
5151
use crate::network::{
5252
address::{AddrV2Message, Address},
@@ -680,21 +680,23 @@ impl_vec!(Transaction);
680680
impl_vec!(TxOut);
681681
impl_vec!(TxIn);
682682
impl_vec!(Vec<u8>);
683+
impl_vec!(u16);
684+
impl_vec!(u32);
683685
impl_vec!(u64);
684686
impl_vec!(TapLeafHash);
685687
impl_vec!(VarInt);
686688
impl_vec!(ShortId);
687689
impl_vec!(OutPoint);
688690
impl_vec!(PrefilledTransaction);
689691
impl_vec!(QuorumEntry);
692+
impl_vec!(QuorumCLSigObject);
690693
impl_vec!(DeletedQuorum);
691694
impl_vec!(BLSSignature);
692695
impl_vec!(ProTxHash);
693696
impl_vec!(MerkleRootMasternodeList);
694697
impl_vec!(MasternodeListEntry);
695698
impl_vec!(MnListDiff);
696699
impl_vec!(QuorumSnapshot);
697-
impl_vec!(u32);
698700

699701
#[cfg(feature = "std")]
700702
impl_vec!(Inventory);

dash/src/network/message_qrinfo.rs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::consensus::{encode, Decodable, Encodable};
44
use crate::consensus::encode::{read_compact_size, read_fixed_bitset, write_fixed_bitset};
55
use crate::internal_macros::impl_consensus_encoding;
66
use crate::network::message_sml::MnListDiff;
7+
use crate::transaction::special_transaction::quorum_commitment::QuorumEntry;
78

89
/// The `getqrinfo` message requests a `qrinfo` message that provides the information
910
/// required to verify quorum details for quorums formed using the quorum rotation process.
@@ -48,8 +49,8 @@ pub struct QRInfo {
4849
pub quorum_snapshot_and_mn_list_diff_at_h_minus_4c: Option<(QuorumSnapshot, MnListDiff)>,
4950

5051
// lastQuorumHashPerIndex:
51-
// A compact size uint (the count) followed by that many 32-byte hashes.
52-
pub last_commitment_per_index: Vec<BlockHash>,
52+
// A compact size uint (the count) followed by quorum entries.
53+
pub last_commitment_per_index: Vec<QuorumEntry>,
5354

5455
// quorumSnapshotList:
5556
// A compact size uint count followed by that many CQuorumSnapshot entries.
@@ -216,4 +217,31 @@ impl Decodable for MnSkipListMode {
216217
_ => Err(encode::Error::ParseFailed("Invalid MnSkipListMode")),
217218
}
218219
}
219-
}
220+
}
221+
222+
#[cfg(test)]
223+
mod tests {
224+
use std::fs::File;
225+
use std::io::{self, Read};
226+
227+
use assert_matches::assert_matches;
228+
229+
use crate::consensus::deserialize;
230+
use crate::network::message::{NetworkMessage, RawNetworkMessage};
231+
232+
fn read_binary_file(filename: &str) -> io::Result<Vec<u8>> {
233+
let mut file = File::open(filename)?;
234+
let mut buffer = Vec::new();
235+
file.read_to_end(&mut buffer)?;
236+
Ok(buffer)
237+
}
238+
239+
#[test]
240+
fn deserialize_qr_info() {
241+
let block_hex = include_str!("../../tests/data/test_DML_diffs/QR_INFO_0_2224359.hex");
242+
let data = hex::decode(block_hex).expect("decode hex");
243+
let qr_info: RawNetworkMessage = deserialize(&data).expect("deserialize QR_INFO");
244+
245+
assert_matches!(qr_info, RawNetworkMessage { magic, payload: NetworkMessage::QRInfo(_) } if magic == 3177909439);
246+
}
247+
}

dash/src/network/message_sml.rs

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::io;
12
use hashes::sha256::Hash;
23

34
use crate::bls_sig_utils::BLSSignature;
@@ -6,6 +7,7 @@ use crate::internal_macros::impl_consensus_encoding;
67
use crate::sml::masternode_list_entry::MasternodeListEntry;
78
use crate::transaction::special_transaction::quorum_commitment::QuorumEntry;
89
use crate::{BlockHash, ProTxHash, QuorumHash, Transaction};
10+
use crate::consensus::{encode, Decodable, Encodable};
911
use crate::sml::llmq_type::LLMQType;
1012

1113
/// The `getmnlistd` message requests a `mnlistdiff` message that provides either:
@@ -54,24 +56,68 @@ pub struct MnListDiff {
5456
/// The list of LLMQ commitments for the LLMQs which were added since `base_block_hash`
5557
pub new_quorums: Vec<QuorumEntry>,
5658
/// ChainLock signature used to calculate members per quorum indexes (in `new_quorums`)
57-
pub quorums_chainlock_signatures: Vec<BLSSignature>,
59+
pub quorums_chainlock_signatures: Vec<QuorumCLSigObject>,
5860
}
5961

60-
impl_consensus_encoding!(
61-
MnListDiff,
62-
version,
63-
base_block_hash,
64-
block_hash,
65-
total_transactions,
66-
merkle_hashes,
67-
merkle_flags,
68-
coinbase_tx,
69-
deleted_masternodes,
70-
new_masternodes,
71-
deleted_quorums,
72-
new_quorums,
73-
quorums_chainlock_signatures
74-
);
62+
impl Encodable for MnListDiff {
63+
fn consensus_encode<W: io::Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
64+
let mut len = 0;
65+
len += self.version.consensus_encode(w)?;
66+
len += self.base_block_hash.consensus_encode(w)?;
67+
len += self.block_hash.consensus_encode(w)?;
68+
len += self.total_transactions.consensus_encode(w)?;
69+
len += self.merkle_hashes.consensus_encode(w)?;
70+
len += self.merkle_flags.consensus_encode(w)?;
71+
len += self.coinbase_tx.consensus_encode(w)?;
72+
len += self.deleted_masternodes.consensus_encode(w)?;
73+
len += self.new_masternodes.consensus_encode(w)?;
74+
len += self.deleted_quorums.consensus_encode(w)?;
75+
len += self.new_quorums.consensus_encode(w)?;
76+
len += self.quorums_chainlock_signatures.consensus_encode(w)?;
77+
Ok(len)
78+
}
79+
}
80+
81+
impl Decodable for MnListDiff {
82+
fn consensus_decode<R: io::Read + ?Sized>(r: &mut R) -> Result<Self, encode::Error> {
83+
let version = u16::consensus_decode(r)?;
84+
let base_block_hash = BlockHash::consensus_decode(r)?;
85+
let block_hash = BlockHash::consensus_decode(r)?;
86+
let total_transactions = u32::consensus_decode(r)?;
87+
let merkle_hashes = Vec::<MerkleRootMasternodeList>::consensus_decode(r)?;
88+
let merkle_flags = Vec::<u8>::consensus_decode(r)?;
89+
let coinbase_tx = Transaction::consensus_decode(r)?;
90+
let deleted_masternodes = Vec::<ProTxHash>::consensus_decode(r)?;
91+
let new_masternodes = Vec::<MasternodeListEntry>::consensus_decode(r)?;
92+
let deleted_quorums = Vec::<DeletedQuorum>::consensus_decode(r)?;
93+
let new_quorums = Vec::<QuorumEntry>::consensus_decode(r)?;
94+
let quorums_chainlock_signatures = Vec::<QuorumCLSigObject>::consensus_decode(r)?;
95+
// println!("{}", quorums_chainlock_signatures.iter().map(hex::encode).collect::<Vec<_>>().join("\n"));
96+
97+
Ok(MnListDiff {
98+
version,
99+
base_block_hash,
100+
block_hash,
101+
total_transactions,
102+
merkle_hashes,
103+
merkle_flags,
104+
coinbase_tx,
105+
deleted_masternodes,
106+
new_masternodes,
107+
deleted_quorums,
108+
new_quorums,
109+
quorums_chainlock_signatures,
110+
})
111+
}
112+
}
113+
114+
#[derive(PartialEq, Eq, Clone, Debug)]
115+
pub struct QuorumCLSigObject {
116+
signature: BLSSignature,
117+
index_set: Vec<u16>,
118+
}
119+
120+
impl_consensus_encoding!(QuorumCLSigObject, signature, index_set);
75121

76122
#[derive(PartialEq, Eq, Clone, Debug)]
77123
pub struct DeletedQuorum {

dash/tests/data/test_DML_diffs/QR_INFO_0_2224359.hex

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)