@@ -26,19 +26,27 @@ use crate::ln::msgs::ChannelMessageHandler;
26
26
#[ cfg( anchors) ]
27
27
use crate :: util:: config:: UserConfig ;
28
28
#[ cfg( anchors) ]
29
+ use crate :: util:: crypto:: sign;
30
+ #[ cfg( anchors) ]
29
31
use crate :: util:: events:: BumpTransactionEvent ;
30
32
use crate :: util:: events:: { Event , MessageSendEvent , MessageSendEventsProvider , ClosureReason , HTLCDestination } ;
31
33
#[ cfg( anchors) ]
32
34
use crate :: util:: ser:: Writeable ;
33
35
#[ cfg( anchors) ]
34
36
use crate :: util:: test_utils;
35
37
38
+ #[ cfg( anchors) ]
39
+ use bitcoin:: blockdata:: transaction:: EcdsaSighashType ;
36
40
use bitcoin:: blockdata:: script:: Builder ;
37
41
use bitcoin:: blockdata:: opcodes;
38
42
use bitcoin:: secp256k1:: Secp256k1 ;
39
43
#[ cfg( anchors) ]
40
- use bitcoin:: { Amount , Script , TxIn , TxOut , PackedLockTime } ;
44
+ use bitcoin:: secp256k1:: SecretKey ;
45
+ #[ cfg( anchors) ]
46
+ use bitcoin:: { Amount , PublicKey , Script , TxIn , TxOut , PackedLockTime , Witness } ;
41
47
use bitcoin:: Transaction ;
48
+ #[ cfg( anchors) ]
49
+ use bitcoin:: util:: sighash:: SighashCache ;
42
50
43
51
use crate :: prelude:: * ;
44
52
@@ -1892,15 +1900,33 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
1892
1900
assert_eq ! ( events. len( ) , 1 ) ;
1893
1901
let ( revoked_commitment, anchor_tx) = match & events[ 0 ] {
1894
1902
Event :: BumpTransaction ( BumpTransactionEvent :: ChannelClose { commitment_tx, anchor_descriptor, .. } ) => {
1903
+ let secret_key = SecretKey :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
1904
+ let public_key = PublicKey :: new ( secret_key. public_key ( & secp) ) ;
1905
+ let fee_utxo_script = Script :: new_v0_p2wpkh ( & public_key. wpubkey_hash ( ) . unwrap ( ) ) ;
1906
+ let coinbase_tx = Transaction {
1907
+ version : 2 ,
1908
+ lock_time : PackedLockTime :: ZERO ,
1909
+ input : vec ! [ TxIn { ..Default :: default ( ) } ] ,
1910
+ output : vec ! [ TxOut { // UTXO to attach fees to `anchor_tx`
1911
+ value: Amount :: ONE_BTC . to_sat( ) ,
1912
+ script_pubkey: fee_utxo_script. clone( ) ,
1913
+ } ] ,
1914
+ } ;
1895
1915
let mut anchor_tx = Transaction {
1896
1916
version : 2 ,
1897
1917
lock_time : PackedLockTime :: ZERO ,
1898
1918
input : vec ! [
1899
- TxIn { previous_output: anchor_descriptor. outpoint, ..Default :: default ( ) } ,
1900
- TxIn { ..Default :: default ( ) } ,
1919
+ TxIn { // Anchor input
1920
+ previous_output: anchor_descriptor. outpoint,
1921
+ ..Default :: default ( )
1922
+ } ,
1923
+ TxIn { // Fee input
1924
+ previous_output: bitcoin:: OutPoint { txid: coinbase_tx. txid( ) , vout: 0 } ,
1925
+ ..Default :: default ( )
1926
+ } ,
1901
1927
] ,
1902
- output : vec ! [ TxOut {
1903
- value: Amount :: ONE_BTC . to_sat ( ) ,
1928
+ output : vec ! [ TxOut { // Fee input change
1929
+ value: coinbase_tx . output [ 0 ] . value / 2 ,
1904
1930
script_pubkey: Script :: new_op_return( & [ ] ) ,
1905
1931
} ] ,
1906
1932
} ;
@@ -1911,6 +1937,21 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
1911
1937
anchor_tx. input [ 0 ] . witness = chan_utils:: build_anchor_input_witness (
1912
1938
& signer. pubkeys ( ) . funding_pubkey , & funding_sig
1913
1939
) ;
1940
+ anchor_tx. input [ 0 ] . witness = chan_utils:: build_anchor_input_witness (
1941
+ & signer. pubkeys ( ) . funding_pubkey , & funding_sig
1942
+ ) ;
1943
+ let fee_utxo_sig = {
1944
+ let witness_script = Script :: new_p2pkh ( & public_key. pubkey_hash ( ) ) ;
1945
+ let sighash = hash_to_message ! ( & SighashCache :: new( & anchor_tx) . segwit_signature_hash(
1946
+ 1 , & witness_script, coinbase_tx. output[ 0 ] . value, EcdsaSighashType :: All
1947
+ ) . unwrap( ) [ ..] ) ;
1948
+ let sig = sign ( & secp, & sighash, & secret_key) ;
1949
+ let mut sig = sig. serialize_der ( ) . to_vec ( ) ;
1950
+ sig. push ( EcdsaSighashType :: All as u8 ) ;
1951
+ sig
1952
+ } ;
1953
+ anchor_tx. input [ 1 ] . witness = Witness :: from_vec ( vec ! [ fee_utxo_sig, public_key. to_bytes( ) ] ) ;
1954
+ check_spends ! ( anchor_tx, commitment_tx, coinbase_tx) ;
1914
1955
( commitment_tx, anchor_tx)
1915
1956
} ,
1916
1957
_ => panic ! ( "Unexpected event" ) ,
@@ -1951,17 +1992,32 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
1951
1992
} ,
1952
1993
_ => assert_eq ! ( events. len( ) , 1 ) ,
1953
1994
} ;
1954
- let mut htlc_tx = Transaction {
1955
- version : 2 ,
1956
- lock_time : PackedLockTime :: ZERO ,
1957
- input : vec ! [ TxIn { ..Default :: default ( ) } ] , // Fee input
1958
- output : vec ! [ TxOut { // Fee input change
1959
- value: Amount :: ONE_BTC . to_sat( ) ,
1960
- script_pubkey: Script :: new_op_return( & [ ] ) ,
1961
- } ]
1962
- } ;
1963
- match & events[ 0 ] {
1964
- Event :: BumpTransaction ( BumpTransactionEvent :: HTLCResolution { htlc_descriptors, .. } ) => {
1995
+ let htlc_tx = {
1996
+ let secret_key = SecretKey :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
1997
+ let public_key = PublicKey :: new ( secret_key. public_key ( & secp) ) ;
1998
+ let fee_utxo_script = Script :: new_v0_p2wpkh ( & public_key. wpubkey_hash ( ) . unwrap ( ) ) ;
1999
+ let coinbase_tx = Transaction {
2000
+ version : 2 ,
2001
+ lock_time : PackedLockTime :: ZERO ,
2002
+ input : vec ! [ TxIn { ..Default :: default ( ) } ] ,
2003
+ output : vec ! [ TxOut { // UTXO to attach fees to `htlc_tx`
2004
+ value: Amount :: ONE_BTC . to_sat( ) ,
2005
+ script_pubkey: fee_utxo_script. clone( ) ,
2006
+ } ] ,
2007
+ } ;
2008
+ let mut htlc_tx = Transaction {
2009
+ version : 2 ,
2010
+ lock_time : PackedLockTime :: ZERO ,
2011
+ input : vec ! [ TxIn { // Fee input
2012
+ previous_output: bitcoin:: OutPoint { txid: coinbase_tx. txid( ) , vout: 0 } ,
2013
+ ..Default :: default ( )
2014
+ } ] ,
2015
+ output : vec ! [ TxOut { // Fee input change
2016
+ value: coinbase_tx. output[ 0 ] . value / 2 ,
2017
+ script_pubkey: Script :: new_op_return( & [ ] ) ,
2018
+ } ] ,
2019
+ } ;
2020
+ if let Event :: BumpTransaction ( BumpTransactionEvent :: HTLCResolution { htlc_descriptors, .. } ) = & events[ 0 ] {
1965
2021
assert_eq ! ( htlc_descriptors. len( ) , 2 ) ;
1966
2022
for htlc_descriptor in htlc_descriptors {
1967
2023
assert ! ( !htlc_descriptor. htlc. offered) ;
@@ -1982,9 +2038,23 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
1982
2038
let witness_script = htlc_descriptor. witness_script ( & per_commitment_point, & secp) ;
1983
2039
htlc_tx. input [ htlc_input_idx] . witness = htlc_descriptor. tx_input_witness ( & our_sig, & witness_script) ;
1984
2040
}
1985
- } ,
1986
- _ => panic ! ( "Unexpected event" ) ,
1987
- }
2041
+ } else {
2042
+ panic ! ( "Unexpected event" ) ;
2043
+ }
2044
+ let fee_utxo_sig = {
2045
+ let witness_script = Script :: new_p2pkh ( & public_key. pubkey_hash ( ) ) ;
2046
+ let sighash = hash_to_message ! ( & SighashCache :: new( & htlc_tx) . segwit_signature_hash(
2047
+ 0 , & witness_script, coinbase_tx. output[ 0 ] . value, EcdsaSighashType :: All
2048
+ ) . unwrap( ) [ ..] ) ;
2049
+ let sig = sign ( & secp, & sighash, & secret_key) ;
2050
+ let mut sig = sig. serialize_der ( ) . to_vec ( ) ;
2051
+ sig. push ( EcdsaSighashType :: All as u8 ) ;
2052
+ sig
2053
+ } ;
2054
+ htlc_tx. input [ 0 ] . witness = Witness :: from_vec ( vec ! [ fee_utxo_sig, public_key. to_bytes( ) ] ) ;
2055
+ check_spends ! ( htlc_tx, coinbase_tx, revoked_commitment) ;
2056
+ htlc_tx
2057
+ } ;
1988
2058
1989
2059
for node in & nodes {
1990
2060
mine_transaction ( node, & htlc_tx) ;
0 commit comments