@@ -39,7 +39,7 @@ use bitcoin::secp256k1;
39
39
40
40
use ln:: msgs:: DecodeError ;
41
41
use ln:: chan_utils;
42
- use ln:: chan_utils:: { CounterpartyCommitmentSecrets , HTLCOutputInCommitment , HolderCommitmentTransaction , HTLCType , ChannelPublicKeys } ;
42
+ use ln:: chan_utils:: { CounterpartyCommitmentSecrets , HTLCOutputInCommitment , HTLCType , ChannelStaticInfo , HolderCommitmentTransactionInfo } ;
43
43
use ln:: channelmanager:: { HTLCSource , PaymentPreimage , PaymentHash } ;
44
44
use ln:: onchaintx:: { OnchainTxHandler , InputDescriptors } ;
45
45
use chain:: chaininterface:: { BroadcasterInterface , FeeEstimator } ;
@@ -474,7 +474,7 @@ const MIN_SERIALIZATION_VERSION: u8 = 1;
474
474
#[ derive( Clone ) ]
475
475
pub ( crate ) enum ChannelMonitorUpdateStep {
476
476
LatestHolderCommitmentTXInfo {
477
- commitment_tx : HolderCommitmentTransaction ,
477
+ commitment_info : HolderCommitmentTransactionInfo ,
478
478
htlc_outputs : Vec < ( HTLCOutputInCommitment , Option < Signature > , Option < HTLCSource > ) > ,
479
479
} ,
480
480
LatestCounterpartyCommitmentTXInfo {
@@ -502,7 +502,7 @@ pub(crate) enum ChannelMonitorUpdateStep {
502
502
impl Writeable for ChannelMonitorUpdateStep {
503
503
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
504
504
match self {
505
- & ChannelMonitorUpdateStep :: LatestHolderCommitmentTXInfo { ref commitment_tx, ref htlc_outputs } => {
505
+ & ChannelMonitorUpdateStep :: LatestHolderCommitmentTXInfo { commitment_info : ref commitment_tx, ref htlc_outputs } => {
506
506
0u8 . write ( w) ?;
507
507
commitment_tx. write ( w) ?;
508
508
( htlc_outputs. len ( ) as u64 ) . write ( w) ?;
@@ -545,7 +545,7 @@ impl Readable for ChannelMonitorUpdateStep {
545
545
match Readable :: read ( r) ? {
546
546
0u8 => {
547
547
Ok ( ChannelMonitorUpdateStep :: LatestHolderCommitmentTXInfo {
548
- commitment_tx : Readable :: read ( r) ?,
548
+ commitment_info : Readable :: read ( r) ?,
549
549
htlc_outputs : {
550
550
let len: u64 = Readable :: read ( r) ?;
551
551
let mut res = Vec :: new ( ) ;
@@ -934,46 +934,48 @@ impl<ChanSigner: ChannelKeys + Writeable> ChannelMonitor<ChanSigner> {
934
934
935
935
impl < ChanSigner : ChannelKeys > ChannelMonitor < ChanSigner > {
936
936
pub ( crate ) fn new ( keys : ChanSigner , shutdown_pubkey : & PublicKey ,
937
- on_counterparty_tx_csv : u16 , destination_script : & Script , funding_info : ( OutPoint , Script ) ,
938
- counterparty_pubkeys : & ChannelPublicKeys ,
939
- on_holder_tx_csv : u16 , funding_redeemscript : Script , channel_value_satoshis : u64 ,
940
- commitment_transaction_number_obscure_factor : u64 ,
941
- is_outbound : bool ,
942
- initial_holder_commitment_tx : HolderCommitmentTransaction ) -> ChannelMonitor < ChanSigner > {
937
+ on_counterparty_tx_csv : u16 , destination_script : & Script , funding_info : ( OutPoint , Script ) ,
938
+ channel_static_info : & ChannelStaticInfo ,
939
+ funding_redeemscript : Script , channel_value_satoshis : u64 ,
940
+ commitment_transaction_number_obscure_factor : u64 ,
941
+ initial_holder_commitment_info : HolderCommitmentTransactionInfo ) -> ChannelMonitor < ChanSigner > {
943
942
944
943
assert ! ( commitment_transaction_number_obscure_factor <= ( 1 << 48 ) ) ;
945
944
let our_channel_close_key_hash = WPubkeyHash :: hash ( & shutdown_pubkey. serialize ( ) ) ;
946
945
let shutdown_script = Builder :: new ( ) . push_opcode ( opcodes:: all:: OP_PUSHBYTES_0 ) . push_slice ( & our_channel_close_key_hash[ ..] ) . into_script ( ) ;
947
946
let payment_key_hash = WPubkeyHash :: hash ( & keys. pubkeys ( ) . payment_point . serialize ( ) ) ;
948
947
let counterparty_payment_script = Builder :: new ( ) . push_opcode ( opcodes:: all:: OP_PUSHBYTES_0 ) . push_slice ( & payment_key_hash[ ..] ) . into_script ( ) ;
949
948
949
+ let counterparty_pubkeys = & channel_static_info. counterparty_pubkeys ;
950
950
let counterparty_delayed_payment_base_key = counterparty_pubkeys. delayed_payment_basepoint ;
951
951
let counterparty_htlc_base_key = counterparty_pubkeys. htlc_basepoint ;
952
952
let counterparty_tx_cache = CounterpartyCommitmentTransaction { counterparty_delayed_payment_base_key, counterparty_htlc_base_key, on_counterparty_tx_csv, per_htlc : HashMap :: new ( ) } ;
953
953
954
- let mut onchain_tx_handler = OnchainTxHandler :: new ( destination_script. clone ( ) , keys. clone ( ) , on_holder_tx_csv ) ;
954
+ let mut onchain_tx_handler = OnchainTxHandler :: new ( destination_script. clone ( ) , keys. clone ( ) , channel_static_info . clone ( ) ) ;
955
955
956
- let holder_tx_sequence = initial_holder_commitment_tx. unsigned_tx . input [ 0 ] . sequence as u64 ;
957
- let holder_tx_locktime = initial_holder_commitment_tx. unsigned_tx . lock_time as u64 ;
956
+ let current_holder_commitment_number = initial_holder_commitment_info. info . commitment_number ;
957
+ let secp_ctx = Secp256k1 :: new ( ) ;
958
+
959
+ let txid = initial_holder_commitment_info. txid ( channel_static_info, & secp_ctx) ;
958
960
let holder_commitment_tx = HolderSignedTx {
959
- txid : initial_holder_commitment_tx . txid ( ) ,
960
- revocation_key : initial_holder_commitment_tx . keys . revocation_key ,
961
- a_htlc_key : initial_holder_commitment_tx . keys . broadcaster_htlc_key ,
962
- b_htlc_key : initial_holder_commitment_tx . keys . countersignatory_htlc_key ,
963
- delayed_payment_key : initial_holder_commitment_tx . keys . broadcaster_delayed_payment_key ,
964
- per_commitment_point : initial_holder_commitment_tx . keys . per_commitment_point ,
965
- feerate_per_kw : initial_holder_commitment_tx . feerate_per_kw ,
961
+ txid,
962
+ revocation_key : initial_holder_commitment_info . info . keys . revocation_key ,
963
+ a_htlc_key : initial_holder_commitment_info . info . keys . broadcaster_htlc_key ,
964
+ b_htlc_key : initial_holder_commitment_info . info . keys . countersignatory_htlc_key ,
965
+ delayed_payment_key : initial_holder_commitment_info . info . keys . broadcaster_delayed_payment_key ,
966
+ per_commitment_point : initial_holder_commitment_info . info . keys . per_commitment_point ,
967
+ feerate_per_kw : initial_holder_commitment_info . info . feerate_per_kw ,
966
968
htlc_outputs : Vec :: new ( ) , // There are never any HTLCs in the initial commitment transactions
967
969
} ;
968
- onchain_tx_handler. provide_latest_holder_tx ( initial_holder_commitment_tx ) ;
970
+ onchain_tx_handler. provide_latest_holder_tx ( initial_holder_commitment_info ) ;
969
971
970
972
let mut outputs_to_watch = HashMap :: new ( ) ;
971
973
outputs_to_watch. insert ( funding_info. 0 . txid , vec ! [ funding_info. 1 . clone( ) ] ) ;
972
974
973
975
ChannelMonitor {
974
976
latest_update_id : 0 ,
975
977
commitment_transaction_number_obscure_factor,
976
- is_outbound,
978
+ is_outbound : channel_static_info . is_outbound_from_holder ,
977
979
978
980
destination_script : destination_script. clone ( ) ,
979
981
broadcasted_holder_revokable_script : None ,
@@ -990,7 +992,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
990
992
channel_value_satoshis,
991
993
their_cur_revocation_points : None ,
992
994
993
- on_holder_tx_csv,
995
+ on_holder_tx_csv : channel_static_info . counterparty_selected_contest_delay ,
994
996
995
997
commitment_secrets : CounterpartyCommitmentSecrets :: new ( ) ,
996
998
counterparty_claimable_outpoints : HashMap :: new ( ) ,
@@ -1000,7 +1002,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
1000
1002
prev_holder_signed_commitment_tx : None ,
1001
1003
current_holder_commitment_tx : holder_commitment_tx,
1002
1004
current_counterparty_commitment_number : 1 << 48 ,
1003
- current_holder_commitment_number : 0xffff_ffff_ffff - ( ( ( ( holder_tx_sequence & 0xffffff ) << 3 * 8 ) | ( holder_tx_locktime as u64 & 0xffffff ) ) ^ commitment_transaction_number_obscure_factor ) ,
1005
+ current_holder_commitment_number,
1004
1006
1005
1007
payment_preimages : HashMap :: new ( ) ,
1006
1008
pending_monitor_events : Vec :: new ( ) ,
@@ -1015,7 +1017,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
1015
1017
holder_tx_signed : false ,
1016
1018
1017
1019
last_block_hash : Default :: default ( ) ,
1018
- secp_ctx : Secp256k1 :: new ( ) ,
1020
+ secp_ctx : secp_ctx ,
1019
1021
}
1020
1022
}
1021
1023
@@ -1123,22 +1125,20 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
1123
1125
/// is important that any clones of this channel monitor (including remote clones) by kept
1124
1126
/// up-to-date as our holder commitment transaction is updated.
1125
1127
/// Panics if set_on_holder_tx_csv has never been called.
1126
- fn provide_latest_holder_commitment_tx_info ( & mut self , commitment_tx : HolderCommitmentTransaction , htlc_outputs : Vec < ( HTLCOutputInCommitment , Option < Signature > , Option < HTLCSource > ) > ) -> Result < ( ) , MonitorUpdateError > {
1127
- let txid = commitment_tx. txid ( ) ;
1128
- let sequence = commitment_tx. unsigned_tx . input [ 0 ] . sequence as u64 ;
1129
- let locktime = commitment_tx. unsigned_tx . lock_time as u64 ;
1128
+ fn provide_latest_holder_commitment_tx_info ( & mut self , commitment_info : HolderCommitmentTransactionInfo , htlc_outputs : Vec < ( HTLCOutputInCommitment , Option < Signature > , Option < HTLCSource > ) > ) -> Result < ( ) , MonitorUpdateError > {
1129
+ let txid = commitment_info. txid ( & self . onchain_tx_handler . channel_static_info , & self . secp_ctx ) ;
1130
1130
let mut new_holder_commitment_tx = HolderSignedTx {
1131
1131
txid,
1132
- revocation_key : commitment_tx . keys . revocation_key ,
1133
- a_htlc_key : commitment_tx . keys . broadcaster_htlc_key ,
1134
- b_htlc_key : commitment_tx . keys . countersignatory_htlc_key ,
1135
- delayed_payment_key : commitment_tx . keys . broadcaster_delayed_payment_key ,
1136
- per_commitment_point : commitment_tx . keys . per_commitment_point ,
1137
- feerate_per_kw : commitment_tx . feerate_per_kw ,
1132
+ revocation_key : commitment_info . info . keys . revocation_key ,
1133
+ a_htlc_key : commitment_info . info . keys . broadcaster_htlc_key ,
1134
+ b_htlc_key : commitment_info . info . keys . countersignatory_htlc_key ,
1135
+ delayed_payment_key : commitment_info . info . keys . broadcaster_delayed_payment_key ,
1136
+ per_commitment_point : commitment_info . info . keys . per_commitment_point ,
1137
+ feerate_per_kw : commitment_info . info . feerate_per_kw ,
1138
1138
htlc_outputs,
1139
1139
} ;
1140
- self . onchain_tx_handler . provide_latest_holder_tx ( commitment_tx ) ;
1141
- self . current_holder_commitment_number = 0xffff_ffff_ffff - ( ( ( ( sequence & 0xffffff ) << 3 * 8 ) | ( locktime as u64 & 0xffffff ) ) ^ self . commitment_transaction_number_obscure_factor ) ;
1140
+ self . current_holder_commitment_number = commitment_info . info . commitment_number ;
1141
+ self . onchain_tx_handler . provide_latest_holder_tx ( commitment_info ) ;
1142
1142
mem:: swap ( & mut new_holder_commitment_tx, & mut self . current_holder_commitment_tx ) ;
1143
1143
self . prev_holder_signed_commitment_tx = Some ( new_holder_commitment_tx) ;
1144
1144
if self . holder_tx_signed {
@@ -1176,7 +1176,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
1176
1176
}
1177
1177
for update in updates. updates . drain ( ..) {
1178
1178
match update {
1179
- ChannelMonitorUpdateStep :: LatestHolderCommitmentTXInfo { commitment_tx, htlc_outputs } => {
1179
+ ChannelMonitorUpdateStep :: LatestHolderCommitmentTXInfo { commitment_info : commitment_tx, htlc_outputs } => {
1180
1180
if self . lockdown_from_offchain { panic ! ( ) ; }
1181
1181
self . provide_latest_holder_commitment_tx_info ( commitment_tx, htlc_outputs) ?
1182
1182
} ,
@@ -2407,7 +2407,7 @@ mod tests {
2407
2407
use ln:: channelmanager:: { PaymentPreimage , PaymentHash } ;
2408
2408
use ln:: onchaintx:: { OnchainTxHandler , InputDescriptors } ;
2409
2409
use ln:: chan_utils;
2410
- use ln:: chan_utils:: { HTLCOutputInCommitment , HolderCommitmentTransaction , ChannelPublicKeys } ;
2410
+ use ln:: chan_utils:: { HTLCOutputInCommitment , ChannelPublicKeys , ChannelStaticInfo , HolderCommitmentTransactionInfo } ;
2411
2411
use util:: test_utils:: TestLogger ;
2412
2412
use bitcoin:: secp256k1:: key:: { SecretKey , PublicKey } ;
2413
2413
use bitcoin:: secp256k1:: Secp256k1 ;
@@ -2485,16 +2485,24 @@ mod tests {
2485
2485
delayed_payment_basepoint : PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 47 ; 32 ] ) . unwrap ( ) ) ,
2486
2486
htlc_basepoint : PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 48 ; 32 ] ) . unwrap ( ) )
2487
2487
} ;
2488
+ let channel_static_info = ChannelStaticInfo {
2489
+ holder_pubkeys : keys. holder_channel_pubkeys . clone ( ) ,
2490
+ counterparty_pubkeys,
2491
+ holder_selected_contest_delay : 66 ,
2492
+ counterparty_selected_contest_delay : 67 ,
2493
+ funding_outpoint : Default :: default ( ) ,
2494
+ is_outbound_from_holder : true
2495
+ } ;
2488
2496
// Prune with one old state and a holder commitment tx holding a few overlaps with the
2489
2497
// old state.
2490
2498
let mut monitor = ChannelMonitor :: new ( keys,
2491
2499
& PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) , 0 , & Script :: new ( ) ,
2492
2500
( OutPoint { txid : Txid :: from_slice ( & [ 43 ; 32 ] ) . unwrap ( ) , index : 0 } , Script :: new ( ) ) ,
2493
- & counterparty_pubkeys ,
2494
- 10 , Script :: new ( ) , 46 , 0 ,
2495
- true , HolderCommitmentTransaction :: dummy ( ) ) ;
2501
+ & channel_static_info ,
2502
+ Script :: new ( ) , 46 , 0 ,
2503
+ HolderCommitmentTransactionInfo :: dummy ( ) ) ;
2496
2504
2497
- monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransaction :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..10 ] ) ) . unwrap ( ) ;
2505
+ monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransactionInfo :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..10 ] ) ) . unwrap ( ) ;
2498
2506
monitor. provide_latest_counterparty_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 5 ..15 ] ) , 281474976710655 , dummy_key, & logger) ;
2499
2507
monitor. provide_latest_counterparty_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 15 ..20 ] ) , 281474976710654 , dummy_key, & logger) ;
2500
2508
monitor. provide_latest_counterparty_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 17 ..20 ] ) , 281474976710653 , dummy_key, & logger) ;
@@ -2520,15 +2528,15 @@ mod tests {
2520
2528
2521
2529
// Now update holder commitment tx info, pruning only element 18 as we still care about the
2522
2530
// previous commitment tx's preimages too
2523
- monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransaction :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..5 ] ) ) . unwrap ( ) ;
2531
+ monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransactionInfo :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..5 ] ) ) . unwrap ( ) ;
2524
2532
secret[ 0 ..32 ] . clone_from_slice ( & hex:: decode ( "2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8" ) . unwrap ( ) ) ;
2525
2533
monitor. provide_secret ( 281474976710653 , secret. clone ( ) ) . unwrap ( ) ;
2526
2534
assert_eq ! ( monitor. payment_preimages. len( ) , 12 ) ;
2527
2535
test_preimages_exist ! ( & preimages[ 0 ..10 ] , monitor) ;
2528
2536
test_preimages_exist ! ( & preimages[ 18 ..20 ] , monitor) ;
2529
2537
2530
2538
// But if we do it again, we'll prune 5-10
2531
- monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransaction :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..3 ] ) ) . unwrap ( ) ;
2539
+ monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransactionInfo :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..3 ] ) ) . unwrap ( ) ;
2532
2540
secret[ 0 ..32 ] . clone_from_slice ( & hex:: decode ( "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116" ) . unwrap ( ) ) ;
2533
2541
monitor. provide_secret ( 281474976710652 , secret. clone ( ) ) . unwrap ( ) ;
2534
2542
assert_eq ! ( monitor. payment_preimages. len( ) , 5 ) ;
0 commit comments