Skip to content

Commit 7a4a47b

Browse files
tests passing
1 parent 2e128e1 commit 7a4a47b

File tree

12 files changed

+123
-60
lines changed

12 files changed

+123
-60
lines changed

dash/examples/handshake.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ use std::io::{BufReader, Write};
44
use std::net::{IpAddr, Ipv4Addr, Shutdown, SocketAddr, TcpStream};
55
use std::time::{SystemTime, UNIX_EPOCH};
66
use std::{env, process};
7-
use secp256k1::rand;
7+
88
use dashcore::consensus::{Decodable, encode};
99
use dashcore::network::{address, constants, message, message_network};
1010
use dashcore::secp256k1;
1111
use dashcore::secp256k1::rand::Rng;
12+
use secp256k1::rand;
1213

1314
fn main() {
1415
// This example establishes a connection to a Bitcoin node, sends the intial

dash/src/consensus/encode.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,25 @@ use internals::write_err;
4141

4242
use crate::bip152::{PrefilledTransaction, ShortId};
4343
use crate::blockdata::transaction::Transaction;
44-
use crate::hash_types::{BlockHash, FilterHash, FilterHeader, MerkleRootMasternodeList, TxMerkleNode};
44+
use crate::bls_sig_utils::BLSSignature;
45+
use crate::hash_types::{
46+
BlockHash, FilterHash, FilterHeader, MerkleRootMasternodeList, TxMerkleNode,
47+
};
4548
use crate::io::{self, Cursor, Read};
49+
use crate::network::message_sml::DeletedQuorum;
4650
#[cfg(feature = "std")]
4751
use crate::network::{
4852
address::{AddrV2Message, Address},
4953
message_blockdata::Inventory,
5054
};
5155
use crate::prelude::*;
56+
use crate::sml::entry::MasternodeListEntry;
5257
use crate::taproot::TapLeafHash;
5358
use crate::transaction::special_transaction::TransactionType;
59+
use crate::transaction::special_transaction::quorum_commitment::QuorumFinalizationCommitment;
5460
use crate::transaction::txin::TxIn;
5561
use crate::transaction::txout::TxOut;
56-
use crate::{OutPoint, ScriptBuf, address, ProTxHash};
57-
use crate::bls_sig_utils::BLSSignature;
58-
use crate::network::message_sml::DeletedQuorum;
59-
use crate::sml::entry::MasternodeListEntry;
60-
use crate::transaction::special_transaction::quorum_commitment::QuorumFinalizationCommitment;
62+
use crate::{OutPoint, ProTxHash, ScriptBuf, address};
6163

6264
/// Encoding error.
6365
#[derive(Debug)]
@@ -109,7 +111,7 @@ pub enum Error {
109111
/// Address error
110112
Address(address::Error),
111113
/// Invalid enum value
112-
InvalidEnumValue{max: u16, received: u16, msg: String}
114+
InvalidEnumValue { max: u16, received: u16, msg: String },
113115
}
114116

115117
impl fmt::Display for Error {
@@ -141,7 +143,9 @@ impl fmt::Display for Error {
141143
}
142144
Error::Hex(ref e) => write!(f, "hex error {}", e),
143145
Error::Address(ref e) => write!(f, "address error {}", e),
144-
Error::InvalidEnumValue { max, received, msg } => write!(f, "invalid enum value, max: {} received: {} ({})", max, received, msg),
146+
Error::InvalidEnumValue { max, received, msg } => {
147+
write!(f, "invalid enum value, max: {} received: {} ({})", max, received, msg)
148+
}
145149
}
146150
}
147151
}
@@ -164,7 +168,7 @@ impl std::error::Error for Error {
164168
| Error::InvalidVectorSize { .. }
165169
| Error::Hex(_)
166170
| Error::Address(_)
167-
| InvalidEnumValue {..} => None,
171+
| InvalidEnumValue { .. } => None,
168172
}
169173
}
170174
}

