Skip to content

Commit 2398f17

Browse files
authored
Merge pull request #1124 from jkczyz/2021-10-default-channel-scoring
Add channel scoring to get_route
2 parents a5de1ae + e15a18a commit 2398f17

File tree

10 files changed

+332
-116
lines changed

10 files changed

+332
-116
lines changed

fuzz/src/full_stack.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ use lightning::ln::channelmanager::{ChainParameters, ChannelManager};
3737
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
3838
use lightning::ln::msgs::DecodeError;
3939
use lightning::ln::script::ShutdownScript;
40-
use lightning::routing::router::get_route;
4140
use lightning::routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
41+
use lightning::routing::router::get_route;
42+
use lightning::routing::scorer::Scorer;
4243
use lightning::util::config::UserConfig;
4344
use lightning::util::errors::APIError;
4445
use lightning::util::events::Event;
@@ -381,6 +382,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
381382
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret());
382383
let network_graph = NetworkGraph::new(genesis_block(network).block_hash());
383384
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(network_graph, None, Arc::clone(&logger)));
385+
let scorer = Scorer::new(0);
384386

385387
let peers = RefCell::new([false; 256]);
386388
let mut loss_detector = MoneyLossDetector::new(&peers, channelmanager.clone(), monitor.clone(), PeerManager::new(MessageHandler {
@@ -436,7 +438,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
436438
},
437439
4 => {
438440
let value = slice_to_be24(get_slice!(3)) as u64;
439-
let route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger)) {
441+
let route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger), &scorer) {
440442
Ok(route) => route,
441443
Err(_) => return,
442444
};
@@ -453,7 +455,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
453455
},
454456
15 => {
455457
let value = slice_to_be24(get_slice!(3)) as u64;
456-
let mut route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger)) {
458+
let mut route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger), &scorer) {
457459
Ok(route) => route,
458460
Err(_) => return,
459461
};

fuzz/src/router.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use lightning::ln::channelmanager::{ChannelDetails, ChannelCounterparty};
1717
use lightning::ln::features::InitFeatures;
1818
use lightning::ln::msgs;
1919
use lightning::routing::router::{get_route, RouteHint, RouteHintHop};
20+
use lightning::routing::scorer::Scorer;
2021
use lightning::util::logger::Logger;
2122
use lightning::util::ser::Readable;
2223
use lightning::routing::network_graph::{NetworkGraph, RoutingFees};
@@ -247,11 +248,12 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
247248
}]));
248249
}
249250
}
251+
let scorer = Scorer::new(0);
250252
for target in node_pks.iter() {
251253
let _ = get_route(&our_pubkey, &net_graph, target, None,
252254
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),
253255
&last_hops.iter().collect::<Vec<_>>(),
254-
slice_to_be64(get_slice!(8)), slice_to_be32(get_slice!(4)), Arc::clone(&logger));
256+
slice_to_be64(get_slice!(8)), slice_to_be32(get_slice!(4)), Arc::clone(&logger), &scorer);
255257
}
256258
},
257259
}

lightning-invoice/src/utils.rs

