@@ -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
0 commit comments