Skip to content

Commit 20c53b6

Browse files
authored
Merge branch 'lightningdevkit:main' into issue1462
2 parents 4fd4815 + 342698f commit 20c53b6

20 files changed

+291
-259
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ impl chain::Watch<EnforcingSigner> for TestChainMonitor {
148148
self.chain_monitor.update_channel(funding_txo, update)
149149
}
150150

151-
fn release_pending_monitor_events(&self) -> Vec<MonitorEvent> {
151+
fn release_pending_monitor_events(&self) -> Vec<(OutPoint, Vec<MonitorEvent>)> {
152152
return self.chain_monitor.release_pending_monitor_events();
153153
}
154154
}
@@ -442,7 +442,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
442442
value: *channel_value_satoshis, script_pubkey: output_script.clone(),
443443
}]};
444444
funding_output = OutPoint { txid: tx.txid(), index: 0 };
445-
$source.funding_transaction_generated(&temporary_channel_id, tx.clone()).unwrap();
445+
$source.funding_transaction_generated(&temporary_channel_id, &$dest.get_our_node_id(), tx.clone()).unwrap();
446446
channel_txn.push(tx);
447447
} else { panic!("Wrong event type"); }
448448
}

fuzz/src/full_stack.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
408408
let mut should_forward = false;
409409
let mut payments_received: Vec<PaymentHash> = Vec::new();
410410
let mut payments_sent = 0;
411-
let mut pending_funding_generation: Vec<([u8; 32], u64, Script)> = Vec::new();
411+
let mut pending_funding_generation: Vec<([u8; 32], PublicKey, u64, Script)> = Vec::new();
412412
let mut pending_funding_signatures = HashMap::new();
413413