dash/src/consensus/serde.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,8 +459,9 @@ impl<E: fmt::Debug, I: Iterator<Item = Result<u8, E>>> IterReader<E, I> {
459459
match (result, self.error) {
460460
(Ok(_), None) if self.iterator.next().is_some() => Err(DecodeError::TooManyBytes),
461461
(Ok(value), None) => Ok(value),
462-
(Ok(_), Some(error)) =>
463-
panic!("{} silently ate the error: {:?}", core::any::type_name::<T>(), error),
462+
(Ok(_), Some(error)) => {
463+
panic!("{} silently ate the error: {:?}", core::any::type_name::<T>(), error)
464+
}
464465
(Err(ConsensusError::Io(io_error)), Some(de_error))
465466
if io_error.kind() == io::ErrorKind::Other && io_error.source().is_none() =>
466467
Err(DecodeError::Other(de_error)),

dash/src/crypto/sighash.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -273,10 +273,12 @@ impl fmt::Display for Error {
273273
f,
274274
"A single prevout has been provided but all prevouts are needed without `ANYONECANPAY`"
275275
),
276-
WrongAnnex =>
277-
write!(f, "Annex must be at least one byte long and the first bytes must be `0x50`"),
278-
InvalidSighashType(hash_ty) =>
279-
write!(f, "Invalid taproot signature hash type : {} ", hash_ty),
276+
WrongAnnex => {
277+
write!(f, "Annex must be at least one byte long and the first bytes must be `0x50`")
278+
}
279+
InvalidSighashType(hash_ty) => {
280+
write!(f, "Invalid taproot signature hash type : {} ", hash_ty)
281+
}
280282
}
281283
}
282284
}

dash/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,10 @@ pub mod pow;
119119
pub mod psbt;
120120
pub mod sign_message;
121121
pub mod signer;
122+
pub mod sml;
122123
pub mod string;
123124
pub mod taproot;
124125
pub mod util;
125-
pub mod sml;
126126

127127
// May depend on crate features and we don't want to bother with it
128128
#[allow(unused)]

dash/src/network/message.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ use crate::consensus::{encode, serialize};
2828
use crate::io;
2929
use crate::merkle_tree::MerkleBlock;
3030
use crate::network::address::{AddrV2Message, Address};
31-
use crate::network::{message_blockdata, message_bloom, message_compact_blocks, message_filter, message_network, message_sml};
31+
use crate::network::{
32+
message_blockdata, message_bloom, message_compact_blocks, message_filter, message_network,
33+
message_sml,
34+
};
3235
use crate::prelude::*;
3336

