Skip to content

Commit b6536a1

Browse files
committed
WIP: Score, Scorer, DefaultScoring, TestScoring
1 parent a25ce5c commit b6536a1

File tree

10 files changed

+334
-108
lines changed

10 files changed

+334
-108
lines changed

fuzz/src/full_stack.rs

Lines changed: 5 additions & 3 deletions
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;
@@ -380,6 +381,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
380381
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret());
381382
let network_graph = NetworkGraph::new(genesis_block(network).block_hash());
382383
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(network_graph, None, Arc::clone(&logger)));
384+
let scorer = Scorer::default();
383385

384386
let peers = RefCell::new([false; 256]);
385387
let mut loss_detector = MoneyLossDetector::new(&peers, channelmanager.clone(), monitor.clone(), PeerManager::new(MessageHandler {
@@ -435,7 +437,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
435437
},
436438
4 => {
437439
let value = slice_to_be24(get_slice!(3)) as u64;
438-
let route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger)) {
440+
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) {
439441
Ok(route) => route,
440442
Err(_) => return,
441443
};
@@ -452,7 +454,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
452454
},
453455
15 => {
454456
let value = slice_to_be24(get_slice!(3)) as u64;
455-
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)) {
457+
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) {
456458
Ok(route) => route,
457459
Err(_) => return,
458460
};

fuzz/src/router.rs

Lines changed: 3 additions & 1 deletion
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::default();
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

