@@ -270,11 +270,14 @@ pub enum SpendableOutputDescriptor {
270
270
/// it is an output from an old state which we broadcast (which should never happen).
271
271
///
272
272
/// To derive the delayed payment key which is used to sign this input, you must pass the
273
- /// holder [`InMemorySigner::delayed_payment_base_key`] (i.e., the private key which corresponds to the
274
- /// [`ChannelPublicKeys::delayed_payment_basepoint`] in [`ChannelSigner::pubkeys`]) and the provided
275
- /// [`DelayedPaymentOutputDescriptor::per_commitment_point`] to [`chan_utils::derive_private_key`]. The DelayedPaymentKey can be
276
- /// generated without the secret key using [`DelayedPaymentKey::from_basepoint`] and only the
277
- /// [`ChannelPublicKeys::delayed_payment_basepoint`] which appears in [`ChannelSigner::pubkeys`].
273
+ /// holder [`InMemorySigner::delayed_payment_base_key`] (i.e., the private key which
274
+ /// corresponds to the [`ChannelPublicKeys::delayed_payment_basepoint`] in
275
+ /// [`ChannelSigner::new_pubkeys`]) and the provided
276
+ /// [`DelayedPaymentOutputDescriptor::per_commitment_point`] to
277
+ /// [`chan_utils::derive_private_key`]. The DelayedPaymentKey can be generated without the
278
+ /// secret key using [`DelayedPaymentKey::from_basepoint`] and only the
279
+ /// [`ChannelPublicKeys::delayed_payment_basepoint`] which appears in
280
+ /// [`ChannelSigner::new_pubkeys`].
278
281
///
279
282
/// To derive the [`DelayedPaymentOutputDescriptor::revocation_pubkey`] provided here (which is
280
283
/// used in the witness script generation), you must pass the counterparty
@@ -289,7 +292,7 @@ pub enum SpendableOutputDescriptor {
289
292
/// [`chan_utils::get_revokeable_redeemscript`].
290
293
DelayedPaymentOutput ( DelayedPaymentOutputDescriptor ) ,
291
294
/// An output spendable exclusively by our payment key (i.e., the private key that corresponds
292
- /// to the `payment_point` in [`ChannelSigner::pubkeys `]). The output type depends on the
295
+ /// to the `payment_point` in [`ChannelSigner::new_pubkeys `]). The output type depends on the
293
296
/// channel type negotiated.
294
297
///
295
298
/// On an anchor outputs channel, the witness in the spending input is:
@@ -789,14 +792,17 @@ pub trait ChannelSigner {
789
792
/// and pause future signing operations until this validation completes.
790
793
fn validate_counterparty_revocation ( & self , idx : u64 , secret : & SecretKey ) -> Result < ( ) , ( ) > ;
791
794
792
- /// Returns the holder's channel public keys and basepoints.
795
+ /// Returns a *new* set of holder channel public keys and basepoints. They may be the same as a
796
+ /// previous value, but are also allowed to change arbitrarily. Signing methods must still
797
+ /// support signing for any keys which have ever been returned. This should only be called
798
+ /// either for new channels or new splices.
793
799
///
794
800
/// `splice_parent_funding_txid` can be used to compute a tweak to rotate the funding key in the
795
801
/// 2-of-2 multisig script during a splice. See [`compute_funding_key_tweak`] for an example
796
802
/// tweak and more details.
797
803
///
798
804
/// This method is *not* asynchronous. Instead, the value must be cached locally.
799
- fn pubkeys (
805
+ fn new_pubkeys (
800
806
& self , splice_parent_funding_txid : Option < Txid > , secp_ctx : & Secp256k1 < secp256k1:: All > ,
801
807
) -> ChannelPublicKeys ;
802
808
@@ -1095,7 +1101,7 @@ mod sealed {
1095
1101
use bitcoin:: secp256k1:: { Scalar , SecretKey } ;
1096
1102
1097
1103
#[ derive( Clone , PartialEq ) ]
1098
- pub struct MaybeTweakedSecretKey ( SecretKey ) ;
1104
+ pub struct MaybeTweakedSecretKey ( pub ( super ) SecretKey ) ;
1099
1105
1100
1106
impl From < SecretKey > for MaybeTweakedSecretKey {
1101
1107
fn from ( value : SecretKey ) -> Self {
@@ -1163,8 +1169,6 @@ pub struct InMemorySigner {
1163
1169
pub htlc_base_key : SecretKey ,
1164
1170
/// Commitment seed.
1165
1171
pub commitment_seed : [ u8 ; 32 ] ,
1166
- /// Holder public keys and basepoints.
1167
- pub ( crate ) holder_channel_pubkeys : ChannelPublicKeys ,
1168
1172
/// Key derivation parameters.
1169
1173
channel_keys_id : [ u8 ; 32 ] ,
1170
1174
/// A source of random bytes.
@@ -1180,7 +1184,6 @@ impl PartialEq for InMemorySigner {
1180
1184
&& self . delayed_payment_base_key == other. delayed_payment_base_key
1181
1185
&& self . htlc_base_key == other. htlc_base_key
1182
1186
&& self . commitment_seed == other. commitment_seed
1183
- && self . holder_channel_pubkeys == other. holder_channel_pubkeys
1184
1187
&& self . channel_keys_id == other. channel_keys_id
1185
1188
}
1186
1189
}
@@ -1195,7 +1198,6 @@ impl Clone for InMemorySigner {
1195
1198
delayed_payment_base_key : self . delayed_payment_base_key . clone ( ) ,
1196
1199
htlc_base_key : self . htlc_base_key . clone ( ) ,
1197
1200
commitment_seed : self . commitment_seed . clone ( ) ,
1198
- holder_channel_pubkeys : self . holder_channel_pubkeys . clone ( ) ,
1199
1201
channel_keys_id : self . channel_keys_id ,
1200
1202
entropy_source : RandomBytes :: new ( self . get_secure_random_bytes ( ) ) ,
1201
1203
}
@@ -1204,21 +1206,11 @@ impl Clone for InMemorySigner {
1204
1206
1205
1207
impl InMemorySigner {
1206
1208
#[ cfg( any( feature = "_test_utils" , test) ) ]
1207
- pub fn new < C : Signing > (
1208
- secp_ctx : & Secp256k1 < C > , funding_key : SecretKey , revocation_base_key : SecretKey ,
1209
- payment_key_v1 : SecretKey , payment_key_v2 : SecretKey , delayed_payment_base_key : SecretKey ,
1210
- htlc_base_key : SecretKey , commitment_seed : [ u8 ; 32 ] , channel_keys_id : [ u8 ; 32 ] ,
1211
- rand_bytes_unique_start : [ u8 ; 32 ] ,
1209
+ pub fn new (
1210
+ funding_key : SecretKey , revocation_base_key : SecretKey , payment_key_v1 : SecretKey ,
1211
+ payment_key_v2 : SecretKey , delayed_payment_base_key : SecretKey , htlc_base_key : SecretKey ,
1212
+ commitment_seed : [ u8 ; 32 ] , channel_keys_id : [ u8 ; 32 ] , rand_bytes_unique_start : [ u8 ; 32 ] ,
1212
1213
) -> InMemorySigner {
1213
- // TODO: Make the key used dynamic
1214
- let holder_channel_pubkeys = InMemorySigner :: make_holder_keys (
1215
- secp_ctx,
1216
- & funding_key,
1217
- & revocation_base_key,
1218
- & payment_key_v1,
1219
- & delayed_payment_base_key,
1220
- & htlc_base_key,
1221
- ) ;
1222
1214
InMemorySigner {
1223
1215
funding_key : sealed:: MaybeTweakedSecretKey :: from ( funding_key) ,
1224
1216
revocation_base_key,
@@ -1227,28 +1219,17 @@ impl InMemorySigner {
1227
1219
delayed_payment_base_key,
1228
1220
htlc_base_key,
1229
1221
commitment_seed,
1230
- holder_channel_pubkeys,
1231
1222
channel_keys_id,
1232
1223
entropy_source : RandomBytes :: new ( rand_bytes_unique_start) ,
1233
1224
}
1234
1225
}
1235
1226
1236
1227
#[ cfg( not( any( feature = "_test_utils" , test) ) ) ]
1237
- fn new < C : Signing > (
1238
- secp_ctx : & Secp256k1 < C > , funding_key : SecretKey , revocation_base_key : SecretKey ,
1239
- payment_key_v1 : SecretKey , payment_key_v2 : SecretKey , delayed_payment_base_key : SecretKey ,
1240
- htlc_base_key : SecretKey , commitment_seed : [ u8 ; 32 ] , channel_keys_id : [ u8 ; 32 ] ,
1241
- rand_bytes_unique_start : [ u8 ; 32 ] ,
1228
+ fn new (
1229
+ funding_key : SecretKey , revocation_base_key : SecretKey , payment_key_v1 : SecretKey ,
1230
+ payment_key_v2 : SecretKey , delayed_payment_base_key : SecretKey , htlc_base_key : SecretKey ,
1231
+ commitment_seed : [ u8 ; 32 ] , channel_keys_id : [ u8 ; 32 ] , rand_bytes_unique_start : [ u8 ; 32 ] ,
1242
1232
) -> InMemorySigner {
1243
- // TODO: Make the key used dynamic
1244
- let holder_channel_pubkeys = InMemorySigner :: make_holder_keys (
1245
- secp_ctx,
1246
- & funding_key,
1247
- & revocation_base_key,
1248
- & payment_key_v1,
1249
- & delayed_payment_base_key,
1250
- & htlc_base_key,
1251
- ) ;
1252
1233
InMemorySigner {
1253
1234
funding_key : sealed:: MaybeTweakedSecretKey :: from ( funding_key) ,
1254
1235
revocation_base_key,
@@ -1257,7 +1238,6 @@ impl InMemorySigner {
1257
1238
delayed_payment_base_key,
1258
1239
htlc_base_key,
1259
1240
commitment_seed,
1260
- holder_channel_pubkeys,
1261
1241
channel_keys_id,
1262
1242
entropy_source : RandomBytes :: new ( rand_bytes_unique_start) ,
1263
1243
}
@@ -1271,22 +1251,6 @@ impl InMemorySigner {
1271
1251
self . funding_key . with_tweak ( tweak)
1272
1252
}
1273
1253
1274
- fn make_holder_keys < C : Signing > (
1275
- secp_ctx : & Secp256k1 < C > , funding_key : & SecretKey , revocation_base_key : & SecretKey ,
1276
- payment_key : & SecretKey , delayed_payment_base_key : & SecretKey , htlc_base_key : & SecretKey ,
1277
- ) -> ChannelPublicKeys {
1278
- let from_secret = |s : & SecretKey | PublicKey :: from_secret_key ( secp_ctx, s) ;
1279
- ChannelPublicKeys {
1280
- funding_pubkey : from_secret ( & funding_key) ,
1281
- revocation_basepoint : RevocationBasepoint :: from ( from_secret ( & revocation_base_key) ) ,
1282
- payment_point : from_secret ( & payment_key) ,
1283
- delayed_payment_basepoint : DelayedPaymentBasepoint :: from ( from_secret (
1284
- & delayed_payment_base_key,
1285
- ) ) ,
1286
- htlc_basepoint : HtlcBasepoint :: from ( from_secret ( & htlc_base_key) ) ,
1287
- }
1288
- }
1289
-
1290
1254
/// Sign the single input of `spend_tx` at index `input_idx`, which spends the output described
1291
1255
/// by `descriptor`, returning the witness stack for the input.
1292
1256
///
@@ -1476,10 +1440,21 @@ impl ChannelSigner for InMemorySigner {
1476
1440
Ok ( ( ) )
1477
1441
}
1478
1442
1479
- fn pubkeys (
1443
+ fn new_pubkeys (
1480
1444
& self , splice_parent_funding_txid : Option < Txid > , secp_ctx : & Secp256k1 < secp256k1:: All > ,
1481
1445
) -> ChannelPublicKeys {
1482
- let mut pubkeys = self . holder_channel_pubkeys . clone ( ) ;
1446
+ let from_secret = |s : & SecretKey | PublicKey :: from_secret_key ( secp_ctx, s) ;
1447
+ let mut pubkeys = ChannelPublicKeys {
1448
+ funding_pubkey : from_secret ( & self . funding_key . 0 ) ,
1449
+ revocation_basepoint : RevocationBasepoint :: from ( from_secret ( & self . revocation_base_key ) ) ,
1450
+ // TODO: Make the payment_key used dynamic
1451
+ payment_point : from_secret ( & self . payment_key_v1 ) ,
1452
+ delayed_payment_basepoint : DelayedPaymentBasepoint :: from ( from_secret (
1453
+ & self . delayed_payment_base_key ,
1454
+ ) ) ,
1455
+ htlc_basepoint : HtlcBasepoint :: from ( from_secret ( & self . htlc_base_key ) ) ,
1456
+ } ;
1457
+
1483
1458
if splice_parent_funding_txid. is_some ( ) {
1484
1459
pubkeys. funding_pubkey =
1485
1460
self . funding_key ( splice_parent_funding_txid) . public_key ( secp_ctx) ;
@@ -2135,7 +2110,6 @@ impl KeysManager {
2135
2110
u64:: from_le_bytes ( commitment_seed[ ..8 ] . try_into ( ) . expect ( "8 bytes" ) ) ;
2136
2111
2137
2112
InMemorySigner :: new (
2138
- & self . secp_ctx ,
2139
2113
funding_key,
2140
2114
revocation_base_key,
2141
2115
payment_key_v1,
0 commit comments