Skip to content

Commit e3fe348

Browse files
committed
Read ChannelUpdateInfo without failing.
1 parent 2634839 commit e3fe348

File tree

1 file changed

+132
-69
lines changed

1 file changed

+132
-69
lines changed

lightning/src/routing/gossip.rs

Lines changed: 132 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -635,64 +635,84 @@ impl Writeable for ChannelUpdateInfo {
635635
(2, self.enabled, required),
636636
(4, self.cltv_expiry_delta, required),
637637
(6, self.htlc_minimum_msat, required),
638-
(8, self.htlc_maximum_msat, required),
638+
(8, Some(self.htlc_maximum_msat), required),
639639
(10, self.fees, required),
640640
(12, self.last_update_message, required),
641641
});
642642
Ok(())
643643
}
644-
645-
#[inline]
646-
fn serialized_length(&self) -> usize {
647-
use util::ser::BigSize;
648-
let len = {
649-
#[allow(unused_mut)]
650-
let mut len = ::util::ser::LengthCalculatingWriter(0);
651-
get_varint_length_prefixed_tlv_length!(len, 0, self.last_update, required);
652-
get_varint_length_prefixed_tlv_length!(len, 2, self.enabled, required);
653-
get_varint_length_prefixed_tlv_length!(len, 4, self.cltv_expiry_delta, required);
654-
get_varint_length_prefixed_tlv_length!(len, 6, self.htlc_minimum_msat, required);
655-
get_varint_length_prefixed_tlv_length!(len, 8, self.htlc_maximum_msat, required);
656-
get_varint_length_prefixed_tlv_length!(len, 10, self.fees, required);
657-
get_varint_length_prefixed_tlv_length!(len, 12, self.last_update_message, required);
658-
len.0
659-
};
660-
let mut len_calc = ::util::ser::LengthCalculatingWriter(0);
661-
BigSize(len as u64).write(&mut len_calc).expect("No in-memory data may fail to serialize");
662-
len + len_calc.0
663-
}
664-
665644
}
666645

