Skip to content

Commit 6fbaee6

Browse files
author
Elias Rohrer
committed
Add random 'shadow route' CLTV offset for privacy.
1 parent 457e48e commit 6fbaee6

File tree

10 files changed

+251
-99
lines changed

10 files changed

+251
-99
lines changed

fuzz/src/full_stack.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
455455
final_value_msat,
456456
final_cltv_expiry_delta: 42,
457457
};
458-
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer) {
458+
let random_bytes = get_slice!(32);
459+
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_bytes) {
459460
Ok(route) => route,
460461
Err(_) => return,
461462
};
@@ -478,7 +479,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
478479
final_value_msat,
479480
final_cltv_expiry_delta: 42,
480481
};
481-
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer) {
482+
let random_bytes = get_slice!(32);
483+
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_bytes) {
482484
Ok(route) => route,
483485
Err(_) => return,
484486
};

fuzz/src/router.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
250250
}
251251
}
252252
let scorer = Scorer::with_fixed_penalty(0);
253+
let random_bytes = get_slice!(32);
253254
for target in node_pks.iter() {
254255
let route_params = RouteParameters {
255256
payment_params: PaymentParameters::from_node_id(*target).with_route_hints(last_hops.clone()),
@@ -258,7 +259,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
258259
};
259260
let _ = find_route(&our_pubkey, &route_params, &net_graph,
260261
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),
261-
Arc::clone(&logger), &scorer);
262+
Arc::clone(&logger), &scorer, &random_bytes);
262263
}
263264
},
264265
}

