cs_mwc_bch/messages/
addr.rs

1use messages::message::Payload;
2use messages::node_addr_ex::NodeAddrEx;
3use std::fmt;
4use std::io;
5use std::io::{Read, Write};
6use util::{var_int, Error, Result, Serializable};
7
8/// Maximum number of addresses allowed in an Addr message
9const MAX_ADDR_COUNT: u64 = 1000;
10
11/// Known node addresses
12#[derive(Default, PartialEq, Eq, Hash, Clone)]
13pub struct Addr {
14    /// List of addresses of known nodes
15    pub addrs: Vec<NodeAddrEx>,
16}
17
18impl Serializable<Addr> for Addr {
19    fn read(reader: &mut dyn Read) -> Result<Addr> {
20        let mut ret = Addr { addrs: Vec::new() };
21        let count = var_int::read(reader)?;
22        if count > MAX_ADDR_COUNT {
23            let msg = format!("Too many addrs: {}", count);
24            return Err(Error::BadData(msg));
25        }
26        for _i in 0..count {
27            ret.addrs.push(NodeAddrEx::read(reader)?);
28        }
29        Ok(ret)
30    }
31
32    fn write(&self, writer: &mut dyn Write) -> io::Result<()> {
33        var_int::write(self.addrs.len() as u64, writer)?;
34        for item in self.addrs.iter() {
35            item.write(writer)?;
36        }
37        Ok(())
38    }
39}
40
41impl Payload<Addr> for Addr {
42    fn size(&self) -> usize {
43        var_int::size(self.addrs.len() as u64) + self.addrs.len() * NodeAddrEx::SIZE
44    }
45}
46
47impl fmt::Debug for Addr {
48    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
49        if self.addrs.len() <= 3 {
50            f.debug_struct("Addr").field("addrs", &self.addrs).finish()
51        } else {
52            let s = format!("[<{} addrs>]", self.addrs.len());
53            f.debug_struct("Addr").field("addrs", &s).finish()
54        }
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61    use hex;
62    use messages::NodeAddr;
63    use std::io::Cursor;
64    use std::net::Ipv6Addr;
65
66    #[test]
67    fn read_bytes() {
68        let b = hex::decode(
69            "013c93dd5a250000000000000000000000000000000000ffff43cdb3a1479d".as_bytes(),
70        ).unwrap();
71        let a = Addr::read(&mut Cursor::new(&b)).unwrap();
72        assert!(a.addrs.len() == 1);
73        assert!(a.addrs[0].last_connected_time == 1524470588);
74        assert!(a.addrs[0].addr.services == 37);
75        let ip = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 67, 205, 179, 161];
76        assert!(a.addrs[0].addr.ip.octets() == ip);
77        assert!(a.addrs[0].addr.port == 18333);
78    }
79
80    #[test]
81    fn write_read() {
82        let mut v = Vec::new();
83        let addr1 = NodeAddrEx {
84            last_connected_time: 100,
85            addr: NodeAddr {
86                services: 900,
87                ip: Ipv6Addr::from([1; 16]),
88                port: 2000,
89            },
90        };
91        let addr2 = NodeAddrEx {
92            last_connected_time: 200,
93            addr: NodeAddr {
94                services: 800,
95                ip: Ipv6Addr::from([2; 16]),
96                port: 3000,
97            },
98        };
99        let addr3 = NodeAddrEx {
100            last_connected_time: 700,
101            addr: NodeAddr {
102                services: 900,
103                ip: Ipv6Addr::from([3; 16]),
104                port: 4000,
105            },
106        };
107        let f = Addr {
108            addrs: vec![addr1, addr2, addr3],
109        };
110        f.write(&mut v).unwrap();
111        assert!(v.len() == f.size());
112        assert!(Addr::read(&mut Cursor::new(&v)).unwrap() == f);
113    }
114}