Skip to content

Commit cbe0166

Browse files
committed
Test async sign_closing_transaction
1 parent eb3e9ee commit cbe0166

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

lightning/src/ln/async_signer_tests.rs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ use bitcoin::transaction::Version;
1717
use crate::chain::channelmonitor::LATENCY_GRACE_PERIOD_BLOCKS;
1818
use crate::chain::ChannelMonitorUpdateStatus;
1919
use crate::events::bump_transaction::WalletSource;
20-
use crate::events::{ClosureReason, Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose};
20+
use crate::events::{ClosureReason, Event, MessageSendEvent, MessageSendEventsProvider};
2121
use crate::ln::{functional_test_utils::*, msgs};
22+
use crate::ln::channel_state::{ChannelDetails, ChannelShutdownState};
2223
use crate::ln::msgs::ChannelMessageHandler;
2324
use crate::ln::channelmanager::{PaymentId, RAACommitmentOrder, RecipientOnionFields};
2425
use crate::util::test_channel_signer::SignerOp;
@@ -695,3 +696,62 @@ fn test_async_holder_signatures_anchors() {
695696
fn test_async_holder_signatures_remote_commitment_anchors() {
696697
do_test_async_holder_signatures(true, true);
697698
}
699+
700+
#[test]
701+
fn test_closing_signed() {
702+
// Based off of `expect_channel_shutdown_state`.
703+
// Test that we can asynchronously sign closing transactions.
704+
let chanmon_cfgs = create_chanmon_cfgs(2);
705+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
706+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
707+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
708+
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1);
709+
710+
expect_channel_shutdown_state!(nodes[0], chan_1.2, ChannelShutdownState::NotShuttingDown);
711+
712+
nodes[0].node.close_channel(&chan_1.2, &nodes[1].node.get_our_node_id()).unwrap();
713+
714+
expect_channel_shutdown_state!(nodes[0], chan_1.2, ChannelShutdownState::ShutdownInitiated);
715+
expect_channel_shutdown_state!(nodes[1], chan_1.2, ChannelShutdownState::NotShuttingDown);
716+
717+
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
718+
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &node_0_shutdown);
719+
720+
expect_channel_shutdown_state!(nodes[0], chan_1.2, ChannelShutdownState::ShutdownInitiated);
721+
expect_channel_shutdown_state!(nodes[1], chan_1.2, ChannelShutdownState::NegotiatingClosingFee);
722+
723+
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
724+
nodes[0].disable_channel_signer_op(&nodes[1].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);
725+
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &node_1_shutdown);
726+
727+
expect_channel_shutdown_state!(nodes[0], chan_1.2, ChannelShutdownState::NegotiatingClosingFee);
728+
expect_channel_shutdown_state!(nodes[1], chan_1.2, ChannelShutdownState::NegotiatingClosingFee);
729+
730+
let events = nodes[0].node.get_and_clear_pending_msg_events();
731+
assert!(events.is_empty(), "Expected no events, got {:?}", events);
732+
nodes[0].enable_channel_signer_op(&nodes[1].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);
733+
nodes[0].node.signer_unblocked(None);
734+
735+
let node_0_closing_signed = get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, nodes[1].node.get_our_node_id());
736+
nodes[1].disable_channel_signer_op(&nodes[0].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);
737+
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_closing_signed);
738+
739+
let events = nodes[1].node.get_and_clear_pending_msg_events();
740+
assert!(events.is_empty(), "Expected no events, got {:?}", events);
741+
nodes[1].enable_channel_signer_op(&nodes[0].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);
742+
nodes[1].node.signer_unblocked(None);
743+
744+
let node_1_closing_signed = get_event_msg!(nodes[1], MessageSendEvent::SendClosingSigned, nodes[0].node.get_our_node_id());
745+
// From here we don't make any new signatures, so there's no need to test blocking the
746+
// signer.
747+
nodes[0].node.handle_closing_signed(&nodes[1].node.get_our_node_id(), &node_1_closing_signed);
748+
let (_, node_0_2nd_closing_signed) = get_closing_signed_broadcast!(nodes[0].node, nodes[1].node.get_our_node_id());
749+
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
750+
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
751+
assert!(node_1_none.is_none());
752+
753+
assert!(nodes[0].node.list_channels().is_empty());
754+
assert!(nodes[1].node.list_channels().is_empty());
755+
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
756+
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
757+
}

lightning/src/util/test_channel_signer.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,10 @@ impl EcdsaChannelSigner for TestChannelSigner {
317317
}
318318

319319
fn sign_closing_transaction(&self, closing_tx: &ClosingTransaction, secp_ctx: &Secp256k1<secp256k1::All>) -> Result<Signature, ()> {
320+
#[cfg(test)]
321+
if !self.is_signer_available(SignerOp::SignClosingTransaction) {
322+
return Err(());
323+
}
320324
closing_tx.verify(self.inner.funding_outpoint().unwrap().into_bitcoin_outpoint())
321325
.expect("derived different closing transaction");
322326
Ok(self.inner.sign_closing_transaction(closing_tx, secp_ctx).unwrap())

0 commit comments

Comments
 (0)