@@ -121,20 +121,34 @@ pub struct StaticPaymentOutputDescriptor {
121
121
pub channel_keys_id : [ u8 ; 32 ] ,
122
122
/// The value of the channel which this transactions spends.
123
123
pub channel_value_satoshis : u64 ,
124
+ /// The necessary channel parameters that need to be provided to the re-derived signer through
125
+ /// [`ChannelSigner::provide_channel_parameters`].
126
+ // Added as optional, but always set, in 0.0.117.
127
+ pub channel_transaction_parameters : Option < ChannelTransactionParameters > ,
124
128
}
125
129
impl StaticPaymentOutputDescriptor {
126
130
/// The maximum length a well-formed witness spending one of these should have.
127
131
/// Note: If you have the grind_signatures feature enabled, this will be at least 1 byte
128
132
/// shorter.
129
- // Calculated as 1 byte legnth + 73 byte signature, 1 byte empty vec push, 1 byte length plus
130
- // redeemscript push length.
131
- pub const MAX_WITNESS_LENGTH : usize = 1 + 73 + 34 ;
133
+ pub fn max_witness_length ( & self ) -> usize {
134
+ if self . channel_transaction_parameters . as_ref ( )
135
+ . map ( |channel_params| channel_params. channel_type_features . supports_anchors_zero_fee_htlc_tx ( ) )
136
+ . unwrap_or ( false )
137
+ {
138
+ 1 /* num witness items */ + 1 /* sig push */ + 72 /* sig */ + 1 /* witness script push */ + 37 /* witness script */
139
+ } else {
140
+ // Calculated as 1 byte legnth + 73 byte signature, 1 byte empty vec push, 1 byte length plus
141
+ // redeemscript push length.
142
+ 1 + 73 + 34
143
+ }
144
+ }
132
145
}
133
146
impl_writeable_tlv_based ! ( StaticPaymentOutputDescriptor , {
134
147
( 0 , outpoint, required) ,
135
148
( 2 , output, required) ,
136
149
( 4 , channel_keys_id, required) ,
137
150
( 6 , channel_value_satoshis, required) ,
151
+ ( 7 , channel_transaction_parameters, option) ,
138
152
} ) ;
139
153
140
154
/// Describes the necessary information to spend a spendable output.
@@ -280,13 +294,22 @@ impl SpendableOutputDescriptor {
280
294
match outp {
281
295
SpendableOutputDescriptor :: StaticPaymentOutput ( descriptor) => {
282
296
if !output_set. insert ( descriptor. outpoint ) { return Err ( ( ) ) ; }
297
+ let sequence =
298
+ if descriptor. channel_transaction_parameters . as_ref ( )
299
+ . map ( |channel_params| channel_params. channel_type_features . supports_anchors_zero_fee_htlc_tx ( ) )
300
+ . unwrap_or ( false )
301
+ {
302
+ Sequence :: from_consensus ( 1 )
303
+ } else {
304
+ Sequence :: ZERO
305
+ } ;
283
306
input. push ( TxIn {
284
307
previous_output : descriptor. outpoint . into_bitcoin_outpoint ( ) ,
285
308
script_sig : Script :: new ( ) ,
286
- sequence : Sequence :: ZERO ,
309
+ sequence,
287
310
witness : Witness :: new ( ) ,
288
311
} ) ;
289
- witness_weight += StaticPaymentOutputDescriptor :: MAX_WITNESS_LENGTH ;
312
+ witness_weight += descriptor . max_witness_length ( ) ;
290
313
#[ cfg( feature = "grind_signatures" ) ]
291
314
{ witness_weight -= 1 ; } // Guarantees a low R signature
292
315
input_value += descriptor. output . value ;
@@ -891,18 +914,30 @@ impl InMemorySigner {
891
914
if !spend_tx. input [ input_idx] . script_sig . is_empty ( ) { return Err ( ( ) ) ; }
892
915
if spend_tx. input [ input_idx] . previous_output != descriptor. outpoint . into_bitcoin_outpoint ( ) { return Err ( ( ) ) ; }
893
916
894
- let remotepubkey = self . pubkeys ( ) . payment_point ;
895
- let witness_script = bitcoin:: Address :: p2pkh ( & :: bitcoin:: PublicKey { compressed : true , inner : remotepubkey} , Network :: Testnet ) . script_pubkey ( ) ;
917
+ let remotepubkey = bitcoin:: PublicKey :: new ( self . pubkeys ( ) . payment_point ) ;
918
+ let witness_script = if self . channel_type_features ( ) . supports_anchors_zero_fee_htlc_tx ( ) {
919
+ chan_utils:: get_to_countersignatory_with_anchors_redeemscript ( & remotepubkey. inner )
920
+ } else {
921
+ Script :: new_p2pkh ( & remotepubkey. pubkey_hash ( ) )
922
+ } ;
896
923
let sighash = hash_to_message ! ( & sighash:: SighashCache :: new( spend_tx) . segwit_signature_hash( input_idx, & witness_script, descriptor. output. value, EcdsaSighashType :: All ) . unwrap( ) [ ..] ) ;
897
924
let remotesig = sign_with_aux_rand ( secp_ctx, & sighash, & self . payment_key , & self ) ;
898
- let payment_script = bitcoin:: Address :: p2wpkh ( & :: bitcoin:: PublicKey { compressed : true , inner : remotepubkey} , Network :: Bitcoin ) . unwrap ( ) . script_pubkey ( ) ;
925
+ let payment_script = if self . channel_type_features ( ) . supports_anchors_zero_fee_htlc_tx ( ) {
926
+ witness_script. to_v0_p2wsh ( )
927
+ } else {
928
+ Script :: new_v0_p2wpkh ( & remotepubkey. wpubkey_hash ( ) . unwrap ( ) )
929
+ } ;
899
930
900
931
if payment_script != descriptor. output . script_pubkey { return Err ( ( ) ) ; }
901
932
902
933
let mut witness = Vec :: with_capacity ( 2 ) ;
903
934
witness. push ( remotesig. serialize_der ( ) . to_vec ( ) ) ;
904
935
witness[ 0 ] . push ( EcdsaSighashType :: All as u8 ) ;
905
- witness. push ( remotepubkey. serialize ( ) . to_vec ( ) ) ;
936
+ if self . channel_type_features ( ) . supports_anchors_zero_fee_htlc_tx ( ) {
937
+ witness. push ( witness_script. to_bytes ( ) ) ;
938
+ } else {
939
+ witness. push ( remotepubkey. to_bytes ( ) ) ;
940
+ }
906
941
Ok ( witness)
907
942
}
908
943
@@ -1353,9 +1388,11 @@ impl KeysManager {
1353
1388
SpendableOutputDescriptor :: StaticPaymentOutput ( descriptor) => {
1354
1389
let input_idx = psbt. unsigned_tx . input . iter ( ) . position ( |i| i. previous_output == descriptor. outpoint . into_bitcoin_outpoint ( ) ) . ok_or ( ( ) ) ?;
1355
1390
if keys_cache. is_none ( ) || keys_cache. as_ref ( ) . unwrap ( ) . 1 != descriptor. channel_keys_id {
1356
- keys_cache = Some ( (
1357
- self . derive_channel_keys ( descriptor. channel_value_satoshis , & descriptor. channel_keys_id ) ,
1358
- descriptor. channel_keys_id ) ) ;
1391
+ let mut signer = self . derive_channel_keys ( descriptor. channel_value_satoshis , & descriptor. channel_keys_id ) ;
1392
+ if let Some ( channel_params) = descriptor. channel_transaction_parameters . as_ref ( ) {
1393
+ signer. provide_channel_parameters ( channel_params) ;
1394
+ }
1395
+ keys_cache = Some ( ( signer, descriptor. channel_keys_id ) ) ;
1359
1396
}
1360
1397
let witness = Witness :: from_vec ( keys_cache. as_ref ( ) . unwrap ( ) . 0 . sign_counterparty_payment_input ( & psbt. unsigned_tx , input_idx, & descriptor, & secp_ctx) ?) ;
1361
1398
psbt. inputs [ input_idx] . final_script_witness = Some ( witness) ;
0 commit comments