Skip to content

Commit 779ff67

Browse files
authored
Merge pull request #651 from naumenkogs/2020-06-routing-data-improvements
Routing improvements
2 parents ed84b02 + dd0e4f4 commit 779ff67

File tree

14 files changed

+194
-45
lines changed

14 files changed

+194
-45
lines changed

fuzz/src/bin/gen_target.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ GEN_TEST msg_update_fee msg_targets::
3131
GEN_TEST msg_update_fulfill_htlc msg_targets::
3232

3333
GEN_TEST msg_channel_announcement msg_targets::
34-
GEN_TEST msg_channel_update msg_targets::
3534
GEN_TEST msg_node_announcement msg_targets::
3635

3736
GEN_TEST msg_update_add_htlc msg_targets::
3837
GEN_TEST msg_error_message msg_targets::
39-
GEN_TEST msg_onion_hop_data msg_targets::
38+
GEN_TEST msg_channel_update msg_targets::
4039

40+
GEN_TEST msg_onion_hop_data msg_targets::
4141
GEN_TEST msg_ping msg_targets::
4242
GEN_TEST msg_pong msg_targets::

fuzz/src/msg_targets/gen_target.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ GEN_TEST UpdateFee test_msg ""
2929
GEN_TEST UpdateFulfillHTLC test_msg ""
3030

3131
GEN_TEST ChannelAnnouncement test_msg_exact ""
32-
GEN_TEST ChannelUpdate test_msg_exact ""
3332
GEN_TEST NodeAnnouncement test_msg_exact ""
3433

3534
GEN_TEST UpdateAddHTLC test_msg_hole ", 85, 33"
3635
GEN_TEST ErrorMessage test_msg_hole ", 32, 2"
36+
GEN_TEST ChannelUpdate test_msg_hole ", 108, 1"
3737

3838
GEN_TEST Init test_msg_simple ""
3939
GEN_TEST OnionHopData test_msg_simple ""

fuzz/src/msg_targets/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ pub mod msg_update_fail_malformed_htlc;
1616
pub mod msg_update_fee;
1717
pub mod msg_update_fulfill_htlc;
1818
pub mod msg_channel_announcement;
19-
pub mod msg_channel_update;
2019
pub mod msg_node_announcement;
2120
pub mod msg_update_add_htlc;
2221
pub mod msg_error_message;
22+
pub mod msg_channel_update;
2323
pub mod msg_init;
2424
pub mod msg_onion_hop_data;
2525
pub mod msg_ping;

fuzz/src/msg_targets/msg_channel_update.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ use utils::test_logger;
88

99
#[inline]
1010
pub fn msg_channel_update_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
11-
test_msg_exact!(msgs::ChannelUpdate, data);
11+
test_msg_hole!(msgs::ChannelUpdate, data, 108, 1);
1212
}
1313

1414
#[no_mangle]
1515
pub extern "C" fn msg_channel_update_run(data: *const u8, datalen: usize) {
1616
let data = unsafe { std::slice::from_raw_parts(data, datalen) };
17-
test_msg_exact!(msgs::ChannelUpdate, data);
17+
test_msg_hole!(msgs::ChannelUpdate, data, 108, 1);
1818
}

fuzz/src/msg_targets/utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ macro_rules! test_msg_exact {
7878
}
7979
}
8080

