Skip to content

Commit f5c7fc0

Browse files
committed
Remove node info addresses
1 parent 54f8895 commit f5c7fc0

File tree

1 file changed

+54
-24
lines changed

1 file changed

+54
-24
lines changed

lightning/src/routing/gossip.rs

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,23 +1046,50 @@ pub struct NodeAnnouncementInfo {
10461046
/// May be invalid or malicious (eg control chars),
10471047
/// should not be exposed to the user.
10481048
pub alias: NodeAlias,
1049-
/// Internet-level addresses via which one can connect to the node
1050-
pub addresses: Vec<NetAddress>,
10511049
/// An initial announcement of the node
10521050
/// Mostly redundant with the data we store in fields explicitly.
10531051
/// Everything else is useful only for sending out for initial routing sync.
10541052
/// Not stored if contains excess data to prevent DoS.
10551053
pub announcement_message: Option<NodeAnnouncement>
10561054
}
10571055

1058-
impl_writeable_tlv_based!(NodeAnnouncementInfo, {
1059-
(0, features, required),
1060-
(2, last_update, required),
1061-
(4, rgb, required),
1062-
(6, alias, required),
1063-
(8, announcement_message, option),
1064-
(10, addresses, vec_type),
1065-
});
1056+
impl NodeAnnouncementInfo {
1057+
/// Internet-level addresses via which one can connect to the node
1058+
pub fn addresses(&self) -> Vec<NetAddress> {
1059+
self.announcement_message.as_ref()
1060+
.map(|msg| msg.contents.addresses.clone())
1061+
.unwrap_or_default()
1062+
}
1063+
}
1064+
1065+
impl Writeable for NodeAnnouncementInfo {
1066+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
1067+
write_tlv_fields!(writer, {
1068+
(0, self.features, required),
1069+
(2, self.last_update, required),
1070+
(4, self.rgb, required),
1071+
(6, self.alias, required),
1072+
(8, self.announcement_message, option),
1073+
});
1074+
Ok(())
1075+
}
1076+
}
1077+
1078+
impl Readable for NodeAnnouncementInfo {
1079+
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
1080+
_init_and_read_tlv_fields!(reader, {
1081+
(0, features, required),
1082+
(2, last_update, required),
1083+
(4, rgb, required),
1084+
(6, alias, required),
1085+
(8, announcement_message, option),
1086+
(10, _addresses, vec_type), // deprecated, not written anymore
1087+
});
1088+
let _: Option<Vec<NetAddress>> = _addresses;
1089+
Ok(Self { features: features.0.unwrap(), last_update: last_update.0.unwrap(), rgb: rgb.0.unwrap(),
1090+
alias: alias.0.unwrap(), announcement_message })
1091+
}
1092+
}
10661093

10671094
/// A user-defined name for a node, which may be used when displaying the node in a graph.
10681095
///
@@ -1133,7 +1160,7 @@ impl Writeable for NodeInfo {
11331160
}
11341161
}
11351162

1136-
// A wrapper allowing for the optional deseralization of `NodeAnnouncementInfo`. Utilizing this is
1163+
// A wrapper allowing for the optional deserialization of `NodeAnnouncementInfo`. Utilizing this is
11371164
// necessary to maintain compatibility with previous serializations of `NetAddress` that have an
11381165
// invalid hostname set. We ignore and eat all errors until we are either able to read a
11391166
// `NodeAnnouncementInfo` or hit a `ShortRead`, i.e., read the TLV field to the end.
@@ -1362,7 +1389,6 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
13621389
last_update: msg.timestamp,
13631390
rgb: msg.rgb,
13641391
alias: NodeAlias(msg.alias),
1365-
addresses: msg.addresses.clone(),
13661392
announcement_message: if should_relay { full_msg.cloned() } else { None },
13671393
});
13681394

@@ -1916,12 +1942,8 @@ impl ReadOnlyNetworkGraph<'_> {
19161942
/// Returns None if the requested node is completely unknown,
19171943
/// or if node announcement for the node was never received.
19181944
pub fn get_addresses(&self, pubkey: &PublicKey) -> Option<Vec<NetAddress>> {
1919-
if let Some(node) = self.nodes.get(&NodeId::from_pubkey(&pubkey)) {
1920-
if let Some(node_info) = node.announcement_info.as_ref() {
1921-
return Some(node_info.addresses.clone())
1922-
}
1923-
}
1924-
None
1945+
self.nodes.get(&NodeId::from_pubkey(&pubkey))
1946+
.and_then(|node| node.announcement_info.as_ref().map(|ann| ann.addresses()))
19251947
}
19261948
}
19271949

