Skip to content

Commit c34ab42

Browse files
committed
Penalize failed channels in Scorer
As payments fail, the channel responsible for the failure may be penalized. Implement Scorer::payment_path_failed to penalize the failed channel using a configured penalty. As time passes, the penalty is reduced using exponential decay, though penalties will accumulate if the channel continues to fail. The decay interval is also configurable.
1 parent 7a8954e commit c34ab42

File tree

9 files changed

+156
-61
lines changed

9 files changed

+156
-61
lines changed

fuzz/src/full_stack.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
382382
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret());
383383
let network_graph = NetworkGraph::new(genesis_block(network).block_hash());
384384
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(network_graph, None, Arc::clone(&logger)));
385-
let scorer = Scorer::new(0);
385+
let scorer = Scorer::with_fixed_penalty(0);
386386

387387
let peers = RefCell::new([false; 256]);
388388
let mut loss_detector = MoneyLossDetector::new(&peers, channelmanager.clone(), monitor.clone(), PeerManager::new(MessageHandler {

fuzz/src/router.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
248248
}]));
249249
}
250250
}
251-
let scorer = Scorer::new(0);
251+
let scorer = Scorer::with_fixed_penalty(0);
252252
for target in node_pks.iter() {
253253
let params = RouteParameters {
254254
payee: Payee::new(*target).with_route_hints(last_hops.clone()),

lightning-invoice/src/utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ mod test {
183183
let first_hops = nodes[0].node.list_usable_channels();
184184
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
185185
let logger = test_utils::TestLogger::new();
186-
let scorer = Scorer::new(0);
186+
let scorer = Scorer::with_fixed_penalty(0);
187187
let route = find_route(
188188
&nodes[0].node.get_our_node_id(), &params, network_graph,
189189
Some(&first_hops.iter().collect::<Vec<_>>()), &logger, &scorer,

lightning/src/ln/channelmanager.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6279,7 +6279,7 @@ mod tests {
62796279
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
62806280
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
62816281
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
6282-
let scorer = Scorer::new(0);
6282+
let scorer = Scorer::with_fixed_penalty(0);
62836283

62846284
// To start (1), send a regular payment but don't claim it.
62856285
let expected_route = [&nodes[1]];
@@ -6384,7 +6384,7 @@ mod tests {
63846384
};
63856385
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
63866386
let first_hops = nodes[0].node.list_usable_channels();
6387-
let scorer = Scorer::new(0);
6387+
let scorer = Scorer::with_fixed_penalty(0);
63886388
let route = find_route(
63896389
&payer_pubkey, &params, network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
63906390
nodes[0].logger, &scorer
@@ -6427,7 +6427,7 @@ mod tests {
64276427
};
64286428
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
64296429
let first_hops = nodes[0].node.list_usable_channels();
6430-
let scorer = Scorer::new(0);
6430+
let scorer = Scorer::with_fixed_penalty(0);
64316431
let route = find_route(
64326432
&payer_pubkey, &params, network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
64336433
nodes[0].logger, &scorer
@@ -6602,7 +6602,7 @@ pub mod bench {
66026602
let usable_channels = $node_a.list_usable_channels();
66036603
let payee = Payee::new($node_b.get_our_node_id())
66046604
.with_features(InvoiceFeatures::known());
6605-
let scorer = Scorer::new(0);
6605+
let scorer = Scorer::with_fixed_penalty(0);
66066606
let route = get_route(&$node_a.get_our_node_id(), &payee, &dummy_graph,
66076607
Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), 10_000, TEST_FINAL_CLTV, &logger_a, &scorer).unwrap();
66086608

lightning/src/ln/functional_test_utils.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ macro_rules! get_route_and_payment_hash {
10151015
.with_features($crate::ln::features::InvoiceFeatures::known())
10161016
.with_route_hints($last_hops);
10171017
let net_graph_msg_handler = &$send_node.net_graph_msg_handler;
1018-
let scorer = ::routing::scorer::Scorer::new(0);
1018+
let scorer = ::routing::scorer::Scorer::with_fixed_penalty(0);
10191019
let route = ::routing::router::get_route(
10201020
&$send_node.node.get_our_node_id(), &payee, &net_graph_msg_handler.network_graph,
10211021
Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
@@ -1339,7 +1339,7 @@ pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
13391339
let payee = Payee::new(expected_route.last().unwrap().node.get_our_node_id())
13401340
.with_features(InvoiceFeatures::known());
13411341
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
1342-
let scorer = Scorer::new(0);
1342+
let scorer = Scorer::with_fixed_penalty(0);
13431343
let route = get_route(
13441344
&origin_node.node.get_our_node_id(), &payee, &net_graph_msg_handler.network_graph,
13451345
Some(&origin_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
@@ -1358,7 +1358,7 @@ pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_rou
13581358
let payee = Payee::new(expected_route.last().unwrap().node.get_our_node_id())
13591359
.with_features(InvoiceFeatures::known());
13601360
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
1361-
let scorer = Scorer::new(0);
1361+
let scorer = Scorer::with_fixed_penalty(0);
13621362
let route = get_route(&origin_node.node.get_our_node_id(), &payee, &net_graph_msg_handler.network_graph, None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
13631363
assert_eq!(route.paths.len(), 1);
13641364
assert_eq!(route.paths[0].len(), expected_route.len());

lightning/src/ln/functional_tests.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7161,7 +7161,7 @@ fn test_check_htlc_underpaying() {
71617161
// Create some initial channels
71627162
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
71637163

7164-
let scorer = Scorer::new(0);
7164+
let scorer = Scorer::with_fixed_penalty(0);
71657165
let payee = Payee::new(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
71667166
let route = get_route(&nodes[0].node.get_our_node_id(), &payee, &nodes[0].net_graph_msg_handler.network_graph, None, 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer).unwrap();
71677167
let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
@@ -7561,7 +7561,7 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
75617561
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
75627562
// Lock HTLC in both directions (using a slightly lower CLTV delay to provide timely RBF bumps)
75637563
let payee = Payee::new(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
7564-
let scorer = Scorer::new(0);
7564+
let scorer = Scorer::with_fixed_penalty(0);
75657565
let route = get_route(&nodes[0].node.get_our_node_id(), &payee, &nodes[0].net_graph_msg_handler.network_graph,
75667566
None, 3_000_000, 50, nodes[0].logger, &scorer).unwrap();
75677567
let payment_preimage = send_along_route(&nodes[0], route, &[&nodes[1]], 3_000_000).0;
@@ -9061,7 +9061,7 @@ fn test_keysend_payments_to_public_node() {
90619061
final_value_msat: 10000,
90629062
final_cltv_expiry_delta: 40,
90639063
};
9064-
let scorer = Scorer::new(0);
9064+
let scorer = Scorer::with_fixed_penalty(0);
90659065
let route = find_route(&payer_pubkey, &params, &network_graph, None, nodes[0].logger, &scorer).unwrap();
90669066

90679067
let test_preimage = PaymentPreimage([42; 32]);
@@ -9095,7 +9095,7 @@ fn test_keysend_payments_to_private_node() {
90959095
};
90969096
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
90979097
let first_hops = nodes[0].node.list_usable_channels();
9098-
let scorer = Scorer::new(0);
9098+
let scorer = Scorer::with_fixed_penalty(0);
90999099
let route = find_route(
91009100
&payer_pubkey, &params, &network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
91019101
nodes[0].logger, &scorer

lightning/src/ln/shutdown_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ fn updates_shutdown_wait() {
8282
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
8383
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
8484
let logger = test_utils::TestLogger::new();
85-
let scorer = Scorer::new(0);
85+
let scorer = Scorer::with_fixed_penalty(0);
8686

8787
let (our_payment_preimage, our_payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100000);
8888

0 commit comments

Comments
 (0)