Skip to content

Commit 216edbb

Browse files
author
Antoine Riard
committed
Implement serialize/deserialize for Router.
Extend route_test to check if serialize/deserialize of NetworkMap works. Add PartialEq traits on some Router's structs.
1 parent 302f131 commit 216edbb

File tree

4 files changed

+365
-138
lines changed

4 files changed

+365
-138
lines changed

src/ln/msgs.rs

Lines changed: 106 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use std::{cmp, fmt};
2626
use std::io::Read;
2727
use std::result::Result;
2828

29-
use util::{byte_utils, events};
29+
use util::events;
3030
use util::ser::{Readable, Writeable, Writer};
3131

3232
/// An error in decoding a message or struct.
@@ -334,7 +334,7 @@ pub struct AnnouncementSignatures {
334334
}
335335

336336
/// An address which can be used to connect to a remote peer
337-
#[derive(Clone)]
337+
#[derive(PartialEq, Clone)]
338338
pub enum NetAddress {
339339
/// An IPv4 address/port on which the peer is listenting.
340340
IPv4 {
@@ -382,7 +382,81 @@ impl NetAddress {
382382
}
383383
}
384384

385-
#[derive(Clone)]
385+
impl Writeable for NetAddress {
386+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
387+
match self {
388+
&NetAddress::IPv4 { ref addr, ref port } => {
389+
0u8.write(writer)?;
390+
addr.write(writer)?;
391+
port.write(writer)?;
392+
},
393+
&NetAddress::IPv6 { ref addr, ref port } => {
394+
1u8.write(writer)?;
395+
addr.write(writer)?;
396+
port.write(writer)?;
397+
},
398+
&NetAddress::OnionV2 { ref addr, ref port } => {
399+
2u8.write(writer)?;
400+
addr.write(writer)?;
401+
port.write(writer)?;
402+
},
403+
&NetAddress::OnionV3 { ref ed25519_pubkey, ref checksum, ref version, ref port } => {
404+
3u8.write(writer)?;
405+
ed25519_pubkey.write(writer)?;
406+
checksum.write(writer)?;
407+
version.write(writer)?;
408+
port.write(writer)?;
409+
}
410+
}
411+
Ok(())
412+
}
413+
}
414+
415+
impl<R: ::std::io::Read> Readable<R> for NetAddress {
416+
fn read(reader: &mut R) -> Result<NetAddress, DecodeError> {
417+
match <u8 as Readable<R>>::read(reader)? {
418+
0 => {
419+
let addr = Readable::read(reader)?;
420+
let port = Readable::read(reader)?;
421+
Ok(NetAddress::IPv4 {
422+
addr,
423+
port,
424+
})
425+
},
426+
1 => {
427+
let addr = Readable::read(reader)?;
428+
let port = Readable::read(reader)?;
429+
Ok(NetAddress::IPv6 {
430+
addr,
431+
port,
432+
})
433+
},
434+
2 => {
435+
let addr = Readable::read(reader)?;
436+
let port = Readable::read(reader)?;
437+
Ok(NetAddress::OnionV2 {
438+
addr,
439+
port,
440+
})
441+
},
442+
3 => {
443+
let ed25519_pubkey = Readable::read(reader)?;
444+
let checksum = Readable::read(reader)?;
445+
let version = Readable::read(reader)?;
446+
let port = Readable::read(reader)?;
447+
Ok(NetAddress::OnionV3 {
448+
ed25519_pubkey,
449+
checksum,
450+
version,
451+
port,
452+
})
453+
}
454+
_ => return Err(DecodeError::InvalidValue),
455+
}
456+
}
457+
}
458+
459+
#[derive(PartialEq, Clone)]
386460
// Only exposed as broadcast of node_announcement should be filtered by node_id
387461
/// The unsigned part of a node_announcement
388462
pub struct UnsignedNodeAnnouncement {
@@ -399,7 +473,7 @@ pub struct UnsignedNodeAnnouncement {
399473
pub(crate) excess_address_data: Vec<u8>,
400474
pub(crate) excess_data: Vec<u8>,
401475
}
402-
#[derive(Clone)]
476+
#[derive(PartialEq, Clone)]
403477
/// A node_announcement message to be sent or received from a peer
404478
pub struct NodeAnnouncement {
405479
pub(crate) signature: Signature,
@@ -1148,39 +1222,16 @@ impl Writeable for UnsignedNodeAnnouncement {
11481222
w.write_all(&self.rgb)?;
11491223
self.alias.write(w)?;
11501224

1151-
let mut addr_slice = Vec::with_capacity(self.addresses.len() * 18);
11521225
let mut addrs_to_encode = self.addresses.clone();
11531226
addrs_to_encode.sort_unstable_by(|a, b| { a.get_id().cmp(&b.get_id()) });
11541227
addrs_to_encode.dedup_by(|a, b| { a.get_id() == b.get_id() });
1155-
for addr in addrs_to_encode.iter() {
1156-
match addr {
1157-
&NetAddress::IPv4{addr, port} => {
1158-
addr_slice.push(1);
1159-
addr_slice.extend_from_slice(&addr);
1160-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1161-
},
1162-
&NetAddress::IPv6{addr, port} => {
1163-
addr_slice.push(2);
1164-
addr_slice.extend_from_slice(&addr);
1165-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1166-
},
1167-
&NetAddress::OnionV2{addr, port} => {
1168-
addr_slice.push(3);
1169-
addr_slice.extend_from_slice(&addr);
1170-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1171-
},
1172-
&NetAddress::OnionV3{ed25519_pubkey, checksum, version, port} => {
1173-
addr_slice.push(4);
1174-
addr_slice.extend_from_slice(&ed25519_pubkey);
1175-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(checksum));
1176-
addr_slice.push(version);
1177-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1178-
},
1179-
}
1228+
(addrs_to_encode.len() as u64).write(w)?;
1229+
for addr in addrs_to_encode {
1230+
addr.write(w)?;
11801231
}
1181-
((addr_slice.len() + self.excess_address_data.len()) as u16).write(w)?;
1182-
w.write_all(&addr_slice[..])?;
1232+
(self.excess_address_data.len() as u64).write(w)?;
11831233
w.write_all(&self.excess_address_data[..])?;
1234+
(self.excess_data.len() as u64).write(w)?;
11841235
w.write_all(&self.excess_data[..])?;
11851236
Ok(())
11861237
}
@@ -1198,112 +1249,33 @@ impl<R: Read> Readable<R> for UnsignedNodeAnnouncement {
11981249
r.read_exact(&mut rgb)?;
11991250
let alias: [u8; 32] = Readable::read(r)?;
12001251

1201-
let addrlen: u16 = Readable::read(r)?;
1202-
let mut addr_readpos = 0;
1203-
let mut addresses = Vec::with_capacity(4);
1204-
let mut f: u8 = 0;
1205-
let mut excess = 0;
1206-
loop {
1207-
if addrlen <= addr_readpos { break; }
1208-
f = Readable::read(r)?;
1209-
match f {
1210-
1 => {
1211-
if addresses.len() > 0 {
1212-
return Err(DecodeError::ExtraAddressesPerType);
1213-
}
1214-
if addrlen < addr_readpos + 1 + 6 {
1215-
return Err(DecodeError::BadLengthDescriptor);
1216-
}
1217-
addresses.push(NetAddress::IPv4 {
1218-
addr: {
1219-
let mut addr = [0; 4];
1220-
r.read_exact(&mut addr)?;
1221-
addr
1222-
},
1223-
port: Readable::read(r)?,
1224-
});
1225-
addr_readpos += 1 + 6
1226-
},
1227-
2 => {
1228-
if addresses.len() > 1 || (addresses.len() == 1 && addresses[0].get_id() != 1) {
1229-
return Err(DecodeError::ExtraAddressesPerType);
1230-
}
1231-
if addrlen < addr_readpos + 1 + 18 {
1232-
return Err(DecodeError::BadLengthDescriptor);
1233-
}
1234-
addresses.push(NetAddress::IPv6 {
1235-
addr: {
1236-
let mut addr = [0; 16];
1237-
r.read_exact(&mut addr)?;
1238-
addr
1239-
},
1240-
port: Readable::read(r)?,
1241-
});
1242-
addr_readpos += 1 + 18
1243-
},
1244-
3 => {
1245-
if addresses.len() > 2 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 2) {
1246-
return Err(DecodeError::ExtraAddressesPerType);
1247-
}
1248-
if addrlen < addr_readpos + 1 + 12 {
1249-
return Err(DecodeError::BadLengthDescriptor);
1250-
}
1251-
addresses.push(NetAddress::OnionV2 {
1252-
addr: {
1253-
let mut addr = [0; 10];
1254-
r.read_exact(&mut addr)?;
1255-
addr
1256-
},
1257-
port: Readable::read(r)?,
1258-
});
1259-
addr_readpos += 1 + 12
1260-
},
1261-
4 => {
1262-
if addresses.len() > 3 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 3) {
1263-
return Err(DecodeError::ExtraAddressesPerType);
1264-
}
1265-
if addrlen < addr_readpos + 1 + 37 {
1266-
return Err(DecodeError::BadLengthDescriptor);
1267-
}
1268-
addresses.push(NetAddress::OnionV3 {
1269-
ed25519_pubkey: Readable::read(r)?,
1270-
checksum: Readable::read(r)?,
1271-
version: Readable::read(r)?,
1272-
port: Readable::read(r)?,
1273-
});
1274-
addr_readpos += 1 + 37
1275-
},
1276-
_ => { excess = 1; break; }
1277-
}
1252+
let addresses_count: u64 = Readable::read(r)?;
1253+
let mut addresses = Vec::with_capacity(addresses_count as usize);
1254+
for _ in 0..addresses_count {
1255+
addresses.push(Readable::read(r)?);
12781256
}
12791257

1280-
let mut excess_data = vec![];
1281-
let excess_address_data = if addr_readpos < addrlen {
1282-
let mut excess_address_data = vec![0; (addrlen - addr_readpos) as usize];
1283-
r.read_exact(&mut excess_address_data[excess..])?;
1284-
if excess == 1 {
1285-
excess_address_data[0] = f;
1286-
}
1287-
excess_address_data
1288-
} else {
1289-
if excess == 1 {
1290-
excess_data.push(f);
1291-
}
1292-
Vec::new()
1293-
};
1258+
let excess_address_data_count: u64 = Readable::read(r)?;
1259+
let mut excess_address_data = Vec::with_capacity(excess_address_data_count as usize);
1260+
for _ in 0..excess_address_data_count {
1261+
excess_address_data.push(Readable::read(r)?);
1262+
}
1263+
1264+
let excess_data_count: u64 = Readable::read(r)?;
1265+
let mut excess_data = Vec::with_capacity(excess_data_count as usize);
1266+
for _ in 0..excess_data_count {
1267+
excess_data.push(Readable::read(r)?);
1268+
}
12941269

12951270
Ok(UnsignedNodeAnnouncement {
1296-
features: features,
1297-
timestamp: timestamp,
1298-
node_id: node_id,
1299-
rgb: rgb,
1300-
alias: alias,
1301-
addresses: addresses,
1302-
excess_address_data: excess_address_data,
1303-
excess_data: {
1304-
r.read_to_end(&mut excess_data)?;
1305-
excess_data
1306-
},
1271+
features,
1272+
timestamp,
1273+
node_id,
1274+
rgb,
1275+
alias,
1276+
addresses,
1277+
excess_address_data,
1278+
excess_data
13071279
})
13081280
}
13091281
}

0 commit comments

Comments
 (0)