@@ -1938,7 +1960,7 @@ pub(crate) mod tests {
19381960
ReplyChannelRange, QueryChannelRange, QueryShortChannelIds, MAX_VALUE_MSAT};
19391961
use crate::util::config::UserConfig;
19401962
use crate::util::test_utils;
1941-
use crate::util::ser::{ReadableArgs, Writeable};
1963+
use crate::util::ser::{ReadableArgs, Readable, Writeable};
19421964
use crate::util::events::{MessageSendEvent, MessageSendEventsProvider};
19431965
use crate::util::scid_utils::scid_from_parts;
19441966

@@ -3244,23 +3266,22 @@ pub(crate) mod tests {
32443266

32453267
#[test]
32463268
fn node_info_is_readable() {
3247-
use std::convert::TryFrom;
3248-
32493269
// 1. Check we can read a valid NodeAnnouncementInfo and fail on an invalid one
3250-
let valid_netaddr = crate::ln::msgs::NetAddress::Hostname { hostname: crate::util::ser::Hostname::try_from("A".to_string()).unwrap(), port: 1234 };
3270+
let announcement_message = hex::decode("d977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a000122013413a7031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2020201010101010101010101010101010101010101010101010101010101010101010000701fffefdfc2607").unwrap();
3271+
let announcement_message = NodeAnnouncement::read(&mut announcement_message.as_slice()).unwrap();
32513272
let valid_node_ann_info = NodeAnnouncementInfo {
32523273
features: channelmanager::provided_node_features(&UserConfig::default()),
32533274
last_update: 0,
32543275
rgb: [0u8; 3],
32553276
alias: NodeAlias([0u8; 32]),
3256-
addresses: vec![valid_netaddr],
3257-
announcement_message: None,
3277+
announcement_message: Some(announcement_message)
32583278
};
32593279

32603280
let mut encoded_valid_node_ann_info = Vec::new();
32613281
assert!(valid_node_ann_info.write(&mut encoded_valid_node_ann_info).is_ok());
32623282
let read_valid_node_ann_info: NodeAnnouncementInfo = crate::util::ser::Readable::read(&mut encoded_valid_node_ann_info.as_slice()).unwrap();
32633283
assert_eq!(read_valid_node_ann_info, valid_node_ann_info);
3284+
assert_eq!(read_valid_node_ann_info.addresses().len(), 1);
32643285

32653286
let encoded_invalid_node_ann_info = hex::decode("3f0009000788a000080a51a20204000000000403000000062000000000000000000000000000000000000000000000000000000000000000000a0505014004d2").unwrap();
32663287
let read_invalid_node_ann_info_res: Result<NodeAnnouncementInfo, crate::ln::msgs::DecodeError> = crate::util::ser::Readable::read(&mut encoded_invalid_node_ann_info.as_slice());
@@ -3281,6 +3302,15 @@ pub(crate) mod tests {
32813302
let read_invalid_node_info: NodeInfo = crate::util::ser::Readable::read(&mut encoded_invalid_node_info_hex.as_slice()).unwrap();
32823303
assert_eq!(read_invalid_node_info.announcement_info, None);
32833304
}
3305+
3306+
#[test]
3307+
fn test_node_info_keeps_compatibility() {
3308+
let old_ann_info_with_addresses = hex::decode("3f0009000708a000080a51220204000000000403000000062000000000000000000000000000000000000000000000000000000000000000000a0505014104d2").unwrap();
3309+
let ann_info_with_addresses = NodeAnnouncementInfo::read(&mut old_ann_info_with_addresses.as_slice())
3310+
.expect("to be able to read an old NodeAnnouncementInfo with addresses");
3311+
// This serialized info has an address field but no announcement_message, therefore the addresses returned by our function will still be empty
3312+
assert!(ann_info_with_addresses.addresses().is_empty());
3313+
}
32843314
}
32853315

32863316
#[cfg(all(test, feature = "_bench_unstable"))]

0 commit comments

Comments
 (0)