414414
loop {
@@ -516,7 +516,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
516516
let channel_id = get_slice!(1)[0] as usize;
517517
if channel_id >= channels.len() { return; }
518518
channels.sort_by(|a, b| { a.channel_id.cmp(&b.channel_id) });
519-
if channelmanager.close_channel(&channels[channel_id].channel_id).is_err() { return; }
519+
if channelmanager.close_channel(&channels[channel_id].channel_id, &channels[channel_id].counterparty.node_id).is_err() { return; }
520520
},
521521
7 => {
522522
if should_forward {
@@ -556,7 +556,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
556556
10 => {
557557
'outer_loop: for funding_generation in pending_funding_generation.drain(..) {
558558
let mut tx = Transaction { version: 0, lock_time: 0, input: Vec::new(), output: vec![TxOut {
559-
value: funding_generation.1, script_pubkey: funding_generation.2,
559+
value: funding_generation.2, script_pubkey: funding_generation.3,
560560
}] };
561561
let funding_output = 'search_loop: loop {
562562
let funding_txid = tx.txid();
@@ -575,7 +575,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
575575
continue 'outer_loop;
576576
}
577577
};
578-
if let Err(e) = channelmanager.funding_transaction_generated(&funding_generation.0, tx.clone()) {
578+
if let Err(e) = channelmanager.funding_transaction_generated(&funding_generation.0, &funding_generation.1, tx.clone()) {
579579
// It's possible the channel has been closed in the mean time, but any other
580580
// failure may be a bug.
581581
if let APIError::ChannelUnavailable { err } = e {
@@ -624,16 +624,16 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
624624
let channel_id = get_slice!(1)[0] as usize;
625625
if channel_id >= channels.len() { return; }
626626
channels.sort_by(|a, b| { a.channel_id.cmp(&b.channel_id) });
627-
channelmanager.force_close_channel(&channels[channel_id].channel_id).unwrap();
627+
channelmanager.force_close_channel(&channels[channel_id].channel_id, &channels[channel_id].counterparty.node_id).unwrap();
628628
},
629629
// 15 is above
630630
_ => return,
631631
}
632632
loss_detector.handler.process_events();
633633
for event in loss_detector.manager.get_and_clear_pending_events() {
634634
match event {
635-
Event::FundingGenerationReady { temporary_channel_id, channel_value_satoshis, output_script, .. } => {
636-
pending_funding_generation.push((temporary_channel_id, channel_value_satoshis, output_script));
635+
Event::FundingGenerationReady { temporary_channel_id, counterparty_node_id, channel_value_satoshis, output_script, .. } => {
636+
pending_funding_generation.push((temporary_channel_id, counterparty_node_id, channel_value_satoshis, output_script));
637637
},
638638
Event::PaymentReceived { payment_hash, .. } => {
639639
//TODO: enhance by fetching random amounts from fuzz input?

lightning-background-processor/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ mod tests {
540540
macro_rules! handle_funding_generation_ready {
541541
($event: expr, $channel_value: expr) => {{
542542
match $event {
543-
&Event::FundingGenerationReady { temporary_channel_id, channel_value_satoshis, ref output_script, user_channel_id } => {
543+
&Event::FundingGenerationReady { temporary_channel_id, channel_value_satoshis, ref output_script, user_channel_id, .. } => {
544544
assert_eq!(channel_value_satoshis, $channel_value);
545545
assert_eq!(user_channel_id, 42);
546546

@@ -556,7 +556,7 @@ mod tests {
556556

557557
macro_rules! end_open_channel {
558558
($node_a: expr, $node_b: expr, $temporary_channel_id: expr, $tx: expr) => {{
559-
$node_a.node.funding_transaction_generated(&$temporary_channel_id, $tx.clone()).unwrap();
559+
$node_a.node.funding_transaction_generated(&$temporary_channel_id, &$node_b.node.get_our_node_id(), $tx.clone()).unwrap();
560560
$node_b.node.handle_funding_created(&$node_a.node.get_our_node_id(), &get_event_msg!($node_a, MessageSendEvent::SendFundingCreated, $node_b.node.get_our_node_id()));
561561
$node_a.node.handle_funding_signed(&$node_b.node.get_our_node_id(), &get_event_msg!($node_b, MessageSendEvent::SendFundingSigned, $node_a.node.get_our_node_id()));
562562
}}
@@ -637,7 +637,7 @@ mod tests {
637637
}
638638

639639
// Force-close the channel.
640-
nodes[0].node.force_close_channel(&OutPoint { txid: tx.txid(), index: 0 }.to_channel_id()).unwrap();
640+
nodes[0].node.force_close_channel(&OutPoint { txid: tx.txid(), index: 0 }.to_channel_id(), &nodes[1].node.get_our_node_id()).unwrap();
641641

642642
// Check that the force-close updates are persisted.
643643
check_persisted_data!(nodes[0].node, filepath.clone());
@@ -776,7 +776,7 @@ mod tests {
776776
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()));
777777

778778
// Force close the channel and check that the SpendableOutputs event was handled.
779-
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
779+
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id()).unwrap();
780780
let commitment_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().pop().unwrap();
781781
confirm_transaction_depth(&mut nodes[0], &commitment_tx, BREAKDOWN_TIMEOUT as u32);
782782
let event = receiver

lightning-persister/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ mod tests {
213213

214214
// Force close because cooperative close doesn't result in any persisted
215215
// updates.
216-
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
216+
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id()).unwrap();
217217
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed);
218218
check_closed_broadcast!(nodes[0], true);
219219
check_added_monitors!(nodes[0], 1);
@@ -247,7 +247,7 @@ mod tests {
247247
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
248248
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
249249
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
250-
nodes[1].node.force_close_channel(&chan.2).unwrap();
250+
nodes[1].node.force_close_channel(&chan.2, &nodes[0].node.get_our_node_id()).unwrap();
251251
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
252252
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
253253
let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();
@@ -286,7 +286,7 @@ mod tests {
286286
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
287287
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
288288
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
289-
nodes[1].node.force_close_channel(&chan.2).unwrap();
289+
nodes[1].node.force_close_channel(&chan.2, &nodes[0].node.get_our_node_id()).unwrap();
290290
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
291291
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
292292
let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();

lightning/src/chain/chainmonitor.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ pub struct ChainMonitor<ChannelSigner: Sign, C: Deref, T: Deref, F: Deref, L: De
235235
persister: P,
236236
/// "User-provided" (ie persistence-completion/-failed) [`MonitorEvent`]s. These came directly
237237
/// from the user and not from a [`ChannelMonitor`].
238-
pending_monitor_events: Mutex<Vec<MonitorEvent>>,
238+
pending_monitor_events: Mutex<Vec<(OutPoint, Vec<MonitorEvent>)>>,
239239
/// The best block height seen, used as a proxy for the passage of time.
240240
highest_chain_height: AtomicUsize,
241241
}
@@ -299,7 +299,7 @@ where C::Target: chain::Filter,
299299
log_trace!(self.logger, "Finished syncing Channel Monitor for channel {}", log_funding_info!(monitor)),
300300
Err(ChannelMonitorUpdateErr::PermanentFailure) => {
301301
monitor_state.channel_perm_failed.store(true, Ordering::Release);
302-
self.pending_monitor_events.lock().unwrap().push(MonitorEvent::UpdateFailed(*funding_outpoint));
302+
self.pending_monitor_events.lock().unwrap().push((*funding_outpoint, vec![MonitorEvent::UpdateFailed(*funding_outpoint)]));
303303
},
304304
Err(ChannelMonitorUpdateErr::TemporaryFailure) => {
305305
log_debug!(self.logger, "Channel Monitor sync for channel {} in progress, holding events until completion!", log_funding_info!(monitor));
@@ -455,10 +455,10 @@ where C::Target: chain::Filter,
455455
// UpdateCompleted event.
456456
return Ok(());
457457
}
458-
self.pending_monitor_events.lock().unwrap().push(MonitorEvent::UpdateCompleted {
458+
self.pending_monitor_events.lock().unwrap().push((funding_txo, vec![MonitorEvent::UpdateCompleted {
459459
funding_txo,
460460
monitor_update_id: monitor_data.monitor.get_latest_update_id(),
461-
});
461+
}]));
462462
},
463463
MonitorUpdateId { contents: UpdateOrigin::ChainSync(_) } => {
464464
if !monitor_data.has_pending_chainsync_updates(&pending_monitor_updates) {
@@ -476,10 +476,10 @@ where C::Target: chain::Filter,
476476
/// channel_monitor_updated once with the highest ID.
477477
#[cfg(any(test, fuzzing))]
478478
pub fn force_channel_monitor_updated(&self, funding_txo: OutPoint, monitor_update_id: u64) {
479-
self.pending_monitor_events.lock().unwrap().push(MonitorEvent::UpdateCompleted {
479+
self.pending_monitor_events.lock().unwrap().push((funding_txo, vec![MonitorEvent::UpdateCompleted {
480480
funding_txo,
481481
monitor_update_id,
482-
});
482+
}]));
483483
}
484484

485485
#[cfg(any(test, fuzzing, feature = "_test_utils"))]
@@ -666,7 +666,7 @@ where C::Target: chain::Filter,
666666
}
667667
}
668668

669-
fn release_pending_monitor_events(&self) -> Vec<MonitorEvent> {
669+
fn release_pending_monitor_events(&self) -> Vec<(OutPoint, Vec<MonitorEvent>)> {
670670
let mut pending_monitor_events = self.pending_monitor_events.lock().unwrap().split_off(0);
671671
for monitor_state in self.monitors.read().unwrap().values() {
672672
let is_pending_monitor_update = monitor_state.has_pending_chainsync_updates(&monitor_state.pending_monitor_updates.lock().unwrap());
@@ -692,7 +692,11 @@ where C::Target: chain::Filter,
692692
log_error!(self.logger, " To avoid funds-loss, we are allowing monitor updates to be released.");
693693
log_error!(self.logger, " This may cause duplicate payment events to be generated.");
694694
}
695-
pending_monitor_events.append(&mut monitor_state.monitor.get_and_clear_pending_monitor_events());
695+
let monitor_events = monitor_state.monitor.get_and_clear_pending_monitor_events();
696+
if monitor_events.len() > 0 {
697+
let monitor_outpoint = monitor_state.monitor.get_funding_txo().0;
698+
pending_monitor_events.push((monitor_outpoint, monitor_events));
699+
}
696700
}
697701
}
698702
pending_monitor_events

lightning/src/chain/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ pub trait Watch<ChannelSigner: Sign> {
302302
///
303303
/// For details on asynchronous [`ChannelMonitor`] updating and returning
304304
/// [`MonitorEvent::UpdateCompleted`] here, see [`ChannelMonitorUpdateErr::TemporaryFailure`].
305-
fn release_pending_monitor_events(&self) -> Vec<MonitorEvent>;
305+
fn release_pending_monitor_events(&self) -> Vec<(OutPoint, Vec<MonitorEvent>)>;
306306
}
307307

308308
/// The `Filter` trait defines behavior for indicating chain activity of interest pertaining to

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
224224
}
225225

226226
// ...and make sure we can force-close a frozen channel
227-
nodes[0].node.force_close_channel(&channel_id).unwrap();
227+
nodes[0].node.force_close_channel(&channel_id, &nodes[1].node.get_our_node_id()).unwrap();
228228
check_added_monitors!(nodes[0], 1);
229229
check_closed_broadcast!(nodes[0], true);
230230

@@ -1102,7 +1102,7 @@ fn test_monitor_update_fail_reestablish() {
11021102
assert!(updates.update_fee.is_none());
11031103
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
11041104
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
1105-
expect_payment_forwarded!(nodes[1], nodes[0], Some(1000), false);
1105+
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
11061106
check_added_monitors!(nodes[1], 1);
11071107
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
11081108
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);
@@ -1809,9 +1809,9 @@ fn do_during_funding_monitor_fail(confirm_a_first: bool, restore_b_before_conf:
18091809
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id()));
18101810
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id()));
18111811

1812-
let (temporary_channel_id, funding_tx, funding_output) = create_funding_transaction(&nodes[0], 100000, 43);
1812+
let (temporary_channel_id, funding_tx, funding_output) = create_funding_transaction(&nodes[0], &nodes[1].node.get_our_node_id(), 100000, 43);
18131813

1814-
nodes[0].node.funding_transaction_generated(&temporary_channel_id, funding_tx.clone()).unwrap();
1814+
nodes[0].node.funding_transaction_generated(&temporary_channel_id, &nodes[1].node.get_our_node_id(), funding_tx.clone()).unwrap();
18151815
check_added_monitors!(nodes[0], 0);
18161816

18171817
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
@@ -2087,7 +2087,7 @@ fn test_fail_htlc_on_broadcast_after_claim() {
20872087
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &cs_updates.update_fulfill_htlcs[0]);
20882088
let bs_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
20892089
check_added_monitors!(nodes[1], 1);
2090-
expect_payment_forwarded!(nodes[1], nodes[0], Some(1000), false);
2090+
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
20912091

20922092
mine_transaction(&nodes[1], &bs_txn[0]);
20932093
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed);
@@ -2468,7 +2468,7 @@ fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_f
24682468
assert_eq!(fulfill_msg, cs_updates.update_fulfill_htlcs[0]);
24692469
}
24702470
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &fulfill_msg);
2471-
expect_payment_forwarded!(nodes[1], nodes[0], Some(1000), false);
2471+
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
24722472
check_added_monitors!(nodes[1], 1);
24732473

24742474
let mut bs_updates = None;
@@ -2538,7 +2538,7 @@ fn test_temporary_error_during_shutdown() {
25382538
chanmon_cfgs[0].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
25392539
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
25402540

2541-
nodes[0].node.close_channel(&channel_id).unwrap();
2541+
nodes[0].node.close_channel(&channel_id, &nodes[1].node.get_our_node_id()).unwrap();
25422542
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id()));
25432543
check_added_monitors!(nodes[1], 1);
25442544

@@ -2591,7 +2591,7 @@ fn test_permanent_error_during_sending_shutdown() {
25912591
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
25922592
chanmon_cfgs[0].persister.set_update_ret(Err(ChannelMonitorUpdateErr::PermanentFailure));
25932593

2594-
assert!(nodes[0].node.close_channel(&channel_id).is_ok());
2594+
assert!(nodes[0].node.close_channel(&channel_id, &nodes[1].node.get_our_node_id()).is_ok());
25952595
check_closed_broadcast!(nodes[0], true);
25962596
check_added_monitors!(nodes[0], 2);
25972597
check_closed_event!(nodes[0], 1, ClosureReason::ProcessingError { err: "ChannelMonitor storage failure".to_string() });
@@ -2612,7 +2612,7 @@ fn test_permanent_error_during_handling_shutdown() {
26122612
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
26132613
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::PermanentFailure));
26142614

2615-
assert!(nodes[0].node.close_channel(&channel_id).is_ok());
2615+
assert!(nodes[0].node.close_channel(&channel_id, &nodes[1].node.get_our_node_id()).is_ok());
26162616
let shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
26172617
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &shutdown);
26182618
check_closed_broadcast!(nodes[1], true);

0 commit comments

Comments
 (0)