11
11
//! properly with a signer implementation that asynchronously derives signatures.
12
12
13
13
use std:: collections:: HashSet ;
14
-
14
+ use bitcoin :: key :: Secp256k1 ;
15
15
use bitcoin:: { Transaction , TxOut , TxIn , Amount } ;
16
16
use bitcoin:: locktime:: absolute:: LockTime ;
17
17
use bitcoin:: transaction:: Version ;
@@ -20,10 +20,13 @@ use crate::chain::channelmonitor::LATENCY_GRACE_PERIOD_BLOCKS;
20
20
use crate :: chain:: ChannelMonitorUpdateStatus ;
21
21
use crate :: events:: bump_transaction:: WalletSource ;
22
22
use crate :: events:: { ClosureReason , Event , MessageSendEvent , MessageSendEventsProvider } ;
23
+ use crate :: ln:: chan_utils:: ClosingTransaction ;
23
24
use crate :: ln:: { functional_test_utils:: * , msgs} ;
24
25
use crate :: ln:: channel_state:: { ChannelDetails , ChannelShutdownState } ;
25
26
use crate :: ln:: msgs:: ChannelMessageHandler ;
26
27
use crate :: ln:: channelmanager:: { PaymentId , RAACommitmentOrder , RecipientOnionFields } ;
28
+ use crate :: sign:: ecdsa:: EcdsaChannelSigner ;
29
+ use crate :: sign:: SignerProvider ;
27
30
use crate :: util:: test_channel_signer:: SignerOp ;
28
31
use crate :: util:: logger:: Logger ;
29
32
@@ -851,6 +854,11 @@ fn test_async_holder_signatures_remote_commitment_anchors() {
851
854
852
855
#[ test]
853
856
fn test_closing_signed ( ) {
857
+ do_test_closing_signed ( false ) ;
858
+ do_test_closing_signed ( true ) ;
859
+ }
860
+
861
+ fn do_test_closing_signed ( extra_closing_signed : bool ) {
854
862
// Based off of `expect_channel_shutdown_state`.
855
863
// Test that we can asynchronously sign closing transactions.
856
864
let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
@@ -898,6 +906,40 @@ fn test_closing_signed() {
898
906
nodes[ 0 ] . disable_channel_signer_op ( & nodes[ 1 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
899
907
nodes[ 0 ] . node . handle_closing_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & node_1_closing_signed) ;
900
908
nodes[ 0 ] . enable_channel_signer_op ( & nodes[ 1 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
909
+
910
+ if extra_closing_signed {
911
+ let node_1_closing_signed_2_bad = {
912
+ let mut node_1_closing_signed_2 = node_1_closing_signed. clone ( ) ;
913
+ //node_1_closing_signed_2.signature.
914
+ let holder_script = nodes[ 0 ] . keys_manager . get_shutdown_scriptpubkey ( ) . unwrap ( ) ;
915
+ let counterparty_script = nodes[ 1 ] . keys_manager . get_shutdown_scriptpubkey ( ) . unwrap ( ) ;
916
+ let funding_outpoint = bitcoin:: OutPoint { txid : chan_1. 3 . txid ( ) , vout : 0 } ;
917
+ let closing_tx_2 = ClosingTransaction :: new ( 50000 , 0 , holder_script. into ( ) ,
918
+ counterparty_script. into ( ) , funding_outpoint) ;
919
+
920
+ let per_peer_state = nodes[ 1 ] . node . per_peer_state . read ( ) . unwrap ( ) ;
921
+ let mut chan_lock = per_peer_state. get ( & nodes[ 0 ] . node . get_our_node_id ( ) ) . unwrap ( ) . lock ( ) . unwrap ( ) ;
922
+ let chan = chan_lock. channel_by_id . get_mut ( & chan_1. 2 ) . map ( |phase| phase. context_mut ( ) ) . unwrap ( ) ;
923
+
924
+ let signer = chan. get_mut_signer ( ) . as_mut_ecdsa ( ) . unwrap ( ) ;
925
+ let signature = signer. sign_closing_transaction ( & closing_tx_2, & Secp256k1 :: new ( ) ) . unwrap ( ) ;
926
+ node_1_closing_signed_2. signature = signature;
927
+ node_1_closing_signed_2
928
+ } ;
929
+ nodes[ 0 ] . node . handle_closing_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & node_1_closing_signed_2_bad) ;
930
+
931
+ let events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
932
+ assert_eq ! ( events. len( ) , 1 ) ;
933
+ match events[ 0 ] {
934
+ MessageSendEvent :: HandleError {
935
+ action : msgs:: ErrorAction :: SendWarningMessage { .. } , ref node_id
936
+ } => {
937
+ assert_eq ! ( node_id, & nodes[ 1 ] . node. get_our_node_id( ) ) ;
938
+ } ,
939
+ _ => panic ! ( "Unexpected event: {:?}" , events[ 0 ] ) ,
940
+ } ;
941
+ }
942
+
901
943
nodes[ 0 ] . node . signer_unblocked ( None ) ;
902
944
let ( _, node_0_2nd_closing_signed) = get_closing_signed_broadcast ! ( nodes[ 0 ] . node, nodes[ 1 ] . node. get_our_node_id( ) ) ;
903
945
0 commit comments