3437
/// The maximum number of [super::message_blockdata::Inventory] items in an `inv` message.
@@ -503,7 +506,9 @@ impl Decodable for RawNetworkMessage {
503506
"addrv2" =>
504507
NetworkMessage::AddrV2(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
505508
"sendaddrv2" => NetworkMessage::SendAddrV2,
506-
"getmnlistd" => NetworkMessage::GetMnListD(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
509+
"getmnlistd" => NetworkMessage::GetMnListD(
510+
Decodable::consensus_decode_from_finite_reader(&mut mem_d)?,
511+
),
507512
"mnlistdiff" => NetworkMessage::MnListDiff(
508513
Decodable::consensus_decode_from_finite_reader(&mut mem_d)?,
509514
),
@@ -808,7 +813,8 @@ mod test {
808813
0x69, 0x3a, 0x30, 0x2e, 0x31, 0x37, 0x2e, 0x31,
809814
0x2f, 0x93, 0x8c, 0x08, 0x00, 0x01, 0x00, 0x00
810815
];
811-
let (msg, consumed) = deserialize_partial::<RawNetworkMessage>(&data).expect("deserialize partial message");
816+
let (msg, consumed) =
817+
deserialize_partial::<RawNetworkMessage>(&data).expect("deserialize partial message");
812818

813819
assert_eq!(consumed, data.to_vec().len() - 2);
814820
assert_eq!(msg.magic, 0xd9b4bef9);

dash/src/network/message_network.rs

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub struct VersionMessage {
6161
/// The mn auth challenge is a set of random bytes that challenge a masternode to prove
6262
/// themselves. The sender sends a random auth challenge, and the masternode will send back
6363
/// a response in mn_auth proving they are a masternode by signing this message.
64-
pub mn_auth_challenge: [u8;32],
64+
pub mn_auth_challenge: [u8; 32],
6565
/// Indicates if we are doing a quorum probe. Generally this should be set to false.
6666
pub masternode_connection: bool,
6767
}
@@ -76,7 +76,7 @@ impl VersionMessage {
7676
nonce: u64,
7777
user_agent: String,
7878
start_height: i32,
79-
mn_auth_challenge: [u8;32],
79+
mn_auth_challenge: [u8; 32],
8080
) -> VersionMessage {
8181
VersionMessage {
8282
version: constants::PROTOCOL_VERSION,
@@ -94,20 +94,63 @@ impl VersionMessage {
9494
}
9595
}
9696

97-
impl_consensus_encoding!(
98-
VersionMessage,
99-
version,
100-
services,
101-
timestamp,
102-
receiver,
103-
sender,
104-
nonce,
105-
user_agent,
106-
start_height,
107-
relay,
108-
mn_auth_challenge,
109-
masternode_connection
110-
);
97+
impl Encodable for VersionMessage {
98+
fn consensus_encode<W: io::Write + ?Sized>(&self, writer: &mut W) -> Result<usize, io::Error> {
99+
let mut len = 0;
100+
len += self.version.consensus_encode(writer)?;
101+
len += self.services.consensus_encode(writer)?;
102+
len += self.timestamp.consensus_encode(writer)?;
103+
len += self.receiver.consensus_encode(writer)?;
104+
len += self.sender.consensus_encode(writer)?;
105+
len += self.nonce.consensus_encode(writer)?;
106+
len += self.user_agent.consensus_encode(writer)?;
107+
len += self.start_height.consensus_encode(writer)?;
108+
len += self.relay.consensus_encode(writer)?;
109+
len += self.mn_auth_challenge.consensus_encode(writer)?;
110+
len += self.masternode_connection.consensus_encode(writer)?;
111+
Ok(len)
112+
}
113+
}
114+
115+
impl Decodable for VersionMessage {
116+
fn consensus_decode<R: io::Read + ?Sized>(reader: &mut R) -> Result<Self, encode::Error> {
117+
// Required fields
118+
let version: u32 = Decodable::consensus_decode(reader)?;
119+
let services: ServiceFlags = Decodable::consensus_decode(reader)?;
120+
let timestamp: i64 = Decodable::consensus_decode(reader)?;
121+
let receiver: Address = Decodable::consensus_decode(reader)?;
122+
let sender: Address = Decodable::consensus_decode(reader)?;
123+
let nonce: u64 = Decodable::consensus_decode(reader)?;
124+
let user_agent: String = Decodable::consensus_decode(reader)?;
125+
let start_height: i32 = Decodable::consensus_decode(reader)?;
126+
127+
// Read optional fields only if there are bytes remaining
128+
let relay = if let Ok(val) = reader.read_u8() { val != 0 } else { false };
129+
130+
let mut mn_auth_challenge = [0u8; 32];
131+
if let Ok(_) = reader.read_exact(&mut mn_auth_challenge) {
132+
// Successfully read challenge
133+
} else {
134+
mn_auth_challenge = [0; 32]; // Default value
135+
}
136+
137+
let masternode_connection = if let Ok(val) = reader.read_u8() { val != 0 } else { false };
138+
139+
Ok(VersionMessage {
140+
version,
141+
services,
142+
timestamp,
143+
receiver,
144+
sender,
145+
nonce,
146+
user_agent,
147+
start_height,
148+
relay,
149+
mn_auth_challenge,
150+
masternode_connection,
151+
})
152+
}
153+
}
111154

112155
/// message rejection reason as a code
113156
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
@@ -184,7 +227,7 @@ mod tests {
184227
fn version_message_test() {
185228
// This message is from my satoshi node, morning of May 27 2014
186229
let from_sat = hex!(
187-
"721101000100000000000000e6e0845300000000010000000000000000000000000000000000ffff0000000000000100000000000000fd87d87eeb4364f22cf54dca59412db7208d47d920cffce83ee8102f5361746f7368693a302e392e39392f2c9f040001"
230+
"721101000100000000000000e6e0845300000000010000000000000000000000000000000000ffff0000000000000100000000000000fd87d87eeb4364f22cf54dca59412db7208d47d920cffce83ee8102f5361746f7368693a302e392e39392f2c9f0400016a4bbaa5155fa3ed24b60975d2b7b9860ccd64ff39c128622184b794256a0cba00"
188231
);
189232

190233
let message: VersionMessage = deserialize(&from_sat).expect("deserialize message");
@@ -197,7 +240,12 @@ mod tests {
197240
assert_eq!(message.user_agent, "/Satoshi:0.9.99/".to_string());
198241
assert_eq!(message.start_height, 302892);
199242
assert!(message.relay);
200-
243+
assert_eq!(
244+
&message.mn_auth_challenge.to_vec(),
245+
&hex::decode("6a4bbaa5155fa3ed24b60975d2b7b9860ccd64ff39c128622184b794256a0cba")
246+
.expect("expected to get vec")
247+
);
248+
assert!(!message.masternode_connection);
201249
assert_eq!(serialize(&message), from_sat);
202250
}
203251

dash/src/network/message_sml.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
use hashes::sha256::Hash;
2+
13
use crate::bls_sig_utils::BLSSignature;
24
use crate::hash_types::MerkleRootMasternodeList;
35
use crate::internal_macros::impl_consensus_encoding;
46
use crate::sml::entry::MasternodeListEntry;
57
use crate::transaction::special_transaction::quorum_commitment::QuorumFinalizationCommitment;
68
use crate::{BlockHash, ProTxHash, Transaction};
7-
use hashes::sha256::Hash;
89

910
/// The `getmnlistd` message requests a `mnlistdiff` message that provides either:
1011
/// - A full masternode list (if `base_block_hash` is all-zero)
@@ -84,7 +85,9 @@ impl_consensus_encoding!(DeletedQuorum, llmq_type, quorum_hash);
8485
mod tests {
8586
use std::fs::File;
8687
use std::io::{self, Read};
88+
8789
use assert_matches::assert_matches;
90+
8891
use crate::consensus::deserialize;
8992
use crate::network::message::{NetworkMessage, RawNetworkMessage};
9093

@@ -100,7 +103,7 @@ mod tests {
100103
let block_hex = include_str!("../../tests/data/test_DML_diffs/DML_0_2221605.hex");
101104
let data = hex::decode(block_hex).expect("decode hex");
102105
let mn_list_diff: RawNetworkMessage = deserialize(&data).expect("deserialize MnListDiff");
103-
106+
104107
assert_matches!(mn_list_diff, RawNetworkMessage { magic, payload: NetworkMessage::MnListDiff(_) } if magic == 3177909439);
105108
}
106109
}

dash/src/psbt/map/global.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,15 +198,17 @@ impl PartiallySignedTransaction {
198198
btree_map::Entry::Vacant(empty_key) => {
199199
empty_key.insert(pair.value);
200200
}
201-
btree_map::Entry::Occupied(_) =>
202-
return Err(Error::DuplicateKey(pair.key)),
201+
btree_map::Entry::Occupied(_) => {
202+
return Err(Error::DuplicateKey(pair.key));
203+
}
203204
},
204205
_ => match unknowns.entry(pair.key) {
205206
btree_map::Entry::Vacant(empty_key) => {
206207
empty_key.insert(pair.value);
207208
}
208-
btree_map::Entry::Occupied(k) =>
209-
return Err(Error::DuplicateKey(k.key().clone())),
209+
btree_map::Entry::Occupied(k) => {
210+
return Err(Error::DuplicateKey(k.key().clone()));
211+
}
210212
},
211213
}
212214
}

dash/src/sml/address.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::io;
22
use std::io::Write;
33
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
4-
use crate::consensus::{encode, Decodable, Encodable};
54

5+
use crate::consensus::{Decodable, Encodable, encode};
66

77
impl Encodable for SocketAddr {
88
fn consensus_encode<W: Write + ?Sized>(&self, writer: &mut W) -> Result<usize, io::Error> {

0 commit comments

Comments
 (0)