@@ -461,37 +461,11 @@ impl ChannelMonitor {
461
461
Ok ( ( ) )
462
462
}
463
463
464
- /// Tracks the next revocation point which may be required to claim HTLC outputs which we know
465
- /// the preimage of in case the remote end force-closes using their latest state. When called at
466
- /// channel opening revocation point is the CURRENT one used for first commitment tx. Needed in case of sizeable push_msat.
467
- pub ( super ) fn provide_their_next_revocation_point ( & mut self , their_next_revocation_point : Option < ( u64 , PublicKey ) > ) {
468
- if let Some ( new_revocation_point) = their_next_revocation_point {
469
- match self . their_cur_revocation_points {
470
- Some ( old_points) => {
471
- if old_points. 0 == new_revocation_point. 0 + 1 {
472
- self . their_cur_revocation_points = Some ( ( old_points. 0 , old_points. 1 , Some ( new_revocation_point. 1 ) ) ) ;
473
- } else if old_points. 0 == new_revocation_point. 0 + 2 {
474
- if let Some ( old_second_point) = old_points. 2 {
475
- self . their_cur_revocation_points = Some ( ( old_points. 0 - 1 , old_second_point, Some ( new_revocation_point. 1 ) ) ) ;
476
- } else {
477
- self . their_cur_revocation_points = Some ( ( new_revocation_point. 0 , new_revocation_point. 1 , None ) ) ;
478
- }
479
- } else {
480
- self . their_cur_revocation_points = Some ( ( new_revocation_point. 0 , new_revocation_point. 1 , None ) ) ;
481
- }
482
- } ,
483
- None => {
484
- self . their_cur_revocation_points = Some ( ( new_revocation_point. 0 , new_revocation_point. 1 , None ) ) ;
485
- }
486
- }
487
- }
488
- }
489
-
490
464
/// Informs this monitor of the latest remote (ie non-broadcastable) commitment transaction.
491
465
/// The monitor watches for it to be broadcasted and then uses the HTLC information (and
492
466
/// possibly future revocation/preimage information) to claim outputs where possible.
493
467
/// We cache also the mapping hash:commitment number to lighten pruning of old preimages by watchtowers.
494
- pub ( super ) fn provide_latest_remote_commitment_tx_info ( & mut self , unsigned_commitment_tx : & Transaction , htlc_outputs : Vec < HTLCOutputInCommitment > , commitment_number : u64 ) {
468
+ pub ( super ) fn provide_latest_remote_commitment_tx_info ( & mut self , unsigned_commitment_tx : & Transaction , htlc_outputs : Vec < HTLCOutputInCommitment > , commitment_number : u64 , their_revocation_point : PublicKey ) {
495
469
// TODO: Encrypt the htlc_outputs data with the single-hash of the commitment transaction
496
470
// so that a remote monitor doesn't learn anything unless there is a malicious close.
497
471
// (only maybe, sadly we cant do the same for local info, as we need to be aware of
@@ -501,6 +475,25 @@ impl ChannelMonitor {
501
475
}
502
476
self . remote_claimable_outpoints . insert ( unsigned_commitment_tx. txid ( ) , htlc_outputs) ;
503
477
self . current_remote_commitment_number = commitment_number;
478
+ //TODO: Merge this into the other per-remote-transaction output storage stuff
479
+ match self . their_cur_revocation_points {
480
+ Some ( old_points) => {
481
+ if old_points. 0 == commitment_number + 1 {
482
+ self . their_cur_revocation_points = Some ( ( old_points. 0 , old_points. 1 , Some ( their_revocation_point) ) ) ;
483
+ } else if old_points. 0 == commitment_number + 2 {
484
+ if let Some ( old_second_point) = old_points. 2 {
485
+ self . their_cur_revocation_points = Some ( ( old_points. 0 - 1 , old_second_point, Some ( their_revocation_point) ) ) ;
486
+ } else {
487
+ self . their_cur_revocation_points = Some ( ( commitment_number, their_revocation_point, None ) ) ;
488
+ }
489
+ } else {
490
+ self . their_cur_revocation_points = Some ( ( commitment_number, their_revocation_point, None ) ) ;
491
+ }
492
+ } ,
493
+ None => {
494
+ self . their_cur_revocation_points = Some ( ( commitment_number, their_revocation_point, None ) ) ;
495
+ }
496
+ }
504
497
}
505
498
506
499
/// Informs this monitor of the latest local (ie broadcastable) commitment transaction. The
@@ -896,16 +889,18 @@ impl ChannelMonitor {
896
889
if commitment_number >= self . get_min_seen_secret ( ) {
897
890
let secret = self . get_secret ( commitment_number) . unwrap ( ) ;
898
891
let per_commitment_key = ignore_error ! ( SecretKey :: from_slice( & self . secp_ctx, & secret) ) ;
899
- let ( revocation_pubkey, b_htlc_key) = match self . key_storage {
900
- KeyStorage :: PrivMode { ref revocation_base_key, ref htlc_base_key, .. } => {
892
+ let ( revocation_pubkey, b_htlc_key, local_payment_key ) = match self . key_storage {
893
+ KeyStorage :: PrivMode { ref revocation_base_key, ref htlc_base_key, ref payment_base_key , .. } => {
901
894
let per_commitment_point = PublicKey :: from_secret_key ( & self . secp_ctx , & per_commitment_key) ;
902
895
( ignore_error ! ( chan_utils:: derive_public_revocation_key( & self . secp_ctx, & per_commitment_point, & PublicKey :: from_secret_key( & self . secp_ctx, & revocation_base_key) ) ) ,
903
- ignore_error ! ( chan_utils:: derive_public_key( & self . secp_ctx, & per_commitment_point, & PublicKey :: from_secret_key( & self . secp_ctx, & htlc_base_key) ) ) )
896
+ ignore_error ! ( chan_utils:: derive_public_key( & self . secp_ctx, & per_commitment_point, & PublicKey :: from_secret_key( & self . secp_ctx, & htlc_base_key) ) ) ,
897
+ Some ( ignore_error ! ( chan_utils:: derive_private_key( & self . secp_ctx, & per_commitment_point, & payment_base_key) ) ) )
904
898
} ,
905
899
KeyStorage :: SigsMode { ref revocation_base_key, ref htlc_base_key, .. } => {
906
900
let per_commitment_point = PublicKey :: from_secret_key ( & self . secp_ctx , & per_commitment_key) ;
907
901
( ignore_error ! ( chan_utils:: derive_public_revocation_key( & self . secp_ctx, & per_commitment_point, & revocation_base_key) ) ,
908
- ignore_error ! ( chan_utils:: derive_public_key( & self . secp_ctx, & per_commitment_point, & htlc_base_key) ) )
902
+ ignore_error ! ( chan_utils:: derive_public_key( & self . secp_ctx, & per_commitment_point, & htlc_base_key) ) ,
903
+ None )
909
904
} ,
910
905
} ;
911
906
let delayed_key = ignore_error ! ( chan_utils:: derive_public_key( & self . secp_ctx, & PublicKey :: from_secret_key( & self . secp_ctx, & per_commitment_key) , & self . their_delayed_payment_base_key. unwrap( ) ) ) ;
@@ -917,6 +912,13 @@ impl ChannelMonitor {
917
912
let revokeable_redeemscript = chan_utils:: get_revokeable_redeemscript ( & revocation_pubkey, self . our_to_self_delay , & delayed_key) ;
918
913
let revokeable_p2wsh = revokeable_redeemscript. to_v0_p2wsh ( ) ;
919
914
915
+ let local_payment_p2wpkh = if let Some ( payment_key) = local_payment_key {
916
+ // Note that the Network here is ignored as we immediately drop the address for the
917
+ // script_pubkey version.
918
+ let payment_hash160 = Hash160 :: from_data ( & PublicKey :: from_secret_key ( & self . secp_ctx , & payment_key) . serialize ( ) ) ;
919
+ Some ( Builder :: new ( ) . push_opcode ( opcodes:: All :: OP_PUSHBYTES_0 ) . push_slice ( & payment_hash160[ ..] ) . into_script ( ) )
920
+ } else { None } ;
921
+
920
922
let mut total_value = 0 ;
921
923
let mut values = Vec :: new ( ) ;
922
924
let mut inputs = Vec :: new ( ) ;
@@ -936,23 +938,12 @@ impl ChannelMonitor {
936
938
htlc_idxs. push ( None ) ;
937
939
values. push ( outp. value ) ;
938
940
total_value += outp. value ;
939
- } else if outp. script_pubkey . is_v0_p2wpkh ( ) {
940
- match self . key_storage {
941
- KeyStorage :: PrivMode { ref payment_base_key, .. } => {
942
- let per_commitment_point = PublicKey :: from_secret_key ( & self . secp_ctx , & per_commitment_key) ;
943
- if let Ok ( local_key) = chan_utils:: derive_private_key ( & self . secp_ctx , & per_commitment_point, & payment_base_key) {
944
- spendable_outputs. push ( SpendableOutputDescriptor :: DynamicOutputP2WPKH {
945
- outpoint : BitcoinOutPoint { txid : commitment_txid, vout : idx as u32 } ,
946
- key : local_key,
947
- output : outp. clone ( ) ,
948
- } ) ;
949
- }
950
- }
951
- KeyStorage :: SigsMode { .. } => {
952
- //TODO: we need to ensure an offline client will generate the event when it
953
- // cames back online after only the watchtower saw the transaction
954
- }
955
- }
941
+ } else if Some ( & outp. script_pubkey ) == local_payment_p2wpkh. as_ref ( ) {
942
+ spendable_outputs. push ( SpendableOutputDescriptor :: DynamicOutputP2WPKH {
943
+ outpoint : BitcoinOutPoint { txid : commitment_txid, vout : idx as u32 } ,
944
+ key : local_payment_key. unwrap ( ) ,
945
+ output : outp. clone ( ) ,
946
+ } ) ;
956
947
}
957
948
}
958
949
@@ -1090,7 +1081,6 @@ impl ChannelMonitor {
1090
1081
Some ( their_htlc_base_key) => ignore_error ! ( chan_utils:: derive_public_key( & self . secp_ctx, revocation_point, & their_htlc_base_key) ) ,
1091
1082
} ;
1092
1083
1093
-
1094
1084
for ( idx, outp) in tx. output . iter ( ) . enumerate ( ) {
1095
1085
if outp. script_pubkey . is_v0_p2wpkh ( ) {
1096
1086
match self . key_storage {
@@ -1102,11 +1092,8 @@ impl ChannelMonitor {
1102
1092
output : outp. clone ( ) ,
1103
1093
} ) ;
1104
1094
}
1105
- }
1106
- KeyStorage :: SigsMode { .. } => {
1107
- //TODO: we need to ensure an offline client will generate the event when it
1108
- // cames back online after only the watchtower saw the transaction
1109
- }
1095
+ } ,
1096
+ KeyStorage :: SigsMode { .. } => { }
1110
1097
}
1111
1098
break ; // Only to_remote ouput is claimable
1112
1099
}
@@ -2161,10 +2148,10 @@ mod tests {
2161
2148
let logger = Arc :: new ( TestLogger :: new ( ) ) ;
2162
2149
let dummy_sig = Signature :: from_der ( & secp_ctx, & hex:: decode ( "3045022100fa86fa9a36a8cd6a7bb8f06a541787d51371d067951a9461d5404de6b928782e02201c8b7c334c10aed8976a3a465be9a28abff4cb23acbf00022295b378ce1fa3cd" ) . unwrap ( ) [ ..] ) . unwrap ( ) ;
2163
2150
2151
+ let dummy_key = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & secp_ctx, & [ 42 ; 32 ] ) . unwrap ( ) ) ;
2164
2152
macro_rules! dummy_keys {
2165
2153
( ) => {
2166
2154
{
2167
- let dummy_key = PublicKey :: from_secret_key( & secp_ctx, & SecretKey :: from_slice( & secp_ctx, & [ 42 ; 32 ] ) . unwrap( ) ) ;
2168
2155
TxCreationKeys {
2169
2156
per_commitment_point: dummy_key. clone( ) ,
2170
2157
revocation_key: dummy_key. clone( ) ,
@@ -2233,10 +2220,10 @@ mod tests {
2233
2220
monitor. set_their_to_self_delay ( 10 ) ;
2234
2221
2235
2222
monitor. provide_latest_local_commitment_tx_info ( dummy_tx. clone ( ) , dummy_keys ! ( ) , 0 , preimages_to_local_htlcs ! ( preimages[ 0 ..10 ] ) ) ;
2236
- monitor. provide_latest_remote_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 5 ..15 ] ) , 281474976710655 ) ;
2237
- monitor. provide_latest_remote_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 15 ..20 ] ) , 281474976710654 ) ;
2238
- monitor. provide_latest_remote_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 17 ..20 ] ) , 281474976710653 ) ;
2239
- monitor. provide_latest_remote_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 18 ..20 ] ) , 281474976710652 ) ;
2223
+ monitor. provide_latest_remote_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 5 ..15 ] ) , 281474976710655 , dummy_key ) ;
2224
+ monitor. provide_latest_remote_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 15 ..20 ] ) , 281474976710654 , dummy_key ) ;
2225
+ monitor. provide_latest_remote_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 17 ..20 ] ) , 281474976710653 , dummy_key ) ;
2226
+ monitor. provide_latest_remote_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 18 ..20 ] ) , 281474976710652 , dummy_key ) ;
2240
2227
for & ( ref preimage, ref hash) in preimages. iter ( ) {
2241
2228
monitor. provide_payment_preimage ( hash, preimage) ;
2242
2229
}
0 commit comments