lightning-background-processor/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,12 +667,14 @@ mod tests {
667667

668668
#[test]
669669
fn test_invoice_payer() {
670+
let keys_manager = test_utils::TestKeysInterface::new(&[0u8;32], Network::Testnet);
671+
let random_bytes = keys_manager.get_secure_random_bytes();
670672
let nodes = create_nodes(2, "test_invoice_payer".to_string());
671673

672674
// Initiate the background processors to watch each node.
673675
let data_dir = nodes[0].persister.get_data_dir();
674676
let persister = move |node: &ChannelManager<InMemorySigner, Arc<ChainMonitor>, Arc<test_utils::TestBroadcaster>, Arc<KeysManager>, Arc<test_utils::TestFeeEstimator>, Arc<test_utils::TestLogger>>| FilesystemPersister::persist_manager(data_dir.clone(), node);
675-
let router = DefaultRouter::new(Arc::clone(&nodes[0].network_graph), Arc::clone(&nodes[0].logger));
677+
let router = DefaultRouter::new(Arc::clone(&nodes[0].network_graph), Arc::clone(&nodes[0].logger), random_bytes);
676678
let scorer = Arc::new(Mutex::new(test_utils::TestScorer::default()));
677679
let invoice_payer = Arc::new(InvoicePayer::new(Arc::clone(&nodes[0].node), router, scorer, Arc::clone(&nodes[0].logger), |_: &_| {}, RetryAttempts(2)));
678680
let event_handler = Arc::clone(&invoice_payer);

lightning-invoice/src/utils.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,13 @@ where
129129
pub struct DefaultRouter<G: Deref<Target = NetworkGraph>, L: Deref> where L::Target: Logger {
130130
network_graph: G,
131131
logger: L,
132+
random_bytes: [u8; 32],
132133
}
133134

134135
impl<G: Deref<Target = NetworkGraph>, L: Deref> DefaultRouter<G, L> where L::Target: Logger {
135136
/// Creates a new router using the given [`NetworkGraph`] and [`Logger`].
136-
pub fn new(network_graph: G, logger: L) -> Self {
137-
Self { network_graph, logger }
137+
pub fn new(network_graph: G, logger: L, random_bytes: [u8; 32]) -> Self {
138+
Self { network_graph, logger, random_bytes }
138139
}
139140
}
140141

@@ -144,7 +145,7 @@ where L::Target: Logger {
144145
&self, payer: &PublicKey, params: &RouteParameters, _payment_hash: &PaymentHash,
145146
first_hops: Option<&[&ChannelDetails]>, scorer: &S
146147
) -> Result<Route, LightningError> {
147-
find_route(payer, params, &*self.network_graph, first_hops, &*self.logger, scorer)
148+
find_route(payer, params, &*self.network_graph, first_hops, &*self.logger, scorer, &self.random_bytes)
148149
}
149150
}
150151

@@ -200,6 +201,7 @@ mod test {
200201
use lightning::routing::router::{PaymentParameters, RouteParameters, find_route};
201202
use lightning::util::events::MessageSendEventsProvider;
202203
use lightning::util::test_utils;
204+
use lightning::chain::keysinterface::KeysInterface;
203205
use utils::create_invoice_from_channelmanager_and_duration_since_epoch;
204206

205207
#[test]
@@ -228,9 +230,10 @@ mod test {
228230
let network_graph = node_cfgs[0].network_graph;
229231
let logger = test_utils::TestLogger::new();
230232
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
233+
let random_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
231234
let route = find_route(
232235
&nodes[0].node.get_our_node_id(), &route_params, network_graph,
233-
Some(&first_hops.iter().collect::<Vec<_>>()), &logger, &scorer,
236+
Some(&first_hops.iter().collect::<Vec<_>>()), &logger, &scorer, &random_bytes
234237
).unwrap();
235238

236239
let payment_event = {

lightning/src/ln/channelmanager.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6649,6 +6649,7 @@ mod tests {
66496649
use util::errors::APIError;
66506650
use util::events::{Event, MessageSendEvent, MessageSendEventsProvider};
66516651
use util::test_utils;
6652+
use chain::keysinterface::KeysInterface;
66526653

66536654
#[cfg(feature = "std")]
66546655
#[test]
@@ -6902,6 +6903,7 @@ mod tests {
69026903
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
69036904
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
69046905
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
6906+
let random_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
69056907

69066908
// To start (1), send a regular payment but don't claim it.
69076909
let expected_route = [&nodes[1]];
@@ -6915,7 +6917,7 @@ mod tests {
69156917
};
69166918
let route = find_route(
69176919
&nodes[0].node.get_our_node_id(), &route_params, nodes[0].network_graph, None,
6918-
nodes[0].logger, &scorer
6920+
nodes[0].logger, &scorer, &random_bytes
69196921
).unwrap();
69206922
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
69216923
check_added_monitors!(nodes[0], 1);
@@ -6946,7 +6948,7 @@ mod tests {
69466948
let payment_preimage = PaymentPreimage([42; 32]);
69476949
let route = find_route(
69486950
&nodes[0].node.get_our_node_id(), &route_params, nodes[0].network_graph, None,
6949-
nodes[0].logger, &scorer
6951+
nodes[0].logger, &scorer, &random_bytes
69506952
).unwrap();
69516953
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
69526954
check_added_monitors!(nodes[0], 1);
@@ -7007,9 +7009,10 @@ mod tests {
70077009
let network_graph = nodes[0].network_graph;
70087010
let first_hops = nodes[0].node.list_usable_channels();
70097011
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
7012+
let random_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
70107013
let route = find_route(
70117014
&payer_pubkey, &route_params, network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
7012-
nodes[0].logger, &scorer
7015+
nodes[0].logger, &scorer, &random_bytes
70137016
).unwrap();
70147017

70157018
let test_preimage = PaymentPreimage([42; 32]);
@@ -7050,9 +7053,10 @@ mod tests {
70507053
let network_graph = nodes[0].network_graph;
70517054
let first_hops = nodes[0].node.list_usable_channels();
70527055
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
7056+
let random_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
70537057
let route = find_route(
70547058
&payer_pubkey, &route_params, network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
7055-
nodes[0].logger, &scorer
7059+
nodes[0].logger, &scorer, &random_bytes
70567060
).unwrap();
70577061

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

lightning/src/ln/functional_test_utils.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//! A bunch of useful utilities for building networks of nodes and exchanging messages between
1111
//! nodes for functional tests.
1212
13-
use chain::{BestBlock, Confirm, Listen, Watch};
13+
use chain::{BestBlock, Confirm, Listen, Watch, keysinterface::KeysInterface};
1414
use chain::channelmonitor::ChannelMonitor;
1515
use chain::transaction::OutPoint;
1616
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
@@ -1081,15 +1081,18 @@ macro_rules! get_route_and_payment_hash {
10811081
$crate::get_route_and_payment_hash!($send_node, $recv_node, vec![], $recv_value, TEST_FINAL_CLTV)
10821082
}};
10831083
($send_node: expr, $recv_node: expr, $last_hops: expr, $recv_value: expr, $cltv: expr) => {{
1084+
use $crate::chain::keysinterface::KeysInterface;
10841085
let (payment_preimage, payment_hash, payment_secret) = $crate::get_payment_preimage_hash!($recv_node, Some($recv_value));
10851086
let payment_params = $crate::routing::router::PaymentParameters::from_node_id($recv_node.node.get_our_node_id())
10861087
.with_features($crate::ln::features::InvoiceFeatures::known())
10871088
.with_route_hints($last_hops);
10881089
let scorer = $crate::util::test_utils::TestScorer::with_fixed_penalty(0);
1090+
let keys_manager = $crate::util::test_utils::TestKeysInterface::new(&[0u8;32], bitcoin::network::constants::Network::Testnet);
1091+
let random_bytes = keys_manager.get_secure_random_bytes();
10891092
let route = $crate::routing::router::get_route(
10901093
&$send_node.node.get_our_node_id(), &payment_params, $send_node.network_graph,
10911094
Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
1092-
$recv_value, $cltv, $send_node.logger, &scorer
1095+
$recv_value, $cltv, $send_node.logger, &scorer, &random_bytes
10931096
).unwrap();
10941097
(route, payment_hash, payment_preimage, payment_secret)
10951098
}}
@@ -1541,10 +1544,13 @@ pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
15411544
let payment_params = PaymentParameters::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
15421545
.with_features(InvoiceFeatures::known());
15431546
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
1547+
let seed = [0u8; 32];
1548+
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
1549+
let random_bytes = keys_manager.get_secure_random_bytes();
15441550
let route = get_route(
15451551
&origin_node.node.get_our_node_id(), &payment_params, &origin_node.network_graph,
15461552
Some(&origin_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
1547-
recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
1553+
recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer, &random_bytes).unwrap();
15481554
assert_eq!(route.paths.len(), 1);
15491555
assert_eq!(route.paths[0].len(), expected_route.len());
15501556
for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {
@@ -1559,9 +1565,12 @@ pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_rou
15591565
let payment_params = PaymentParameters::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
15601566
.with_features(InvoiceFeatures::known());
15611567
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
1568+
let seed = [0u8; 32];
1569+
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
1570+
let random_bytes = keys_manager.get_secure_random_bytes();
15621571
let route = get_route(
15631572
&origin_node.node.get_our_node_id(), &payment_params, origin_node.network_graph,
1564-
None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
1573+
None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer, &random_bytes).unwrap();
15651574
assert_eq!(route.paths.len(), 1);
15661575
assert_eq!(route.paths[0].len(), expected_route.len());
15671576
for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {

lightning/src/ln/functional_tests.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use chain::{Confirm, Listen, Watch};
1616
use chain::channelmonitor;
1717
use chain::channelmonitor::{ChannelMonitor, CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS, ANTI_REORG_DELAY};
1818
use chain::transaction::OutPoint;
19-
use chain::keysinterface::BaseSign;
19+
use chain::keysinterface::{BaseSign, KeysInterface};
2020
use ln::{PaymentPreimage, PaymentSecret, PaymentHash};
2121
use ln::channel::{commitment_tx_base_weight, COMMITMENT_TX_WEIGHT_PER_HTLC, CONCURRENT_INBOUND_HTLC_FEE_BUFFER, FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE, MIN_AFFORDABLE_HTLC_COUNT};
2222
use ln::channelmanager::{ChannelManager, ChannelManagerReadArgs, PaymentId, RAACommitmentOrder, PaymentSendFailure, BREAKDOWN_TIMEOUT, MIN_CLTV_EXPIRY_DELTA, PAYMENT_EXPIRY_BLOCKS };
@@ -7440,8 +7440,9 @@ fn test_check_htlc_underpaying() {
74407440
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
74417441

74427442
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
7443+
let random_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
74437444
let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
7444-
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, nodes[0].network_graph, None, 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer).unwrap();
7445+
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, nodes[0].network_graph, None, 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer, &random_bytes).unwrap();
74457446
let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
74467447
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200).unwrap();
74477448
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
@@ -7843,12 +7844,13 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
78437844
// Lock HTLC in both directions (using a slightly lower CLTV delay to provide timely RBF bumps)
78447845
let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
78457846
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
7847+
let random_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
78467848
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph, None,
7847-
3_000_000, 50, nodes[0].logger, &scorer).unwrap();
7849+
3_000_000, 50, nodes[0].logger, &scorer, &random_bytes).unwrap();
78487850
let payment_preimage = send_along_route(&nodes[0], route, &[&nodes[1]], 3_000_000).0;
78497851
let payment_params = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id()).with_features(InvoiceFeatures::known());
78507852
let route = get_route(&nodes[1].node.get_our_node_id(), &payment_params, nodes[1].network_graph, None,
7851-
3_000_000, 50, nodes[0].logger, &scorer).unwrap();
7853+
3_000_000, 50, nodes[0].logger, &scorer, &random_bytes).unwrap();
78527854
send_along_route(&nodes[1], route, &[&nodes[0]], 3_000_000);
78537855

78547856
let revoked_local_txn = get_local_commitment_txn!(nodes[1], chan.2);
@@ -9380,7 +9382,8 @@ fn test_keysend_payments_to_public_node() {
93809382
final_cltv_expiry_delta: 40,
93819383
};
93829384
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
9383-
let route = find_route(&payer_pubkey, &route_params, network_graph, None, nodes[0].logger, &scorer).unwrap();
9385+
let random_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
9386+
let route = find_route(&payer_pubkey, &route_params, network_graph, None, nodes[0].logger, &scorer, &random_bytes).unwrap();
93849387

93859388
let test_preimage = PaymentPreimage([42; 32]);
93869389
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage)).unwrap();
@@ -9414,9 +9417,10 @@ fn test_keysend_payments_to_private_node() {
94149417
let network_graph = nodes[0].network_graph;
94159418
let first_hops = nodes[0].node.list_usable_channels();
94169419
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
9420+
let random_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
94179421
let route = find_route(
94189422
&payer_pubkey, &route_params, network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
9419-
nodes[0].logger, &scorer
9423+
nodes[0].logger, &scorer, &random_bytes
94209424
).unwrap();
94219425

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

lightning/src/ln/payment_tests.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use chain::{ChannelMonitorUpdateErr, Confirm, Listen, Watch};
1515
use chain::channelmonitor::{ANTI_REORG_DELAY, ChannelMonitor, LATENCY_GRACE_PERIOD_BLOCKS};
1616
use chain::transaction::OutPoint;
17+
use chain::keysinterface::KeysInterface;
1718
use ln::channelmanager::{BREAKDOWN_TIMEOUT, ChannelManager, ChannelManagerReadArgs, PaymentId, PaymentSendFailure};
1819
use ln::features::{InitFeatures, InvoiceFeatures};
1920
use ln::msgs;
@@ -27,6 +28,7 @@ use util::ser::{ReadableArgs, Writeable};
2728
use io;
2829

2930
use bitcoin::{Block, BlockHeader, BlockHash};
31+
use bitcoin::network::constants::Network;
3032

3133
use prelude::*;
3234

@@ -724,10 +726,12 @@ fn get_ldk_payment_preimage() {
724726
let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id())
725727
.with_features(InvoiceFeatures::known());
726728
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
729+
let keys_manager = test_utils::TestKeysInterface::new(&[0u8;32], Network::Testnet);
730+
let random_bytes = keys_manager.get_secure_random_bytes();
727731
let route = get_route(
728732
&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph,
729733
Some(&nodes[0].node.list_usable_channels().iter().collect::<Vec<_>>()),
730-
amt_msat, TEST_FINAL_CLTV, nodes[0].logger, &scorer).unwrap();
734+
amt_msat, TEST_FINAL_CLTV, nodes[0].logger, &scorer, &random_bytes).unwrap();
731735
let _payment_id = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
732736
check_added_monitors!(nodes[0], 1);
733737

lightning/src/ln/shutdown_tests.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use util::config::UserConfig;
2525

2626
use bitcoin::blockdata::script::Builder;
2727
use bitcoin::blockdata::opcodes;
28+
use bitcoin::network::constants::Network;
2829

2930
use regex;
3031

@@ -77,6 +78,8 @@ fn updates_shutdown_wait() {
7778
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
7879
let logger = test_utils::TestLogger::new();
7980
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
81+
let keys_manager = test_utils::TestKeysInterface::new(&[0u8;32], Network::Testnet);
82+
let random_bytes = keys_manager.get_secure_random_bytes();
8083

8184
let (payment_preimage, _, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100000);
8285

@@ -92,9 +95,9 @@ fn updates_shutdown_wait() {
9295
let (_, payment_hash, payment_secret) = get_payment_preimage_hash!(nodes[0]);
9396

9497
let payment_params_1 = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
95-
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payment_params_1, nodes[0].network_graph, None, 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
98+
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payment_params_1, nodes[0].network_graph, None, 100000, TEST_FINAL_CLTV, &logger, &scorer, &random_bytes).unwrap();
9699
let payment_params_2 = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id()).with_features(InvoiceFeatures::known());
97-
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payment_params_2, nodes[1].network_graph, None, 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
100+
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payment_params_2, nodes[1].network_graph, None, 100000, TEST_FINAL_CLTV, &logger, &scorer, &random_bytes).unwrap();
98101
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
99102
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
100103

0 commit comments

Comments
 (0)