Skip to content

Commit 0a47121

Browse files
fixed message deserialization
1 parent 869ffe5 commit 0a47121

File tree

3 files changed

+88
-7
lines changed

3 files changed

+88
-7
lines changed

dash/src/network/message_sml.rs

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
use hashes::sha256::Hash;
2-
use crate::{BlockHash, ProTxHash, Transaction};
31
use crate::bls_sig_utils::BLSSignature;
42
use crate::hash_types::MerkleRootMasternodeList;
53
use crate::internal_macros::impl_consensus_encoding;
64
use crate::sml::entry::MasternodeListEntry;
7-
use crate::transaction::special_transaction::quorum_commitment::{QuorumFinalizationCommitment};
5+
use crate::transaction::special_transaction::quorum_commitment::QuorumFinalizationCommitment;
6+
use crate::{BlockHash, ProTxHash, Transaction};
7+
use hashes::sha256::Hash;
88

99
/// The getmnlistd message requests a mnlistdiff message that provides either:
1010
/// - A full masternode list (if baseBlockHash is all-zero)
@@ -39,7 +39,21 @@ pub struct MnListDiff {
3939
pub quorums_chainlock_signatures: Vec<BLSSignature>,
4040
}
4141

42-
impl_consensus_encoding!(MnListDiff, version, base_block_hash, block_hash, total_transactions, merkle_hashes, merkle_flags, coinbase_tx, deleted_masternodes, new_masternodes, deleted_quorums, new_quorums, quorums_chainlock_signatures);
42+
impl_consensus_encoding!(
43+
MnListDiff,
44+
version,
45+
base_block_hash,
46+
block_hash,
47+
total_transactions,
48+
merkle_hashes,
49+
merkle_flags,
50+
coinbase_tx,
51+
deleted_masternodes,
52+
new_masternodes,
53+
deleted_quorums,
54+
new_quorums,
55+
quorums_chainlock_signatures
56+
);
4357

4458
#[derive(PartialEq, Eq, Clone, Debug)]
4559
pub struct DeletedQuorum {
@@ -52,3 +66,26 @@ impl_consensus_encoding!(DeletedQuorum, llmq_type, quorum_hash);
5266

5367
// TODO: Add encoding tests with test vectors from Dash Core
5468
// TODO: Add documentation
69+
70+
#[cfg(test)]
71+
mod tests {
72+
73+
use std::fs::File;
74+
use std::io::{self, Read};
75+
use crate::consensus::deserialize;
76+
use crate::network::message::RawNetworkMessage;
77+
78+
fn read_binary_file(filename: &str) -> io::Result<Vec<u8>> {
79+
let mut file = File::open(filename)?;
80+
let mut buffer = Vec::new();
81+
file.read_to_end(&mut buffer)?;
82+
Ok(buffer)
83+
}
84+
85+
#[test]
86+
fn deserialize_mn_list_diff() {
87+
let block_hex = include_str!("../../tests/data/test_DML_diffs/DML_0_2221605.hex");
88+
let data = hex::decode(block_hex).expect("expected to decode hex");
89+
let mn_list_diff: RawNetworkMessage = deserialize(&data).expect("Failed to deserialize MnListDiff");
90+
}
91+
}

dash/src/sml/entry.rs

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::io::{Read, Write};
44
use blsful::{Bls12381G2Impl, PublicKey};
55
use crate::internal_macros::impl_consensus_encoding;
66
use crate::{ProTxHash, PubkeyHash};
7+
use crate::bls_sig_utils::BLSPublicKey;
78
use crate::consensus::{Decodable, Encodable};
89
use crate::consensus::encode::Error;
910
use crate::hash_types::{ConfirmedHash, Sha256dHash};
@@ -41,7 +42,7 @@ impl Encodable for MasternodeType {
4142
impl Decodable for MasternodeType {
4243
fn consensus_decode<R: Read + ?Sized>(reader: &mut R) -> Result<Self, Error> {
4344
// First decode the variant tag.
44-
let variant: u8 = Decodable::consensus_decode(reader)?;
45+
let variant: u16 = Decodable::consensus_decode(reader)?;
4546
match variant {
4647
0 => Ok(MasternodeType::Regular),
4748
1 => {
@@ -71,16 +72,58 @@ impl_consensus_encoding!(OperatorPublicKey, data, version);
7172

7273
#[derive(Clone, Eq, PartialEq, Debug)]
7374
pub struct MasternodeListEntry {
75+
pub version: u16,
7476
pub pro_reg_tx_hash: ProTxHash,
7577
pub confirmed_hash: ConfirmedHash,
7678
pub service_address: ServiceAddress,
77-
pub operator_public_key: OperatorPublicKey,
79+
pub operator_public_key: BLSPublicKey,
7880
pub key_id_voting: PubkeyHash,
7981
pub is_valid: bool,
8082
pub mn_type: MasternodeType,
8183
}
8284

83-
impl_consensus_encoding!(MasternodeListEntry, pro_reg_tx_hash, confirmed_hash, service_address, operator_public_key, key_id_voting, is_valid, mn_type);
85+
impl Encodable for MasternodeListEntry {
86+
fn consensus_encode<W: Write + ?Sized>(&self, writer: &mut W) -> Result<usize, std::io::Error> {
87+
let mut len = 0;
88+
len += self.version.consensus_encode(writer)?;
89+
len += self.pro_reg_tx_hash.consensus_encode(writer)?;
90+
len += self.confirmed_hash.consensus_encode(writer)?;
91+
len += self.service_address.consensus_encode(writer)?;
92+
len += self.operator_public_key.consensus_encode(writer)?;
93+
len += self.key_id_voting.consensus_encode(writer)?;
94+
len += self.is_valid.consensus_encode(writer)?;
95+
len += self.mn_type.consensus_encode(writer)?;
96+
Ok(len)
97+
}
98+
}
99+
100+
impl Decodable for MasternodeListEntry {
101+
fn consensus_decode<R: Read + ?Sized>(reader: &mut R) -> Result<Self, Error> {
102+
let version: u16 = Decodable::consensus_decode(reader)?;
103+
let pro_reg_tx_hash: ProTxHash = Decodable::consensus_decode(reader)?;
104+
let confirmed_hash: ConfirmedHash = Decodable::consensus_decode(reader)?;
105+
let service_address: ServiceAddress = Decodable::consensus_decode(reader)?;
106+
let operator_public_key: BLSPublicKey = Decodable::consensus_decode(reader)?;
107+
let key_id_voting: PubkeyHash = Decodable::consensus_decode(reader)?;
108+
let is_valid: bool = Decodable::consensus_decode(reader)?;
109+
let mn_type: MasternodeType = if version >= 2 {
110+
Decodable::consensus_decode(reader)?
111+
} else {
112+
MasternodeType::Regular
113+
};
114+
115+
Ok(MasternodeListEntry {
116+
version,
117+
pro_reg_tx_hash,
118+
confirmed_hash,
119+
service_address,
120+
operator_public_key,
121+
key_id_voting,
122+
is_valid,
123+
mn_type,
124+
})
125+
}
126+
}
84127
#[cfg(feature = "bls")]
85128
#[derive(Clone, Eq, PartialEq)]
86129
pub struct MasternodeListEntryInfo {

dash/tests/data/test_DML_diffs/DML_0_2221605.hex

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

0 commit comments

Comments
 (0)