Lines changed: 3 additions & 0 deletions
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::default();
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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5605,6 +5605,7 @@ mod tests {
56055605
use ln::msgs;
56065606
use ln::msgs::ChannelMessageHandler;
56075607
use routing::router::{get_keysend_route, get_route};
5608+
use routing::scorer::Scorer;
56085609
use util::errors::APIError;
56095610
use util::events::{Event, MessageSendEvent, MessageSendEventsProvider};
56105611
use util::test_utils;
@@ -5843,13 +5844,14 @@ mod tests {
58435844
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
58445845
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
58455846
let logger = test_utils::TestLogger::new();
5847+
let scorer = Scorer::default();
58465848

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

58515853
// Next, attempt a keysend payment and make sure it fails.
5852-
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();
5854+
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();
58535855
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
58545856
check_added_monitors!(nodes[0], 1);
58555857
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
@@ -5877,7 +5879,7 @@ mod tests {
58775879

58785880
// To start (2), send a keysend payment but don't claim it.
58795881
let payment_preimage = PaymentPreimage([42; 32]);
5880-
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();
5882+
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();
58815883
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
58825884
check_added_monitors!(nodes[0], 1);
58835885
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
@@ -5931,9 +5933,10 @@ mod tests {
59315933
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
59325934
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
59335935
let first_hops = nodes[0].node.list_usable_channels();
5936+
let scorer = Scorer::default();
59345937
let route = get_keysend_route(&payer_pubkey, network_graph, &payee_pubkey,
59355938
Some(&first_hops.iter().collect::<Vec<_>>()), &vec![], 10000, 40,
5936-
nodes[0].logger).unwrap();
5939+
nodes[0].logger, &scorer).unwrap();
59375940

59385941
let test_preimage = PaymentPreimage([42; 32]);
59395942
let mismatch_payment_hash = PaymentHash([43; 32]);
@@ -5967,9 +5970,10 @@ mod tests {
59675970
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
59685971
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
59695972
let first_hops = nodes[0].node.list_usable_channels();
5973+
let scorer = Scorer::default();
59705974
let route = get_keysend_route(&payer_pubkey, network_graph, &payee_pubkey,
59715975
Some(&first_hops.iter().collect::<Vec<_>>()), &vec![], 10000, 40,
5972-
nodes[0].logger).unwrap();
5976+
nodes[0].logger, &scorer).unwrap();
59735977

59745978
let test_preimage = PaymentPreimage([42; 32]);
59755979
let test_secret = PaymentSecret([43; 32]);
@@ -6032,6 +6036,7 @@ pub mod bench {
60326036
use ln::msgs::{ChannelMessageHandler, Init};
60336037
use routing::network_graph::NetworkGraph;
60346038
use routing::router::get_route;
6039+
use routing::scorer::Scorer;
60356040
use util::test_utils;
60366041
use util::config::UserConfig;
60376042
use util::events::{Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose};
@@ -6139,8 +6144,9 @@ pub mod bench {
61396144
macro_rules! send_payment {
61406145
($node_a: expr, $node_b: expr) => {
61416146
let usable_channels = $node_a.list_usable_channels();
6147+
let scorer = Scorer::default();
61426148
let route = get_route(&$node_a.get_our_node_id(), &dummy_graph, &$node_b.get_our_node_id(), Some(InvoiceFeatures::known()),
6143-
Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), &[], 10_000, TEST_FINAL_CLTV, &logger_a).unwrap();
6149+
Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), &[], 10_000, TEST_FINAL_CLTV, &logger_a, &scorer).unwrap();
61446150

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

lightning/src/ln/functional_test_utils.rs

Lines changed: 8 additions & 4 deletions
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};
@@ -987,11 +988,12 @@ macro_rules! get_route_and_payment_hash {
987988
($send_node: expr, $recv_node: expr, $last_hops: expr, $recv_value: expr, $cltv: expr) => {{
988989
let (payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash!($recv_node, Some($recv_value));
989990
let net_graph_msg_handler = &$send_node.net_graph_msg_handler;
991+
let scorer = ::routing::scorer::Scorer::default();
990992
let route = ::routing::router::get_route(
991993
&$send_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph,
992994
&$recv_node.node.get_our_node_id(), Some(::ln::features::InvoiceFeatures::known()),
993995
Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
994-
&$last_hops, $recv_value, $cltv, $send_node.logger
996+
&$last_hops, $recv_value, $cltv, $send_node.logger, &scorer
995997
).unwrap();
996998
(route, payment_hash, payment_preimage, payment_secret)
997999
}}
@@ -1300,10 +1302,11 @@ pub const TEST_FINAL_CLTV: u32 = 70;
13001302

13011303
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) {
13021304
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
1305+
let scorer = Scorer::default();
13031306
let route = get_route(&origin_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph,
13041307
&expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()),
13051308
Some(&origin_node.node.list_usable_channels().iter().collect::<Vec<_>>()), &[],
1306-
recv_value, TEST_FINAL_CLTV, origin_node.logger).unwrap();
1309+
recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
13071310
assert_eq!(route.paths.len(), 1);
13081311
assert_eq!(route.paths[0].len(), expected_route.len());
13091312
for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {
@@ -1315,7 +1318,8 @@ pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
13151318

13161319
pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) {
13171320
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
1318-
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();
1321+
let scorer = Scorer::default();
1322+
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();
13191323
assert_eq!(route.paths.len(), 1);
13201324
assert_eq!(route.paths[0].len(), expected_route.len());
13211325
for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {

lightning/src/ln/shutdown_tests.rs

Lines changed: 5 additions & 3 deletions
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};
@@ -84,6 +85,7 @@ fn updates_shutdown_wait() {
8485
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
8586
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
8687
let logger = test_utils::TestLogger::new();
88+
let scorer = Scorer::default();
8789

8890
let (our_payment_preimage, _, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100000);
8991

@@ -100,8 +102,8 @@ fn updates_shutdown_wait() {
100102

101103
let net_graph_msg_handler0 = &nodes[0].net_graph_msg_handler;
102104
let net_graph_msg_handler1 = &nodes[1].net_graph_msg_handler;
103-
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();
104-
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();
105+
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();
106+
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();
105107
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
106108
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
107109

lightning/src/routing/mod.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,25 @@
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+
use prelude::*;
17+
18+
use routing::router::RouteHop;
19+
20+
/// An interface used to score payment channels for path finding.
21+
///
22+
/// Scoring is in terms of fees willing to be paid in order to avoid routing through a channel.
23+
/// Allows updating such penalties as payments routed over a particular path succeed or fail.
24+
pub trait Score {
25+
/// Returns the fee willing to be paid to avoid routing through the given channel.
26+
fn channel_penalty_msat(&self, short_channel_id: u64) -> u64;
27+
28+
/// Handles updating channel penalties after failing to route through a channel.
29+
fn payment_path_failed(&self, path: &Vec<RouteHop>, short_channel_id: u64);
30+
31+
/// Handles updating channel penalties after successfully routing through a payment path.
32+
fn payment_path_successful(&self, path: &Vec<RouteHop>);
33+
}

0 commit comments

Comments
 (0)