@@ -121,20 +121,37 @@ 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
+ let witness_script_weight = 1 /* pubkey push */ + 33 /* pubkey */ +
139
+ 1 /* OP_CHECKSIGVERIFY */ + 1 /* OP_1 */ + 1 /* OP_CHECKSEQUENCEVERIFY */ ;
140
+ 1 /* num witness items */ + 1 /* sig push */ + 72 /* sig */ +
141
+ 1 /* witness script push */ + witness_script_weight
142
+ } else {
143
+ // Calculated as 1 byte legnth + 73 byte signature, 1 byte empty vec push, 1 byte length plus
144
+ // redeemscript push length.
145
+ 1 + 73 + 34
146
+ }
147
+ }
132
148
}
133
149
impl_writeable_tlv_based ! ( StaticPaymentOutputDescriptor , {
134
150
( 0 , outpoint, required) ,
135
151
( 2 , output, required) ,
136
152
( 4 , channel_keys_id, required) ,
137
153
( 6 , channel_value_satoshis, required) ,
154
+ ( 7 , channel_transaction_parameters, option) ,
138
155
} ) ;
139
156
140
157
/// Describes the necessary information to spend a spendable output.
@@ -201,15 +218,23 @@ pub enum SpendableOutputDescriptor {
201
218
/// [`DelayedPaymentOutputDescriptor::to_self_delay`] contained here to
202
219
/// [`chan_utils::get_revokeable_redeemscript`].
203
220
DelayedPaymentOutput ( DelayedPaymentOutputDescriptor ) ,
204
- /// An output to a P2WPKH, spendable exclusively by our payment key (i.e., the private key
205
- /// which corresponds to the `payment_point` in [`ChannelSigner::pubkeys`]). The witness
206
- /// in the spending input is, thus, simply:
221
+ /// An output spendable exclusively by our payment key (i.e., the private key which corresponds
222
+ /// to the `payment_point` in [`ChannelSigner::pubkeys`]). The output type depends on the
223
+ /// channel type negotiated.
224
+ ///
225
+ /// On an anchor outputs channel, the witness in the spending input is:
226
+ /// ```bitcoin
227
+ /// <BIP 143 signature> <witness script>
228
+ /// ```
229
+ ///
230
+ /// Otherwise, it is:
207
231
/// ```bitcoin
208
232
/// <BIP 143 signature> <payment key>
209
233
/// ```
210
234
///
211
235
/// These are generally the result of our counterparty having broadcast the current state,
212
- /// allowing us to claim the non-HTLC-encumbered outputs immediately.
236
+ /// allowing us to claim the non-HTLC-encumbered outputs immediately, or after one confirmation
237
+ /// in the case of anchor outputs channels.
213
238
StaticPaymentOutput ( StaticPaymentOutputDescriptor ) ,
214
239
}
215
240
@@ -280,13 +305,22 @@ impl SpendableOutputDescriptor {
280
305
match outp {
281
306
SpendableOutputDescriptor :: StaticPaymentOutput ( descriptor) => {
282
307
if !output_set. insert ( descriptor. outpoint ) { return Err ( ( ) ) ; }
308
+ let sequence =
309
+ if descriptor. channel_transaction_parameters . as_ref ( )
310
+ . map ( |channel_params| channel_params. channel_type_features . supports_anchors_zero_fee_htlc_tx ( ) )
311
+ . unwrap_or ( false )
312
+ {
313
+ Sequence :: from_consensus ( 1 )
314
+ } else {
315
+ Sequence :: ZERO
316
+ } ;
283
317
input. push ( TxIn {
284
318
previous_output : descriptor. outpoint . into_bitcoin_outpoint ( ) ,
285
319
script_sig : Script :: new ( ) ,
286
- sequence : Sequence :: ZERO ,
320
+ sequence,
287
321
witness : Witness :: new ( ) ,
288
322
} ) ;
289
- witness_weight += StaticPaymentOutputDescriptor :: MAX_WITNESS_LENGTH ;
323
+ witness_weight += descriptor . max_witness_length ( ) ;
290
324
#[ cfg( feature = "grind_signatures" ) ]
291
325
{ witness_weight -= 1 ; } // Guarantees a low R signature
292
326
input_value += descriptor. output . value ;
@@ -891,18 +925,30 @@ impl InMemorySigner {
891
925
if !spend_tx. input [ input_idx] . script_sig . is_empty ( ) { return Err ( ( ) ) ; }
892
926
if spend_tx. input [ input_idx] . previous_output != descriptor. outpoint . into_bitcoin_outpoint ( ) { return Err ( ( ) ) ; }
893
927
894
- let remotepubkey = self . pubkeys ( ) . payment_point ;
895
- let witness_script = bitcoin:: Address :: p2pkh ( & :: bitcoin:: PublicKey { compressed : true , inner : remotepubkey} , Network :: Testnet ) . script_pubkey ( ) ;
928
+ let remotepubkey = bitcoin:: PublicKey :: new ( self . pubkeys ( ) . payment_point ) ;
929
+ let witness_script = if self . channel_type_features ( ) . supports_anchors_zero_fee_htlc_tx ( ) {
930
+ chan_utils:: get_to_countersignatory_with_anchors_redeemscript ( & remotepubkey. inner )
931
+ } else {
932
+ Script :: new_p2pkh ( & remotepubkey. pubkey_hash ( ) )
933
+ } ;
896
934
let sighash = hash_to_message ! ( & sighash:: SighashCache :: new( spend_tx) . segwit_signature_hash( input_idx, & witness_script, descriptor. output. value, EcdsaSighashType :: All ) . unwrap( ) [ ..] ) ;
897
935
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 ( ) ;
936
+ let payment_script = if self . channel_type_features ( ) . supports_anchors_zero_fee_htlc_tx ( ) {
937
+ witness_script. to_v0_p2wsh ( )
938
+ } else {
939
+ Script :: new_v0_p2wpkh ( & remotepubkey. wpubkey_hash ( ) . unwrap ( ) )
940
+ } ;
899
941
900
942
if payment_script != descriptor. output . script_pubkey { return Err ( ( ) ) ; }
901
943
902
944
let mut witness = Vec :: with_capacity ( 2 ) ;
903
945
witness. push ( remotesig. serialize_der ( ) . to_vec ( ) ) ;
904
946
witness[ 0 ] . push ( EcdsaSighashType :: All as u8 ) ;
905
- witness. push ( remotepubkey. serialize ( ) . to_vec ( ) ) ;
947
+ if self . channel_type_features ( ) . supports_anchors_zero_fee_htlc_tx ( ) {
948
+ witness. push ( witness_script. to_bytes ( ) ) ;
949
+ } else {
950
+ witness. push ( remotepubkey. to_bytes ( ) ) ;
951
+ }
906
952
Ok ( witness)
907
953
}
908
954
@@ -1353,9 +1399,11 @@ impl KeysManager {
1353
1399
SpendableOutputDescriptor :: StaticPaymentOutput ( descriptor) => {
1354
1400
let input_idx = psbt. unsigned_tx . input . iter ( ) . position ( |i| i. previous_output == descriptor. outpoint . into_bitcoin_outpoint ( ) ) . ok_or ( ( ) ) ?;
1355
1401
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 ) ) ;
1402
+ let mut signer = self . derive_channel_keys ( descriptor. channel_value_satoshis , & descriptor. channel_keys_id ) ;
1403
+ if let Some ( channel_params) = descriptor. channel_transaction_parameters . as_ref ( ) {
1404
+ signer. provide_channel_parameters ( channel_params) ;
1405
+ }
1406
+ keys_cache = Some ( ( signer, descriptor. channel_keys_id ) ) ;
1359
1407
}
1360
1408
let witness = Witness :: from_vec ( keys_cache. as_ref ( ) . unwrap ( ) . 0 . sign_counterparty_payment_input ( & psbt. unsigned_tx , input_idx, & descriptor, & secp_ctx) ?) ;
1361
1409
psbt. inputs [ input_idx] . final_script_witness = Some ( witness) ;
0 commit comments