667646
impl MaybeReadable for ChannelUpdateInfo {
668647
fn read<R: io::Read>(reader: &mut R) -> Result<Option<Self>, DecodeError> {
669-
init_tlv_field_var!(last_update, required);
670-
init_tlv_field_var!(enabled, required);
671-
init_tlv_field_var!(cltv_expiry_delta, required);
672-
init_tlv_field_var!(htlc_minimum_msat, required);
673-
init_tlv_field_var!(htlc_maximum_msat, required);
674-
init_tlv_field_var!(fees, required);
675-
init_tlv_field_var!(last_update_message, required);
648+
macro_rules! read_channel_update_tlv_fields {
649+
($reader: expr, {$(($type: expr, $field: ident)),* $(,)*}) => {{
650+
let mut stream_ref = $reader;
651+
$({
652+
if stream_ref.bytes_remain() {
653+
let tlv_type_res: Result<::util::ser::BigSize, DecodeError> = ::util::ser::Readable::read(stream_ref);
654+
$field = if let Ok(ref tlv_type) = tlv_type_res {
655+
println!("GOT TYPE: {}", tlv_type.0);
656+
assert_eq!(tlv_type.0, $type);
657+
658+
let tlv_len_res: Result<::util::ser::BigSize, DecodeError> = ::util::ser::Readable::read(&mut stream_ref);
659+
if let Ok(ref tlv_len) = tlv_len_res {
660+
println!("GOT LEN: {}", tlv_len.0);
661+
let mut s = ::util::ser::FixedLengthReader::new(&mut stream_ref, tlv_len.0);
662+
let tlv_value_res = ::util::ser::Readable::read(&mut s);
663+
let _ = s.eat_remaining();
664+
tlv_value_res.ok()
665+
} else {
666+
None
667+
}
668+
} else {
669+
None
670+
};
671+
}
672+
})*
673+
}};
674+
}
676675

677-
read_tlv_fields!(reader, {
678-
(0, last_update, required),
679-
(2, enabled, required),
680-
(4, cltv_expiry_delta, required),
681-
(6, htlc_minimum_msat, required),
682-
(8, htlc_maximum_msat, required),
683-
(10, fees, required),
684-
(12, last_update_message, required)
676+
let outer_tlv_len: ::util::ser::BigSize = ::util::ser::Readable::read(reader)?;
677+
if outer_tlv_len.0 == 0 {
678+
return Ok(None);
679+
}
680+
let mut outer_fixed_reader = ::util::ser::FixedLengthReader::new(reader, outer_tlv_len.0);
681+
682+
683+
let mut last_update: Option<u32> = None;
684+
let mut enabled: Option<bool> = None;
685+
let mut cltv_expiry_delta: Option<u16> = None;
686+
let mut htlc_minimum_msat: Option<u64> = None;
687+
let mut htlc_maximum_msat: Option<Option<u64>> = None;
688+
let mut fees: Option<RoutingFees> = None;
689+
let mut last_update_message: Option<Option<ChannelUpdate>> = None;
690+
691+
read_channel_update_tlv_fields!(&mut outer_fixed_reader, {
692+
(0, last_update),
693+
(2, enabled),
694+
(4, cltv_expiry_delta),
695+
(6, htlc_minimum_msat),
696+
(8, htlc_maximum_msat),
697+
(10, fees),
698+
(12, last_update_message),
685699
});
686-
687-
if let Some(htlc_maximum_msat) = htlc_maximum_msat.0 {
700+
let decoding_success = last_update.is_some() && enabled.is_some() &&
701+
cltv_expiry_delta.is_some() && htlc_minimum_msat.is_some() &&
702+
htlc_maximum_msat.is_some() && fees.is_some() &&
703+
last_update_message.is_some();
704+
705+
outer_fixed_reader.eat_remaining()?;
706+
if decoding_success {
707+
println!("DECODING SUCCESS");
688708
Ok(Some(ChannelUpdateInfo {
689-
last_update: init_tlv_based_struct_field!(last_update, required),
690-
enabled: init_tlv_based_struct_field!(enabled, required),
691-
cltv_expiry_delta: init_tlv_based_struct_field!(cltv_expiry_delta, required),
692-
htlc_minimum_msat: init_tlv_based_struct_field!(htlc_minimum_msat, required),
693-
htlc_maximum_msat,
694-
fees: init_tlv_based_struct_field!(fees, required),
695-
last_update_message: init_tlv_based_struct_field!(last_update_message, required),
709+
last_update: last_update.unwrap(),
710+
enabled: enabled.unwrap(),
711+
cltv_expiry_delta: cltv_expiry_delta.unwrap(),
712+
htlc_minimum_msat: htlc_minimum_msat.unwrap(),
713+
htlc_maximum_msat: htlc_maximum_msat.unwrap().unwrap(),
714+
fees: fees.unwrap(),
715+
last_update_message: last_update_message.unwrap(),
696716
}))
697717
} else {
698718
Ok(None)
@@ -791,28 +811,6 @@ impl Writeable for ChannelInfo {
791811
});
792812
Ok(())
793813
}
794-
795-
#[inline]
796-
fn serialized_length(&self) -> usize {
797-
use util::ser::BigSize;
798-
let len = {
799-
#[allow(unused_mut)]
800-
let mut len = ::util::ser::LengthCalculatingWriter(0);
801-
get_varint_length_prefixed_tlv_length!(len, 0, self.features, required);
802-
get_varint_length_prefixed_tlv_length!(len, 1, self.announcement_received_time, (default_value, 0));
803-
get_varint_length_prefixed_tlv_length!(len, 2, self.node_one, required);
804-
get_varint_length_prefixed_tlv_length!(len, 4, self.one_to_two, required);
805-
get_varint_length_prefixed_tlv_length!(len, 6, self.node_two, required);
806-
get_varint_length_prefixed_tlv_length!(len, 8, self.two_to_one, required);
807-
get_varint_length_prefixed_tlv_length!(len, 10, self.capacity_sats, required);
808-
get_varint_length_prefixed_tlv_length!(len, 12, self.announcement_message, required);
809-
len.0
810-
};
811-
let mut len_calc = ::util::ser::LengthCalculatingWriter(0);
812-
BigSize(len as u64).write(&mut len_calc).expect("No in-memory data may fail to serialize");
813-
len + len_calc.0
814-
}
815-
816814
}
817815

818816
impl Readable for ChannelInfo {
@@ -1799,7 +1797,7 @@ mod tests {
17991797
use chain;
18001798
use ln::PaymentHash;
18011799
use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
1802-
use routing::gossip::{P2PGossipSync, NetworkGraph, NetworkUpdate, NodeAlias, MAX_EXCESS_BYTES_FOR_RELAY};
1800+
use routing::gossip::{P2PGossipSync, NetworkGraph, NetworkUpdate, NodeAlias, MAX_EXCESS_BYTES_FOR_RELAY, NodeId, RoutingFees, ChannelUpdateInfo, ChannelInfo};
18031801
use ln::msgs::{Init, RoutingMessageHandler, UnsignedNodeAnnouncement, NodeAnnouncement,
18041802
UnsignedChannelAnnouncement, ChannelAnnouncement, UnsignedChannelUpdate, ChannelUpdate,
18051803
ReplyChannelRange, QueryChannelRange, QueryShortChannelIds, MAX_VALUE_MSAT};
@@ -2925,6 +2923,71 @@ mod tests {
29252923
assert_eq!(format_bytes_alias(b"\xFFI <heart>\0LDK!"), "\u{FFFD}I <heart>");
29262924
assert_eq!(format_bytes_alias(b"\xFFI <heart>\tLDK!"), "\u{FFFD}I <heart>\u{FFFD}LDK!");
29272925
}
2926+
2927+
#[test]
2928+
fn written_channel_info_is_readable() {
2929+
let chanmon_cfgs = ::ln::functional_test_utils::create_chanmon_cfgs(2);
2930+
let node_cfgs = ::ln::functional_test_utils::create_node_cfgs(2, &chanmon_cfgs);
2931+
let node_chanmgrs = ::ln::functional_test_utils::create_node_chanmgrs(2, &node_cfgs, &[None, None, None, None]);
2932+
let nodes = ::ln::functional_test_utils::create_network(2, &node_cfgs, &node_chanmgrs);
2933+
2934+
// First make sure we can encode/decode ChannelUpdateInfo.
2935+
let chan_update_info = ChannelUpdateInfo {
2936+
last_update: 23,
2937+
enabled: true,
2938+
cltv_expiry_delta: 42,
2939+
htlc_minimum_msat: 1234,
2940+
htlc_maximum_msat: 5678,
2941+
fees: RoutingFees { base_msat: 9, proportional_millionths: 10 },
2942+
last_update_message: None,
2943+
};
2944+
2945+
let mut buf: Vec<u8> = Vec::new();
2946+
assert!(chan_update_info.write(&mut buf).is_ok());
2947+
2948+
let read_chan_update_info_result: Option<ChannelUpdateInfo> = ::util::ser::MaybeReadable::read(&mut buf.as_slice()).unwrap();
2949+
if let Some(read_chan_update_info) = read_chan_update_info_result {
2950+
assert_eq!(chan_update_info, read_chan_update_info);
2951+
} else {
2952+
panic!();
2953+
}
2954+
2955+
// Then check we can encode/decode ChannelInfo without ChannelUpdateInfo fields present.
2956+
let chan_info_none_updates = ChannelInfo {
2957+
features: ChannelFeatures::known(),
2958+
node_one: NodeId::from_pubkey(&nodes[0].node.get_our_node_id()),
2959+
one_to_two: None,
2960+
node_two: NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
2961+
two_to_one: None,
2962+
capacity_sats: None,
2963+
announcement_message: None,
2964+
announcement_received_time: 87654,
2965+
};
2966+
2967+
let mut buf: Vec<u8> = Vec::new();
2968+
assert!(chan_info_none_updates.write(&mut buf).is_ok());
2969+
2970+
let read_chan_info: ChannelInfo = ::util::ser::Readable::read(&mut buf.as_slice()).unwrap();
2971+
assert_eq!(chan_info_none_updates, read_chan_info);
2972+
2973+
// Finally check we can encode/decode ChannelInfo with ChannelUpdateInfo fields present.
2974+
let chan_info_some_updates = ChannelInfo {
2975+
features: ChannelFeatures::known(),
2976+
node_one: NodeId::from_pubkey(&nodes[0].node.get_our_node_id()),
2977+
one_to_two: Some(chan_update_info.clone()),
2978+
node_two: NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
2979+
two_to_one: Some(chan_update_info.clone()),
2980+
capacity_sats: None,
2981+
announcement_message: None,
2982+
announcement_received_time: 87654,
2983+
};
2984+
2985+
let mut buf: Vec<u8> = Vec::new();
2986+
assert!(chan_info_some_updates.write(&mut buf).is_ok());
2987+
2988+
let read_chan_info: ChannelInfo = ::util::ser::Readable::read(&mut buf.as_slice()).unwrap();
2989+
assert_eq!(chan_info_some_updates, read_chan_info);
2990+
}
29282991
}
29292992

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

0 commit comments

Comments
 (0)