Skip to content
This repository was archived by the owner on Dec 27, 2021. It is now read-only.

Commit a4cc22b

Browse files
committed
Use lazy_static for constants
1 parent c3dc6f8 commit a4cc22b

File tree

2 files changed

+42
-34
lines changed

2 files changed

+42
-34
lines changed

rustcoin/Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rustcoin/src/network.rs

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,21 @@ use std::io::{Read, Write};
1111
use std::sync::mpsc;
1212
use std::{env, net, thread, time};
1313

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+
}
2129

2230
struct Stream {
2331
stream: net::TcpStream,
@@ -73,7 +81,7 @@ impl NetworkState {
7381
ts: current_epoch(),
7482
};
7583
let addr = Addr::msg_from_addrs(&vec![addr]);
76-
let getaddr = Message::from_command(GETADDR_CMD);
84+
let getaddr = Message::from_command(*GETADDR_CMD);
7785
ns.streams[0]
7886
.stream
7987
.write(&addr.serialize())
@@ -98,23 +106,23 @@ impl NetworkState {
98106
);
99107
let pong = Message {
100108
payload: Vec::new(),
101-
command: [0x70, 0x6f, 0x6e, 0x67, 0, 0, 0, 0, 0, 0, 0, 0],
109+
command: *PONG_CMD,
102110
};
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 => {
105113
self.streams[i]
106114
.stream
107115
.write(&pong.serialize())
108116
.unwrap();
109117
}
110-
"getaddr\u{0}\u{0}\u{0}\u{0}\u{0}" => {
118+
x if x == *GETADDR_CMD => {
111119
let addr = Addr::msg_from_streams(&self.streams);
112120
self.streams[i]
113121
.stream
114122
.write(&addr.serialize())
115123
.unwrap();
116124
}
117-
"addr\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}" => {
125+
x if x == *ADDR_CMD => {
118126
let addresses = Addr::deserialize(&mut message.payload);
119127
for address in &addresses {
120128
// Don't add me
@@ -129,7 +137,7 @@ impl NetworkState {
129137
}
130138
}
131139
}
132-
"getblocks\u{0}\u{0}\u{0}" => {
140+
x if x == *GETBLOCKS_CMD => {
133141
let mut last_hash = [0; 32];
134142
last_hash[..].clone_from_slice(&message.payload[0..32]);
135143
let mut inv: Inv = Inv {
@@ -153,14 +161,14 @@ impl NetworkState {
153161
}
154162
// referse for
155163
}
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 => {
157165
let _inv = Inv::deserialize(&mut message.payload);
158166
println!("{}: {}", self.port, "got new inv");
159167
}
160-
"pong\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}" => {
168+
x if x == *PONG_CMD => {
161169
self.streams[i].ts = current_epoch();
162170
}
163-
&_ => {
171+
_ => {
164172
println!(
165173
"{}: No match for command {}",
166174
self.port, command
@@ -240,11 +248,11 @@ pub fn start_node() {
240248
let last_hash = ns.blocks[ns.blocks.len() - 1].hash();
241249

242250
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);
245253
let mut getblocks = Message {
246254
payload: last_hash.to_vec(),
247-
command: GETBLOCKS_CMD,
255+
command: *GETBLOCKS_CMD,
248256
};
249257

250258
// mine
@@ -527,19 +535,13 @@ impl Message {
527535

528536
#[cfg(test)]
529537
mod tests {
530-
use super::{Addr, Message};
531-
use std::collections::HashMap;
532-
use std::net;
538+
use super::*;
533539
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
534540

535541
#[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);
543545
}
544546

545547
#[test]
@@ -563,16 +565,15 @@ mod tests {
563565
8080,
564566
),
565567
};
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);
569570
assert_eq!(
570571
msg.serialize(),
571572
Message::deserialize(&mut msg.serialize()).serialize()
572573
);
573574
assert_eq!(
574575
Addr::deserialize(&mut msg.payload)[0].address,
575-
addr.address
576+
addrs[0].address
576577
);
577578
}
578579
}

0 commit comments

Comments
 (0)