Skip to content

Commit fc44774

Browse files
committed
Test async sign_closing_transaction
1 parent 2d6c763 commit fc44774

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

lightning/src/ln/async_signer_tests.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use crate::chain::ChannelMonitorUpdateStatus;
2121
use crate::events::bump_transaction::WalletSource;
2222
use crate::events::{ClosureReason, Event, MessageSendEvent, MessageSendEventsProvider};
2323
use crate::ln::{functional_test_utils::*, msgs};
24+
use crate::ln::channel_state::{ChannelDetails, ChannelShutdownState};
2425
use crate::ln::msgs::ChannelMessageHandler;
2526
use crate::ln::channelmanager::{PaymentId, RAACommitmentOrder, RecipientOnionFields};
2627
use crate::util::test_channel_signer::SignerOp;
@@ -847,3 +848,62 @@ fn test_async_holder_signatures_anchors() {
847848
fn test_async_holder_signatures_remote_commitment_anchors() {
848849
do_test_async_holder_signatures(true, true);
849850
}
851+
852+
#[test]
853+
fn test_closing_signed() {
854+
// Based off of `expect_channel_shutdown_state`.
855+
// Test that we can asynchronously sign closing transactions.
856+
let chanmon_cfgs = create_chanmon_cfgs(2);
857+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
858+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
859+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
860+
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1);
861+
862+
expect_channel_shutdown_state!(nodes[0], chan_1.2, ChannelShutdownState::NotShuttingDown);
863+
864+
nodes[0].node.close_channel(&chan_1.2, &nodes[1].node.get_our_node_id()).unwrap();
865+
866+
expect_channel_shutdown_state!(nodes[0], chan_1.2, ChannelShutdownState::ShutdownInitiated);
867+
expect_channel_shutdown_state!(nodes[1], chan_1.2, ChannelShutdownState::NotShuttingDown);
868+
869+
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
870+
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &node_0_shutdown);
871+
872+
expect_channel_shutdown_state!(nodes[0], chan_1.2, ChannelShutdownState::ShutdownInitiated);
873+
expect_channel_shutdown_state!(nodes[1], chan_1.2, ChannelShutdownState::NegotiatingClosingFee);
874+
875+
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
876+
nodes[0].disable_channel_signer_op(&nodes[1].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);
877+
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &node_1_shutdown);
878+
879+
expect_channel_shutdown_state!(nodes[0], chan_1.2, ChannelShutdownState::NegotiatingClosingFee);
880+
expect_channel_shutdown_state!(nodes[1], chan_1.2, ChannelShutdownState::NegotiatingClosingFee);
881+
882+
let events = nodes[0].node.get_and_clear_pending_msg_events();
883+
assert!(events.is_empty(), "Expected no events, got {:?}", events);
884+
nodes[0].enable_channel_signer_op(&nodes[1].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);
885+
nodes[0].node.signer_unblocked(None);
886+
887+
let node_0_closing_signed = get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, nodes[1].node.get_our_node_id());
888+
nodes[1].disable_channel_signer_op(&nodes[0].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);
889+
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_closing_signed);
890+
891+
let events = nodes[1].node.get_and_clear_pending_msg_events();
892+
assert!(events.is_empty(), "Expected no events, got {:?}", events);
893+
nodes[1].enable_channel_signer_op(&nodes[0].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);
894+
nodes[1].node.signer_unblocked(None);
895+
896+
let node_1_closing_signed = get_event_msg!(nodes[1], MessageSendEvent::SendClosingSigned, nodes[0].node.get_our_node_id());
897+
// From here we don't make any new signatures, so there's no need to test blocking the
898+
// signer.
899+
nodes[0].node.handle_closing_signed(&nodes[1].node.get_our_node_id(), &node_1_closing_signed);
900+
let (_, node_0_2nd_closing_signed) = get_closing_signed_broadcast!(nodes[0].node, nodes[1].node.get_our_node_id());
901+
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
902+
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
903+
assert!(node_1_none.is_none());
904+
905+
assert!(nodes[0].node.list_channels().is_empty());
906+
assert!(nodes[1].node.list_channels().is_empty());
907+
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
908+
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
909+
}

lightning/src/util/test_channel_signer.rs

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

327327
fn sign_closing_transaction(&self, closing_tx: &ClosingTransaction, secp_ctx: &Secp256k1<secp256k1::All>) -> Result<Signature, ()> {
328+
#[cfg(test)]
329+
if !self.is_signer_available(SignerOp::SignClosingTransaction) {
330+
return Err(());
331+
}
328332
closing_tx.verify(self.inner.funding_outpoint().unwrap().into_bitcoin_outpoint())
329333
.expect("derived different closing transaction");
330334
Ok(self.inner.sign_closing_transaction(closing_tx, secp_ctx).unwrap())

0 commit comments

Comments
 (0)