+3
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ mod test {
9898
use lightning::ln::features::InitFeatures;
9999
use lightning::ln::msgs::ChannelMessageHandler;
100100
use lightning::routing::router;
101+
use lightning::routing::scorer::Scorer;
101102
use lightning::util::events::MessageSendEventsProvider;
102103
use lightning::util::test_utils;
103104
#[test]
@@ -117,6 +118,7 @@ mod test {
117118
let last_hops = invoice.route_hints();
118119
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
119120
let logger = test_utils::TestLogger::new();
121+
let scorer = Scorer::new(0);
120122
let route = router::get_route(
121123
&nodes[0].node.get_our_node_id(),
122124
network_graph,
@@ -127,6 +129,7 @@ mod test {
127129
amt_msat,
128130
invoice.min_final_cltv_expiry() as u32,
129131
&logger,
132+
&scorer,
130133
).unwrap();
131134

132135
let payment_event = {

lightning/src/ln/channelmanager.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -5804,6 +5804,7 @@ mod tests {
58045804
use ln::msgs;
58055805
use ln::msgs::ChannelMessageHandler;
58065806
use routing::router::{get_keysend_route, get_route};
5807+
use routing::scorer::Scorer;
58075808
use util::errors::APIError;
58085809
use util::events::{Event, MessageSendEvent, MessageSendEventsProvider};
58095810
use util::test_utils;
@@ -6042,13 +6043,14 @@ mod tests {
60426043
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
60436044
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
60446045
let logger = test_utils::TestLogger::new();
6046+
let scorer = Scorer::new(0);
60456047

60466048
// To start (1), send a regular payment but don't claim it.
60476049
let expected_route = [&nodes[1]];
60486050
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &expected_route, 100_000);
60496051

60506052
// Next, attempt a keysend payment and make sure it fails.
6051-
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger).unwrap();
6053+
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
60526054
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
60536055
check_added_monitors!(nodes[0], 1);
60546056
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
@@ -6076,7 +6078,7 @@ mod tests {
60766078

60776079
// To start (2), send a keysend payment but don't claim it.
60786080
let payment_preimage = PaymentPreimage([42; 32]);
6079-
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger).unwrap();
6081+
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
60806082
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
60816083
check_added_monitors!(nodes[0], 1);
60826084
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
@@ -6130,9 +6132,10 @@ mod tests {
61306132
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
61316133
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
61326134
let first_hops = nodes[0].node.list_usable_channels();
6135+
let scorer = Scorer::new(0);
61336136
let route = get_keysend_route(&payer_pubkey, network_graph, &payee_pubkey,
61346137
Some(&first_hops.iter().collect::<Vec<_>>()), &vec![], 10000, 40,
6135-
nodes[0].logger).unwrap();
6138+
nodes[0].logger, &scorer).unwrap();
61366139

61376140
let test_preimage = PaymentPreimage([42; 32]);
61386141
let mismatch_payment_hash = PaymentHash([43; 32]);
@@ -6166,9 +6169,10 @@ mod tests {
61666169
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
61676170
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
61686171
let first_hops = nodes[0].node.list_usable_channels();
6172+
let scorer = Scorer::new(0);
61696173
let route = get_keysend_route(&payer_pubkey, network_graph, &payee_pubkey,
61706174
Some(&first_hops.iter().collect::<Vec<_>>()), &vec![], 10000, 40,
6171-
nodes[0].logger).unwrap();
6175+
nodes[0].logger, &scorer).unwrap();
61726176

61736177
let test_preimage = PaymentPreimage([42; 32]);
61746178
let test_secret = PaymentSecret([43; 32]);
@@ -6229,6 +6233,7 @@ pub mod bench {
62296233
use ln::msgs::{ChannelMessageHandler, Init};
62306234
use routing::network_graph::NetworkGraph;
62316235
use routing::router::get_route;
6236+
use routing::scorer::Scorer;
62326237
use util::test_utils;
62336238
use util::config::UserConfig;
62346239
use util::events::{Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose};
@@ -6336,8 +6341,9 @@ pub mod bench {
63366341
macro_rules! send_payment {
63376342
($node_a: expr, $node_b: expr) => {
63386343
let usable_channels = $node_a.list_usable_channels();
6344+
let scorer = Scorer::new(0);
63396345
let route = get_route(&$node_a.get_our_node_id(), &dummy_graph, &$node_b.get_our_node_id(), Some(InvoiceFeatures::known()),
6340-
Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), &[], 10_000, TEST_FINAL_CLTV, &logger_a).unwrap();
6346+
Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), &[], 10_000, TEST_FINAL_CLTV, &logger_a, &scorer).unwrap();
63416347

63426348
let mut payment_preimage = PaymentPreimage([0; 32]);
63436349
payment_preimage.0[0..8].copy_from_slice(&payment_count.to_le_bytes());

lightning/src/ln/functional_test_utils.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ use chain::channelmonitor::ChannelMonitor;
1515
use chain::transaction::OutPoint;
1616
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
1717
use ln::channelmanager::{ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure};
18-
use routing::router::{Route, get_route};
1918
use routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
19+
use routing::router::{Route, get_route};
20+
use routing::scorer::Scorer;
2021
use ln::features::{InitFeatures, InvoiceFeatures};
2122
use ln::msgs;
2223
use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler};
@@ -1010,11 +1011,12 @@ macro_rules! get_route_and_payment_hash {
10101011
($send_node: expr, $recv_node: expr, $last_hops: expr, $recv_value: expr, $cltv: expr) => {{
10111012
let (payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash!($recv_node, Some($recv_value));
10121013
let net_graph_msg_handler = &$send_node.net_graph_msg_handler;
1014+
let scorer = ::routing::scorer::Scorer::new(0);
10131015
let route = ::routing::router::get_route(
10141016
&$send_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph,
10151017
&$recv_node.node.get_our_node_id(), Some(::ln::features::InvoiceFeatures::known()),
10161018
Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
1017-
&$last_hops, $recv_value, $cltv, $send_node.logger
1019+
&$last_hops, $recv_value, $cltv, $send_node.logger, &scorer
10181020
).unwrap();
10191021
(route, payment_hash, payment_preimage, payment_secret)
10201022
}}
@@ -1325,10 +1327,11 @@ pub const TEST_FINAL_CLTV: u32 = 70;
13251327

13261328
pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash, PaymentSecret) {
13271329
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
1330+
let scorer = Scorer::new(0);
13281331
let route = get_route(&origin_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph,
13291332
&expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()),
13301333
Some(&origin_node.node.list_usable_channels().iter().collect::<Vec<_>>()), &[],
1331-
recv_value, TEST_FINAL_CLTV, origin_node.logger).unwrap();
1334+
recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
13321335
assert_eq!(route.paths.len(), 1);
13331336
assert_eq!(route.paths[0].len(), expected_route.len());
13341337
for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {
@@ -1340,7 +1343,8 @@ pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
13401343

13411344
pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) {
13421345
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
1343-
let route = get_route(&origin_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), recv_value, TEST_FINAL_CLTV, origin_node.logger).unwrap();
1346+
let scorer = Scorer::new(0);
1347+
let route = get_route(&origin_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
13441348
assert_eq!(route.paths.len(), 1);
13451349
assert_eq!(route.paths[0].len(), expected_route.len());
13461350
for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {

lightning/src/ln/functional_tests.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use ln::{chan_utils, onion_utils};
2525
use ln::chan_utils::HTLC_SUCCESS_TX_WEIGHT;
2626
use routing::network_graph::{NetworkUpdate, RoutingFees};
2727
use routing::router::{Route, RouteHop, RouteHint, RouteHintHop, get_route, get_keysend_route};
28+
use routing::scorer::Scorer;
2829
use ln::features::{ChannelFeatures, InitFeatures, InvoiceFeatures, NodeFeatures};
2930
use ln::msgs;
3031
use ln::msgs::{ChannelMessageHandler, RoutingMessageHandler, ErrorAction};
@@ -7267,7 +7268,8 @@ fn test_check_htlc_underpaying() {
72677268
// Create some initial channels
72687269
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
72697270

7270-
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 10_000, TEST_FINAL_CLTV, nodes[0].logger).unwrap();
7271+
let scorer = Scorer::new(0);
7272+
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer).unwrap();
72717273
let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
72727274
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200, 0).unwrap();
72737275
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
@@ -7664,11 +7666,12 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
76647666

76657667
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
76667668
// Lock HTLC in both directions (using a slightly lower CLTV delay to provide timely RBF bumps)
7669+
let scorer = Scorer::new(0);
76677670
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph,
7668-
&nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger).unwrap();
7671+
&nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger, &scorer).unwrap();
76697672
let payment_preimage = send_along_route(&nodes[0], route, &[&nodes[1]], 3_000_000).0;
76707673
let route = get_route(&nodes[1].node.get_our_node_id(), &nodes[1].net_graph_msg_handler.network_graph,
7671-
&nodes[0].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger).unwrap();
7674+
&nodes[0].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger, &scorer).unwrap();
76727675
send_along_route(&nodes[1], route, &[&nodes[0]], 3_000_000);
76737676

76747677
let revoked_local_txn = get_local_commitment_txn!(nodes[1], chan.2);
@@ -9157,8 +9160,9 @@ fn test_keysend_payments_to_public_node() {
91579160
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
91589161
let payer_pubkey = nodes[0].node.get_our_node_id();
91599162
let payee_pubkey = nodes[1].node.get_our_node_id();
9163+
let scorer = Scorer::new(0);
91609164
let route = get_keysend_route(
9161-
&payer_pubkey, &network_graph, &payee_pubkey, None, &vec![], 10000, 40, nodes[0].logger
9165+
&payer_pubkey, &network_graph, &payee_pubkey, None, &vec![], 10000, 40, nodes[0].logger, &scorer
91629166
).unwrap();
91639167

91649168
let test_preimage = PaymentPreimage([42; 32]);
@@ -9187,9 +9191,10 @@ fn test_keysend_payments_to_private_node() {
91879191
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
91889192
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
91899193
let first_hops = nodes[0].node.list_usable_channels();
9194+
let scorer = Scorer::new(0);
91909195
let route = get_keysend_route(
91919196
&payer_pubkey, &network_graph, &payee_pubkey, Some(&first_hops.iter().collect::<Vec<_>>()),
9192-
&vec![], 10000, 40, nodes[0].logger
9197+
&vec![], 10000, 40, nodes[0].logger, &scorer
91939198
).unwrap();
91949199

91959200
let test_preimage = PaymentPreimage([42; 32]);

lightning/src/ln/shutdown_tests.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ use chain::keysinterface::KeysInterface;
1313
use chain::transaction::OutPoint;
1414
use ln::{PaymentPreimage, PaymentHash};
1515
use ln::channelmanager::PaymentSendFailure;
16-
use routing::network_graph::NetworkUpdate;
1716
use routing::router::get_route;
17+
use routing::network_graph::NetworkUpdate;
18+
use routing::scorer::Scorer;
1819
use ln::features::{InitFeatures, InvoiceFeatures};
1920
use ln::msgs;
2021
use ln::msgs::{ChannelMessageHandler, ErrorAction};
@@ -81,6 +82,7 @@ fn updates_shutdown_wait() {
8182
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
8283
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
8384
let logger = test_utils::TestLogger::new();
85+
let scorer = Scorer::new(0);
8486

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

@@ -97,8 +99,8 @@ fn updates_shutdown_wait() {
9799

98100
let net_graph_msg_handler0 = &nodes[0].net_graph_msg_handler;
99101
let net_graph_msg_handler1 = &nodes[1].net_graph_msg_handler;
100-
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &net_graph_msg_handler0.network_graph, &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &[], 100000, TEST_FINAL_CLTV, &logger).unwrap();
101-
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &net_graph_msg_handler1.network_graph, &nodes[0].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &[], 100000, TEST_FINAL_CLTV, &logger).unwrap();
102+
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &net_graph_msg_handler0.network_graph, &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &[], 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
103+
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &net_graph_msg_handler1.network_graph, &nodes[0].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &[], 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
102104
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
103105
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
104106

lightning/src/routing/mod.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,14 @@
99

1010
//! Structs and impls for receiving messages about the network and storing the topology live here.
1111
12-
pub mod router;
1312
pub mod network_graph;
13+
pub mod router;
14+
pub mod scorer;
15+
16+
/// An interface used to score payment channels for path finding.
17+
///
18+
/// Scoring is in terms of fees willing to be paid in order to avoid routing through a channel.
19+
pub trait Score {
20+
/// Returns the fee in msats willing to be paid to avoid routing through the given channel.
21+
fn channel_penalty_msat(&self, short_channel_id: u64) -> u64;
22+
}

0 commit comments

Comments
 (0)