@@ -11,13 +11,21 @@ use std::io::{Read, Write};
11
11
use std:: sync:: mpsc;
12
12
use std:: { env, net, thread, time} ;
13
13
14
- const GETBLOCKS_CMD : [ u8 ; 12 ] = [
15
- 0x67 , 0x65 , 0x74 , 0x62 , 0x6c , 0x6f , 0x63 , 0x6b , 0x73 , 0 , 0 , 0 ,
16
- ] ;
17
- const GETADDR_CMD : [ u8 ; 12 ] = [
18
- 0x67 , 0x65 , 0x74 , 0x61 , 0x64 , 0x64 , 0x72 , 0 , 0 , 0 , 0 , 0 ,
19
- ] ;
20
- const PING_CMD : [ u8 ; 12 ] = [ 0x70 , 0x69 , 0x6e , 0x67 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
14
+ lazy_static ! {
15
+ static ref INV_CMD : [ u8 ; 12 ] = { cmd_from_str( "inv" ) } ;
16
+ static ref PING_CMD : [ u8 ; 12 ] = { cmd_from_str( "ping" ) } ;
17
+ static ref GETBLOCKS_CMD : [ u8 ; 12 ] = { cmd_from_str( "getblocks" ) } ;
18
+ static ref GETADDR_CMD : [ u8 ; 12 ] = { cmd_from_str( "getaddr" ) } ;
19
+ static ref ADDR_CMD : [ u8 ; 12 ] = { cmd_from_str( "addr" ) } ;
20
+ static ref PONG_CMD : [ u8 ; 12 ] = { cmd_from_str( "pong" ) } ;
21
+ }
22
+
23
+ fn cmd_from_str ( cmd : & str ) -> [ u8 ; 12 ] {
24
+ let mut out = [ 0u8 ; 12 ] ;
25
+ let bytes = String :: from ( cmd) . into_bytes ( ) ;
26
+ out[ ..bytes. len ( ) ] . clone_from_slice ( & bytes[ 0 ..bytes. len ( ) ] ) ;
27
+ out
28
+ }
21
29
22
30
struct Stream {
23
31
stream : net:: TcpStream ,
@@ -73,7 +81,7 @@ impl NetworkState {
73
81
ts : current_epoch ( ) ,
74
82
} ;
75
83
let addr = Addr :: msg_from_addrs ( & vec ! [ addr] ) ;
76
- let getaddr = Message :: from_command ( GETADDR_CMD ) ;
84
+ let getaddr = Message :: from_command ( * GETADDR_CMD ) ;
77
85
ns. streams [ 0 ]
78
86
. stream
79
87
. write ( & addr. serialize ( ) )
@@ -98,23 +106,23 @@ impl NetworkState {
98
106
) ;
99
107
let pong = Message {
100
108
payload : Vec :: new ( ) ,
101
- command : [ 0x70 , 0x6f , 0x6e , 0x67 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
109
+ command : * PONG_CMD ,
102
110
} ;
103
- match command . as_ref ( ) {
104
- "ping \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} " => {
111
+ match message . command {
112
+ x if x == * PING_CMD => {
105
113
self . streams [ i]
106
114
. stream
107
115
. write ( & pong. serialize ( ) )
108
116
. unwrap ( ) ;
109
117
}
110
- "getaddr \u{0} \u{0} \u{0} \u{0} \u{0} " => {
118
+ x if x == * GETADDR_CMD => {
111
119
let addr = Addr :: msg_from_streams ( & self . streams ) ;
112
120
self . streams [ i]
113
121
. stream
114
122
. write ( & addr. serialize ( ) )
115
123
. unwrap ( ) ;
116
124
}
117
- "addr \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} " => {
125
+ x if x == * ADDR_CMD => {
118
126
let addresses = Addr :: deserialize ( & mut message. payload ) ;
119
127
for address in & addresses {
120
128
// Don't add me
@@ -129,7 +137,7 @@ impl NetworkState {
129
137
}
130
138
}
131
139
}
132
- "getblocks \u{0} \u{0} \u{0} " => {
140
+ x if x == * GETBLOCKS_CMD => {
133
141
let mut last_hash = [ 0 ; 32 ] ;
134
142
last_hash[ ..] . clone_from_slice ( & message. payload [ 0 ..32 ] ) ;
135
143
let mut inv: Inv = Inv {
@@ -153,14 +161,14 @@ impl NetworkState {
153
161
}
154
162
// referse for
155
163
}
156
- "inv \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} " => {
164
+ x if x == * INV_CMD => {
157
165
let _inv = Inv :: deserialize ( & mut message. payload ) ;
158
166
println ! ( "{}: {}" , self . port, "got new inv" ) ;
159
167
}
160
- "pong \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} " => {
168
+ x if x == * PONG_CMD => {
161
169
self . streams [ i] . ts = current_epoch ( ) ;
162
170
}
163
- & _ => {
171
+ _ => {
164
172
println ! (
165
173
"{}: No match for command {}" ,
166
174
self . port, command
@@ -240,11 +248,11 @@ pub fn start_node() {
240
248
let last_hash = ns. blocks [ ns. blocks . len ( ) - 1 ] . hash ( ) ;
241
249
242
250
println ! ( "Broadcasting on {}" , ns. port) ;
243
- let ping = Message :: from_command ( PING_CMD ) ;
244
- let getaddr = Message :: from_command ( GETADDR_CMD ) ;
251
+ let ping = Message :: from_command ( * PING_CMD ) ;
252
+ let getaddr = Message :: from_command ( * GETADDR_CMD ) ;
245
253
let mut getblocks = Message {
246
254
payload : last_hash. to_vec ( ) ,
247
- command : GETBLOCKS_CMD ,
255
+ command : * GETBLOCKS_CMD ,
248
256
} ;
249
257
250
258
// mine
@@ -527,19 +535,13 @@ impl Message {
527
535
528
536
#[ cfg( test) ]
529
537
mod tests {
530
- use super :: { Addr , Message } ;
531
- use std:: collections:: HashMap ;
532
- use std:: net;
538
+ use super :: * ;
533
539
use std:: net:: { IpAddr , Ipv4Addr , SocketAddr } ;
534
540
535
541
#[ test]
536
- fn ascii_verify ( ) {
537
- assert_eq ! (
538
- String :: from_utf8_lossy( & [
539
- 0x70 , 0x6f , 0x6e , 0x67 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
540
- ] ) ,
541
- "pong\u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} \u{0} " . to_string( )
542
- ) ;
542
+ fn const_verify ( ) {
543
+ println ! ( "{:?}" , * INV_CMD ) ;
544
+ println ! ( "{:?}" , * PING_CMD ) ;
543
545
}
544
546
545
547
#[ test]
@@ -563,16 +565,15 @@ mod tests {
563
565
8080 ,
564
566
) ,
565
567
} ;
566
- let mut active_nodes: HashMap < net:: SocketAddr , u64 > = HashMap :: new ( ) ;
567
- active_nodes. insert ( addr. address , 0 ) ;
568
- let mut msg = Addr :: serialize ( & active_nodes) ;
568
+ let addrs = vec ! [ addr] ;
569
+ let mut msg = Addr :: msg_from_addrs ( & addrs) ;
569
570
assert_eq ! (
570
571
msg. serialize( ) ,
571
572
Message :: deserialize( & mut msg. serialize( ) ) . serialize( )
572
573
) ;
573
574
assert_eq ! (
574
575
Addr :: deserialize( & mut msg. payload) [ 0 ] . address,
575
- addr . address
576
+ addrs [ 0 ] . address
576
577
) ;
577
578
}
578
579
}
0 commit comments