@@ -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 , ChannelPublicKeys , 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 ( ) ;
@@ -936,46 +936,48 @@ impl<ChanSigner: ChannelKeys + Writeable> ChannelMonitor<ChanSigner> {
936
936
937
937
impl < ChanSigner : ChannelKeys > ChannelMonitor < ChanSigner > {
938
938
pub ( crate ) fn new ( keys : ChanSigner , shutdown_pubkey : & PublicKey ,
939
- on_counterparty_tx_csv : u16 , destination_script : & Script , funding_info : ( OutPoint , Script ) ,
940
- counterparty_pubkeys : & ChannelPublicKeys ,
941
- on_holder_tx_csv : u16 , funding_redeemscript : Script , channel_value_satoshis : u64 ,
942
- commitment_transaction_number_obscure_factor : u64 ,
943
- is_outbound : bool ,
944
- initial_holder_commitment_tx : HolderCommitmentTransaction ) -> ChannelMonitor < ChanSigner > {
939
+ on_counterparty_tx_csv : u16 , destination_script : & Script , funding_info : ( OutPoint , Script ) ,
940
+ channel_static_info : & ChannelStaticInfo ,
941
+ funding_redeemscript : Script , channel_value_satoshis : u64 ,
942
+ commitment_transaction_number_obscure_factor : u64 ,
943
+ initial_holder_commitment_info : HolderCommitmentTransactionInfo ) -> ChannelMonitor < ChanSigner > {
945
944
946
945
assert ! ( commitment_transaction_number_obscure_factor <= ( 1 << 48 ) ) ;
947
946
let our_channel_close_key_hash = WPubkeyHash :: hash ( & shutdown_pubkey. serialize ( ) ) ;
948
947
let shutdown_script = Builder :: new ( ) . push_opcode ( opcodes:: all:: OP_PUSHBYTES_0 ) . push_slice ( & our_channel_close_key_hash[ ..] ) . into_script ( ) ;
949
948
let payment_key_hash = WPubkeyHash :: hash ( & keys. pubkeys ( ) . payment_point . serialize ( ) ) ;
950
949
let counterparty_payment_script = Builder :: new ( ) . push_opcode ( opcodes:: all:: OP_PUSHBYTES_0 ) . push_slice ( & payment_key_hash[ ..] ) . into_script ( ) ;
951
950
951
+ let counterparty_pubkeys = & channel_static_info. counterparty_pubkeys ;
952
952
let counterparty_delayed_payment_base_key = counterparty_pubkeys. delayed_payment_basepoint ;
953
953
let counterparty_htlc_base_key = counterparty_pubkeys. htlc_basepoint ;
954
954
let counterparty_tx_cache = CounterpartyCommitmentTransaction { counterparty_delayed_payment_base_key, counterparty_htlc_base_key, on_counterparty_tx_csv, per_htlc : HashMap :: new ( ) } ;
955
955
956
- let mut onchain_tx_handler = OnchainTxHandler :: new ( destination_script. clone ( ) , keys. clone ( ) , on_holder_tx_csv ) ;
956
+ let mut onchain_tx_handler = OnchainTxHandler :: new ( destination_script. clone ( ) , keys. clone ( ) , channel_static_info . clone ( ) ) ;
957
957
958
- let holder_tx_sequence = initial_holder_commitment_tx. unsigned_tx . input [ 0 ] . sequence as u64 ;
959
- let holder_tx_locktime = initial_holder_commitment_tx. unsigned_tx . lock_time as u64 ;
958
+ let current_holder_commitment_number = initial_holder_commitment_info. info . commitment_number ;
959
+ let secp_ctx = Secp256k1 :: new ( ) ;
960
+
961
+ let txid = initial_holder_commitment_info. txid ( channel_static_info, & secp_ctx) ;
960
962
let holder_commitment_tx = HolderSignedTx {
961
- txid : initial_holder_commitment_tx . txid ( ) ,
962
- revocation_key : initial_holder_commitment_tx . keys . revocation_key ,
963
- a_htlc_key : initial_holder_commitment_tx . keys . broadcaster_htlc_key ,
964
- b_htlc_key : initial_holder_commitment_tx . keys . countersignatory_htlc_key ,
965
- delayed_payment_key : initial_holder_commitment_tx . keys . broadcaster_delayed_payment_key ,
966
- per_commitment_point : initial_holder_commitment_tx . keys . per_commitment_point ,
967
- feerate_per_kw : initial_holder_commitment_tx . feerate_per_kw ,
963
+ txid,
964
+ revocation_key : initial_holder_commitment_info . info . keys . revocation_key ,
965
+ a_htlc_key : initial_holder_commitment_info . info . keys . broadcaster_htlc_key ,
966
+ b_htlc_key : initial_holder_commitment_info . info . keys . countersignatory_htlc_key ,
967
+ delayed_payment_key : initial_holder_commitment_info . info . keys . broadcaster_delayed_payment_key ,
968
+ per_commitment_point : initial_holder_commitment_info . info . keys . per_commitment_point ,
969
+ feerate_per_kw : initial_holder_commitment_info . info . feerate_per_kw ,
968
970
htlc_outputs : Vec :: new ( ) , // There are never any HTLCs in the initial commitment transactions
969
971
} ;
970
- onchain_tx_handler. provide_latest_holder_tx ( initial_holder_commitment_tx ) ;
972
+ onchain_tx_handler. provide_latest_holder_tx ( initial_holder_commitment_info ) ;
971
973
972
974
let mut outputs_to_watch = HashMap :: new ( ) ;
973
975
outputs_to_watch. insert ( funding_info. 0 . txid , vec ! [ funding_info. 1 . clone( ) ] ) ;
974
976
975
977
ChannelMonitor {
976
978
latest_update_id : 0 ,
977
979
commitment_transaction_number_obscure_factor,
978
- is_outbound,
980
+ is_outbound : channel_static_info . is_outbound_from_holder ,
979
981
980
982
destination_script : destination_script. clone ( ) ,
981
983
broadcasted_holder_revokable_script : None ,
@@ -993,7 +995,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
993
995
channel_value_satoshis,
994
996
their_cur_revocation_points : None ,
995
997
996
- on_holder_tx_csv,
998
+ on_holder_tx_csv : channel_static_info . counterparty_selected_contest_delay ,
997
999
998
1000
commitment_secrets : CounterpartyCommitmentSecrets :: new ( ) ,
999
1001
counterparty_claimable_outpoints : HashMap :: new ( ) ,
@@ -1003,7 +1005,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
1003
1005
prev_holder_signed_commitment_tx : None ,
1004
1006
current_holder_commitment_tx : holder_commitment_tx,
1005
1007
current_counterparty_commitment_number : 1 << 48 ,
1006
- current_holder_commitment_number : 0xffff_ffff_ffff - ( ( ( ( holder_tx_sequence & 0xffffff ) << 3 * 8 ) | ( holder_tx_locktime as u64 & 0xffffff ) ) ^ commitment_transaction_number_obscure_factor ) ,
1008
+ current_holder_commitment_number,
1007
1009
1008
1010
payment_preimages : HashMap :: new ( ) ,
1009
1011
pending_monitor_events : Vec :: new ( ) ,
@@ -1018,7 +1020,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
1018
1020
holder_tx_signed : false ,
1019
1021
1020
1022
last_block_hash : Default :: default ( ) ,
1021
- secp_ctx : Secp256k1 :: new ( ) ,
1023
+ secp_ctx : secp_ctx ,
1022
1024
}
1023
1025
}
1024
1026
@@ -1126,22 +1128,20 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
1126
1128
/// is important that any clones of this channel monitor (including remote clones) by kept
1127
1129
/// up-to-date as our holder commitment transaction is updated.
1128
1130
/// Panics if set_on_holder_tx_csv has never been called.
1129
- fn provide_latest_holder_commitment_tx_info ( & mut self , commitment_tx : HolderCommitmentTransaction , htlc_outputs : Vec < ( HTLCOutputInCommitment , Option < Signature > , Option < HTLCSource > ) > ) -> Result < ( ) , MonitorUpdateError > {
1130
- let txid = commitment_tx. txid ( ) ;
1131
- let sequence = commitment_tx. unsigned_tx . input [ 0 ] . sequence as u64 ;
1132
- let locktime = commitment_tx. unsigned_tx . lock_time as u64 ;
1131
+ fn provide_latest_holder_commitment_tx_info ( & mut self , commitment_info : HolderCommitmentTransactionInfo , htlc_outputs : Vec < ( HTLCOutputInCommitment , Option < Signature > , Option < HTLCSource > ) > ) -> Result < ( ) , MonitorUpdateError > {
1132
+ let txid = commitment_info. txid ( & self . onchain_tx_handler . channel_static_info , & self . secp_ctx ) ;
1133
1133
let mut new_holder_commitment_tx = HolderSignedTx {
1134
1134
txid,
1135
- revocation_key : commitment_tx . keys . revocation_key ,
1136
- a_htlc_key : commitment_tx . keys . broadcaster_htlc_key ,
1137
- b_htlc_key : commitment_tx . keys . countersignatory_htlc_key ,
1138
- delayed_payment_key : commitment_tx . keys . broadcaster_delayed_payment_key ,
1139
- per_commitment_point : commitment_tx . keys . per_commitment_point ,
1140
- feerate_per_kw : commitment_tx . feerate_per_kw ,
1135
+ revocation_key : commitment_info . info . keys . revocation_key ,
1136
+ a_htlc_key : commitment_info . info . keys . broadcaster_htlc_key ,
1137
+ b_htlc_key : commitment_info . info . keys . countersignatory_htlc_key ,
1138
+ delayed_payment_key : commitment_info . info . keys . broadcaster_delayed_payment_key ,
1139
+ per_commitment_point : commitment_info . info . keys . per_commitment_point ,
1140
+ feerate_per_kw : commitment_info . info . feerate_per_kw ,
1141
1141
htlc_outputs,
1142
1142
} ;
1143
- self . onchain_tx_handler . provide_latest_holder_tx ( commitment_tx ) ;
1144
- self . current_holder_commitment_number = 0xffff_ffff_ffff - ( ( ( ( sequence & 0xffffff ) << 3 * 8 ) | ( locktime as u64 & 0xffffff ) ) ^ self . commitment_transaction_number_obscure_factor ) ;
1143
+ self . current_holder_commitment_number = commitment_info . info . commitment_number ;
1144
+ self . onchain_tx_handler . provide_latest_holder_tx ( commitment_info ) ;
1145
1145
mem:: swap ( & mut new_holder_commitment_tx, & mut self . current_holder_commitment_tx ) ;
1146
1146
self . prev_holder_signed_commitment_tx = Some ( new_holder_commitment_tx) ;
1147
1147
if self . holder_tx_signed {
@@ -1179,7 +1179,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
1179
1179
}
1180
1180
for update in updates. updates . drain ( ..) {
1181
1181
match update {
1182
- ChannelMonitorUpdateStep :: LatestHolderCommitmentTXInfo { commitment_tx, htlc_outputs } => {
1182
+ ChannelMonitorUpdateStep :: LatestHolderCommitmentTXInfo { commitment_info : commitment_tx, htlc_outputs } => {
1183
1183
if self . lockdown_from_offchain { panic ! ( ) ; }
1184
1184
self . provide_latest_holder_commitment_tx_info ( commitment_tx, htlc_outputs) ?
1185
1185
} ,
@@ -2412,7 +2412,7 @@ mod tests {
2412
2412
use ln:: channelmanager:: { PaymentPreimage , PaymentHash } ;
2413
2413
use ln:: onchaintx:: { OnchainTxHandler , InputDescriptors } ;
2414
2414
use ln:: chan_utils;
2415
- use ln:: chan_utils:: { HTLCOutputInCommitment , HolderCommitmentTransaction , ChannelPublicKeys } ;
2415
+ use ln:: chan_utils:: { HTLCOutputInCommitment , ChannelPublicKeys , ChannelStaticInfo , HolderCommitmentTransactionInfo } ;
2416
2416
use util:: test_utils:: TestLogger ;
2417
2417
use bitcoin:: secp256k1:: key:: { SecretKey , PublicKey } ;
2418
2418
use bitcoin:: secp256k1:: Secp256k1 ;
@@ -2490,16 +2490,24 @@ mod tests {
2490
2490
delayed_payment_basepoint : PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 47 ; 32 ] ) . unwrap ( ) ) ,
2491
2491
htlc_basepoint : PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 48 ; 32 ] ) . unwrap ( ) )
2492
2492
} ;
2493
+ let channel_static_info = ChannelStaticInfo {
2494
+ holder_pubkeys : keys. holder_channel_pubkeys . clone ( ) ,
2495
+ counterparty_pubkeys,
2496
+ holder_selected_contest_delay : 66 ,
2497
+ counterparty_selected_contest_delay : 67 ,
2498
+ funding_outpoint : Default :: default ( ) ,
2499
+ is_outbound_from_holder : true
2500
+ } ;
2493
2501
// Prune with one old state and a holder commitment tx holding a few overlaps with the
2494
2502
// old state.
2495
2503
let mut monitor = ChannelMonitor :: new ( keys,
2496
2504
& PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) , 0 , & Script :: new ( ) ,
2497
2505
( OutPoint { txid : Txid :: from_slice ( & [ 43 ; 32 ] ) . unwrap ( ) , index : 0 } , Script :: new ( ) ) ,
2498
- & counterparty_pubkeys ,
2499
- 10 , Script :: new ( ) , 46 , 0 ,
2500
- true , HolderCommitmentTransaction :: dummy ( ) ) ;
2506
+ & channel_static_info ,
2507
+ Script :: new ( ) , 46 , 0 ,
2508
+ HolderCommitmentTransactionInfo :: dummy ( ) ) ;
2501
2509
2502
- monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransaction :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..10 ] ) ) . unwrap ( ) ;
2510
+ monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransactionInfo :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..10 ] ) ) . unwrap ( ) ;
2503
2511
monitor. provide_latest_counterparty_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 5 ..15 ] ) , 281474976710655 , dummy_key, & logger) ;
2504
2512
monitor. provide_latest_counterparty_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 15 ..20 ] ) , 281474976710654 , dummy_key, & logger) ;
2505
2513
monitor. provide_latest_counterparty_commitment_tx_info ( & dummy_tx, preimages_slice_to_htlc_outputs ! ( preimages[ 17 ..20 ] ) , 281474976710653 , dummy_key, & logger) ;
@@ -2525,15 +2533,15 @@ mod tests {
2525
2533
2526
2534
// Now update holder commitment tx info, pruning only element 18 as we still care about the
2527
2535
// previous commitment tx's preimages too
2528
- monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransaction :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..5 ] ) ) . unwrap ( ) ;
2536
+ monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransactionInfo :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..5 ] ) ) . unwrap ( ) ;
2529
2537
secret[ 0 ..32 ] . clone_from_slice ( & hex:: decode ( "2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8" ) . unwrap ( ) ) ;
2530
2538
monitor. provide_secret ( 281474976710653 , secret. clone ( ) ) . unwrap ( ) ;
2531
2539
assert_eq ! ( monitor. payment_preimages. len( ) , 12 ) ;
2532
2540
test_preimages_exist ! ( & preimages[ 0 ..10 ] , monitor) ;
2533
2541
test_preimages_exist ! ( & preimages[ 18 ..20 ] , monitor) ;
2534
2542
2535
2543
// But if we do it again, we'll prune 5-10
2536
- monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransaction :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..3 ] ) ) . unwrap ( ) ;
2544
+ monitor. provide_latest_holder_commitment_tx_info ( HolderCommitmentTransactionInfo :: dummy ( ) , preimages_to_holder_htlcs ! ( preimages[ 0 ..3 ] ) ) . unwrap ( ) ;
2537
2545
secret[ 0 ..32 ] . clone_from_slice ( & hex:: decode ( "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116" ) . unwrap ( ) ) ;
2538
2546
monitor. provide_secret ( 281474976710652 , secret. clone ( ) ) . unwrap ( ) ;
2539
2547
assert_eq ! ( monitor. payment_preimages. len( ) , 5 ) ;
0 commit comments