81-
// Tests a message that must survive roundtrip exactly, modulo one "hole" which may be set to 0s on
82-
// re-serialization.
81+
// Tests a message that must survive roundtrip exactly, modulo one "hole" which may be set to
82+
// any value on re-serialization.
8383
#[macro_export]
8484
macro_rules! test_msg_hole {
8585
($MsgType: path, $data: ident, $hole: expr, $hole_len: expr) => {

fuzz/src/router.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,12 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
172172
let _ = net_graph_msg_handler.handle_channel_announcement(&decode_msg_with_len16!(msgs::ChannelAnnouncement, 64*4, 32+8+33*4));
173173
},
174174
2 => {
175-
let _ = net_graph_msg_handler.handle_channel_update(&decode_msg!(msgs::ChannelUpdate, 128));
175+
let _ = net_graph_msg_handler.handle_channel_update(&decode_msg!(msgs::ChannelUpdate, 136));
176176
},
177177
3 => {
178178
match get_slice!(1)[0] {
179179
0 => {
180-
net_graph_msg_handler.handle_htlc_fail_channel_update(&msgs::HTLCFailChannelUpdate::ChannelUpdateMessage {msg: decode_msg!(msgs::ChannelUpdate, 128)});
180+
net_graph_msg_handler.handle_htlc_fail_channel_update(&msgs::HTLCFailChannelUpdate::ChannelUpdateMessage {msg: decode_msg!(msgs::ChannelUpdate, 136)});
181181
},
182182
1 => {
183183
let short_channel_id = slice_to_be64(get_slice!(8));

fuzz/targets.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ void msg_update_fail_malformed_htlc_run(const unsigned char* data, size_t data_l
2222
void msg_update_fee_run(const unsigned char* data, size_t data_len);
2323
void msg_update_fulfill_htlc_run(const unsigned char* data, size_t data_len);
2424
void msg_channel_announcement_run(const unsigned char* data, size_t data_len);
25-
void msg_channel_update_run(const unsigned char* data, size_t data_len);
2625
void msg_node_announcement_run(const unsigned char* data, size_t data_len);
2726
void msg_update_add_htlc_run(const unsigned char* data, size_t data_len);
2827
void msg_error_message_run(const unsigned char* data, size_t data_len);
28+
void msg_channel_update_run(const unsigned char* data, size_t data_len);
2929
void msg_onion_hop_data_run(const unsigned char* data, size_t data_len);
3030
void msg_ping_run(const unsigned char* data, size_t data_len);
3131
void msg_pong_run(const unsigned char* data, size_t data_len);

lightning/src/ln/channel.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3128,6 +3128,18 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
31283128
self.our_htlc_minimum_msat
31293129
}
31303130

3131+
/// Allowed in any state (including after shutdown)
3132+
pub fn get_announced_htlc_max_msat(&self) -> u64 {
3133+
return cmp::min(
3134+
// Upper bound by capacity. We make it a bit less than full capacity to prevent attempts
3135+
// to use full capacity. This is an effort to reduce routing failures, because in many cases
3136+
// channel might have been used to route very small values (either by honest users or as DoS).
3137+
self.channel_value_satoshis * 9 / 10,
3138+
3139+
Channel::<ChanSigner>::get_our_max_htlc_value_in_flight_msat(self.channel_value_satoshis)
3140+
);
3141+
}
3142+
31313143
/// Allowed in any state (including after shutdown)
31323144
pub fn get_their_htlc_minimum_msat(&self) -> u64 {
31333145
self.our_htlc_minimum_msat

lightning/src/ln/channelmanager.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use ln::features::{InitFeatures, NodeFeatures};
3434
use routing::router::{Route, RouteHop};
3535
use ln::msgs;
3636
use ln::onion_utils;
37-
use ln::msgs::{ChannelMessageHandler, DecodeError, LightningError};
37+
use ln::msgs::{ChannelMessageHandler, DecodeError, LightningError, OptionalField};
3838
use chain::keysinterface::{ChannelKeys, KeysInterface, KeysManager, InMemoryChannelKeys};
3939
use util::config::UserConfig;
4040
use util::{byte_utils, events};
@@ -1186,7 +1186,8 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
11861186
res.extend_from_slice(&byte_utils::be32_to_array(msg.cltv_expiry));
11871187
}
11881188
else if code == 0x1000 | 20 {
1189-
res.extend_from_slice(&byte_utils::be16_to_array(chan_update.contents.flags));
1189+
// TODO: underspecified, follow https://github.com/lightningnetwork/lightning-rfc/issues/791
1190+
res.extend_from_slice(&byte_utils::be16_to_array(0));
11901191
}
11911192
res.extend_from_slice(&chan_update.encode_with_len()[..]);
11921193
}
@@ -1212,9 +1213,10 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
12121213
chain_hash: self.genesis_hash,
12131214
short_channel_id: short_channel_id,
12141215
timestamp: chan.get_update_time_counter(),
1215-
flags: (!were_node_one) as u16 | ((!chan.is_live() as u16) << 1),
1216+
flags: (!were_node_one) as u8 | ((!chan.is_live() as u8) << 1),
12161217
cltv_expiry_delta: CLTV_EXPIRY_DELTA,
12171218
htlc_minimum_msat: chan.get_our_htlc_minimum_msat(),
1219+
htlc_maximum_msat: OptionalField::Present(chan.get_announced_htlc_max_msat()),
12181220
fee_base_msat: chan.get_our_fee_base_msat(&self.fee_estimator),
12191221
fee_proportional_millionths: chan.get_fee_proportional_millionths(),
12201222
excess_data: Vec::new(),
@@ -2494,7 +2496,8 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
24942496
let reason = if let Ok(upd) = self.get_channel_update(chan) {
24952497
onion_utils::build_first_hop_failure_packet(incoming_shared_secret, error_code, &{
24962498
let mut res = Vec::with_capacity(8 + 128);
2497-
res.extend_from_slice(&byte_utils::be16_to_array(upd.contents.flags));
2499+
// TODO: underspecified, follow https://github.com/lightningnetwork/lightning-rfc/issues/791
2500+
res.extend_from_slice(&byte_utils::be16_to_array(0));
24982501
res.extend_from_slice(&upd.encode_with_len()[..]);
24992502
res
25002503
}[..])

lightning/src/ln/functional_tests.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use ln::{chan_utils, onion_utils};
1515
use routing::router::{Route, RouteHop, get_route};
1616
use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
1717
use ln::msgs;
18-
use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler,HTLCFailChannelUpdate, ErrorAction};
18+
use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler,HTLCFailChannelUpdate, ErrorAction, OptionalField};
1919
use util::enforcing_trait_impls::EnforcingChannelKeys;
2020
use util::{byte_utils, test_utils};
2121
use util::events::{Event, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
@@ -6058,6 +6058,7 @@ impl msgs::ChannelUpdate {
60586058
flags: 0,
60596059
cltv_expiry_delta: 0,
60606060
htlc_minimum_msat: 0,
6061+
htlc_maximum_msat: OptionalField::Absent,
60616062
fee_base_msat: 0,
60626063
fee_proportional_millionths: 0,
60636064
excess_data: vec![],

0 commit comments

Comments
 (0)