@@ -40,7 +40,7 @@ use crate::ln::script::{self, ShutdownScript};
4040use crate::ln::channel_state::{ChannelShutdownState, CounterpartyForwardingInfo, InboundHTLCDetails, InboundHTLCStateDetails, OutboundHTLCDetails, OutboundHTLCStateDetails};
4141use crate::ln::channelmanager::{self, OpenChannelMessage, PendingHTLCStatus, HTLCSource, SentHTLCId, HTLCFailureMsg, PendingHTLCInfo, RAACommitmentOrder, PaymentClaimDetails, BREAKDOWN_TIMEOUT, MIN_CLTV_EXPIRY_DELTA, MAX_LOCAL_BREAKDOWN_TIMEOUT};
4242use crate::ln::chan_utils::{
43- CounterpartyCommitmentSecrets, TxCreationKeys, HTLCOutputInCommitment, htlc_success_tx_weight,
43+ CounterpartyCommitmentSecrets, HTLCOutputInCommitment, htlc_success_tx_weight,
4444 htlc_timeout_tx_weight, ChannelPublicKeys, CommitmentTransaction,
4545 HolderCommitmentTransaction, ChannelTransactionParameters,
4646 CounterpartyChannelTransactionParameters, MAX_HTLCS,
@@ -2045,8 +2045,7 @@ trait InitialRemoteCommitmentReceiver<SP: Deref> where SP::Target: SignerProvide
20452045 ) -> Result<CommitmentTransaction, ChannelError> where L::Target: Logger {
20462046 let funding_script = self.funding().get_funding_redeemscript();
20472047
2048- let keys = self.context().build_holder_transaction_keys(&self.funding(), holder_commitment_point.current_point());
2049- let initial_commitment_tx = self.context().build_commitment_transaction(self.funding(), holder_commitment_point.transaction_number(), &keys, true, false, logger).tx;
2048+ let initial_commitment_tx = self.context().build_commitment_transaction(self.funding(), holder_commitment_point.transaction_number(), &holder_commitment_point.current_point(), true, false, logger).tx;
20502049 let trusted_tx = initial_commitment_tx.trust();
20512050 let initial_commitment_bitcoin_tx = trusted_tx.built_transaction();
20522051 let sighash = initial_commitment_bitcoin_tx.get_sighash_all(&funding_script, self.funding().get_value_satoshis());
@@ -2083,8 +2082,7 @@ trait InitialRemoteCommitmentReceiver<SP: Deref> where SP::Target: SignerProvide
20832082 }
20842083 };
20852084 let context = self.context();
2086- let counterparty_keys = context.build_remote_transaction_keys(self.funding());
2087- let counterparty_initial_commitment_tx = context.build_commitment_transaction(self.funding(), context.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, false, logger).tx;
2085+ let counterparty_initial_commitment_tx = context.build_commitment_transaction(self.funding(), context.cur_counterparty_commitment_transaction_number, &context.counterparty_cur_commitment_point.unwrap(), false, false, logger).tx;
20882086 let counterparty_trusted_tx = counterparty_initial_commitment_tx.trust();
20892087 let counterparty_initial_bitcoin_tx = counterparty_trusted_tx.built_transaction();
20902088
@@ -3487,9 +3485,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
34873485 {
34883486 let funding_script = funding.get_funding_redeemscript();
34893487
3490- let keys = self.build_holder_transaction_keys(funding, holder_commitment_point.current_point());
3491-
3492- let commitment_stats = self.build_commitment_transaction(funding, holder_commitment_point.transaction_number(), &keys, true, false, logger);
3488+ let commitment_stats = self.build_commitment_transaction(funding, holder_commitment_point.transaction_number(), &holder_commitment_point.current_point(), true, false, logger);
34933489 let commitment_txid = {
34943490 let trusted_tx = commitment_stats.tx.trust();
34953491 let bitcoin_tx = trusted_tx.built_transaction();
@@ -3557,19 +3553,20 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
35573553
35583554 let mut nondust_htlc_sources = Vec::with_capacity(htlcs_cloned.len());
35593555 let mut htlcs_and_sigs = Vec::with_capacity(htlcs_cloned.len());
3556+ let holder_keys = commitment_stats.tx.trust().keys();
35603557 for (idx, (htlc, mut source_opt)) in htlcs_cloned.drain(..).enumerate() {
35613558 if let Some(_) = htlc.transaction_output_index {
35623559 let htlc_tx = chan_utils::build_htlc_transaction(&commitment_txid, commitment_stats.feerate_per_kw,
35633560 funding.get_counterparty_selected_contest_delay().unwrap(), &htlc, &self.channel_type,
3564- &keys .broadcaster_delayed_payment_key, &keys .revocation_key);
3561+ &holder_keys .broadcaster_delayed_payment_key, &holder_keys .revocation_key);
35653562
3566- let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, &self.channel_type, &keys );
3563+ let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, &self.channel_type, &holder_keys );
35673564 let htlc_sighashtype = if self.channel_type.supports_anchors_zero_fee_htlc_tx() { EcdsaSighashType::SinglePlusAnyoneCanPay } else { EcdsaSighashType::All };
35683565 let htlc_sighash = hash_to_message!(&sighash::SighashCache::new(&htlc_tx).p2wsh_signature_hash(0, &htlc_redeemscript, htlc.to_bitcoin_amount(), htlc_sighashtype).unwrap()[..]);
35693566 log_trace!(logger, "Checking HTLC tx signature {} by key {} against tx {} (sighash {}) with redeemscript {} in channel {}.",
3570- log_bytes!(msg.htlc_signatures[idx].serialize_compact()[..]), log_bytes!(keys .countersignatory_htlc_key.to_public_key().serialize()),
3567+ log_bytes!(msg.htlc_signatures[idx].serialize_compact()[..]), log_bytes!(holder_keys .countersignatory_htlc_key.to_public_key().serialize()),
35713568 encode::serialize_hex(&htlc_tx), log_bytes!(htlc_sighash[..]), encode::serialize_hex(&htlc_redeemscript), &self.channel_id());
3572- if let Err(_) = self.secp_ctx.verify_ecdsa(&htlc_sighash, &msg.htlc_signatures[idx], &keys .countersignatory_htlc_key.to_public_key()) {
3569+ if let Err(_) = self.secp_ctx.verify_ecdsa(&htlc_sighash, &msg.htlc_signatures[idx], &holder_keys .countersignatory_htlc_key.to_public_key()) {
35733570 return Err(ChannelError::close("Invalid HTLC tx signature from peer".to_owned()));
35743571 }
35753572 if !separate_nondust_htlc_sources {
@@ -3618,7 +3615,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
36183615 /// generated by the peer which proposed adding the HTLCs, and thus we need to understand both
36193616 /// which peer generated this transaction and "to whom" this transaction flows.
36203617 #[inline]
3621- fn build_commitment_transaction<L: Deref>(&self, funding: &FundingScope, commitment_number: u64, keys : &TxCreationKeys , local: bool, generated_by_local: bool, logger: &L) -> CommitmentStats
3618+ fn build_commitment_transaction<L: Deref>(&self, funding: &FundingScope, commitment_number: u64, per_commitment_point : &PublicKey , local: bool, generated_by_local: bool, logger: &L) -> CommitmentStats
36223619 where L::Target: Logger
36233620 {
36243621 let mut included_dust_htlcs: Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)> = Vec::new();
@@ -3820,7 +3817,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
38203817 if local { funding.channel_transaction_parameters.as_holder_broadcastable() }
38213818 else { funding.channel_transaction_parameters.as_counterparty_broadcastable() };
38223819 let tx = CommitmentTransaction::new_with_auxiliary_htlc_data(commitment_number,
3823- &keys. per_commitment_point,
3820+ per_commitment_point,
38243821 value_to_a as u64,
38253822 value_to_b as u64,
38263823 feerate_per_kw,
@@ -3846,32 +3843,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
38463843 }
38473844 }
38483845
3849- #[inline]
3850- /// Creates a set of keys for build_commitment_transaction to generate a transaction which our
3851- /// counterparty will sign (ie DO NOT send signatures over a transaction created by this to
3852- /// our counterparty!)
3853- /// The result is a transaction which we can revoke broadcastership of (ie a "local" transaction)
3854- /// TODO Some magic rust shit to compile-time check this?
3855- fn build_holder_transaction_keys(&self, funding: &FundingScope, per_commitment_point: PublicKey) -> TxCreationKeys {
3856- let delayed_payment_base = &funding.get_holder_pubkeys().delayed_payment_basepoint;
3857- let htlc_basepoint = &funding.get_holder_pubkeys().htlc_basepoint;
3858- let counterparty_pubkeys = funding.get_counterparty_pubkeys();
3859-
3860- TxCreationKeys::derive_new(&self.secp_ctx, &per_commitment_point, delayed_payment_base, htlc_basepoint, &counterparty_pubkeys.revocation_basepoint, &counterparty_pubkeys.htlc_basepoint)
3861- }
3862-
3863- #[inline]
3864- /// Creates a set of keys for build_commitment_transaction to generate a transaction which we
3865- /// will sign and send to our counterparty.
3866- /// If an Err is returned, it is a ChannelError::Close (for get_funding_created)
3867- fn build_remote_transaction_keys(&self, funding: &FundingScope) -> TxCreationKeys {
3868- let revocation_basepoint = &funding.get_holder_pubkeys().revocation_basepoint;
3869- let htlc_basepoint = &funding.get_holder_pubkeys().htlc_basepoint;
3870- let counterparty_pubkeys = funding.get_counterparty_pubkeys();
3871-
3872- TxCreationKeys::derive_new(&self.secp_ctx, &self.counterparty_cur_commitment_point.unwrap(), &counterparty_pubkeys.delayed_payment_basepoint, &counterparty_pubkeys.htlc_basepoint, revocation_basepoint, htlc_basepoint)
3873- }
3874-
38753846 pub fn get_feerate_sat_per_1000_weight(&self) -> u32 {
38763847 self.feerate_per_kw
38773848 }
@@ -4654,9 +4625,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
46544625 SP::Target: SignerProvider,
46554626 L::Target: Logger
46564627 {
4657- let counterparty_keys = self.build_remote_transaction_keys(funding);
46584628 let counterparty_initial_commitment_tx = self.build_commitment_transaction(
4659- funding, self.cur_counterparty_commitment_transaction_number, &counterparty_keys , false, false, logger).tx;
4629+ funding, self.cur_counterparty_commitment_transaction_number, &self.counterparty_cur_commitment_point.unwrap() , false, false, logger).tx;
46604630 match self.holder_signer {
46614631 // TODO (taproot|arik): move match into calling method for Taproot
46624632 ChannelSignerType::Ecdsa(ref ecdsa) => {
@@ -6370,8 +6340,7 @@ impl<SP: Deref> FundedChannel<SP> where
63706340 // Before proposing a feerate update, check that we can actually afford the new fee.
63716341 let dust_exposure_limiting_feerate = self.context.get_dust_exposure_limiting_feerate(&fee_estimator);
63726342 let htlc_stats = self.context.get_pending_htlc_stats(Some(feerate_per_kw), dust_exposure_limiting_feerate);
6373- let keys = self.context.build_holder_transaction_keys(&self.funding, self.holder_commitment_point.current_point());
6374- let commitment_stats = self.context.build_commitment_transaction(&self.funding, self.holder_commitment_point.transaction_number(), &keys, true, true, logger);
6343+ let commitment_stats = self.context.build_commitment_transaction(&self.funding, self.holder_commitment_point.transaction_number(), &self.holder_commitment_point.current_point(), true, true, logger);
63756344 let buffer_fee_msat = commit_tx_fee_sat(feerate_per_kw, commitment_stats.num_nondust_htlcs + htlc_stats.on_holder_tx_outbound_holding_cell_htlcs_count as usize + CONCURRENT_INBOUND_HTLC_FEE_BUFFER as usize, self.context.get_channel_type()) * 1000;
63766345 let holder_balance_msat = commitment_stats.local_balance_msat - htlc_stats.outbound_holding_cell_msat;
63776346 if holder_balance_msat < buffer_fee_msat + self.funding.counterparty_selected_channel_reserve_satoshis.unwrap() * 1000 {
@@ -6684,8 +6653,7 @@ impl<SP: Deref> FundedChannel<SP> where
66846653 self.holder_commitment_point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
66856654 }
66866655 let funding_signed = if self.context.signer_pending_funding && !self.funding.is_outbound() {
6687- let counterparty_keys = self.context.build_remote_transaction_keys(&self.funding);
6688- let counterparty_initial_commitment_tx = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number + 1, &counterparty_keys, false, false, logger).tx;
6656+ let counterparty_initial_commitment_tx = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number + 1, &self.context.counterparty_cur_commitment_point.unwrap(), false, false, logger).tx;
66896657 self.context.get_funding_signed_msg(&self.funding.channel_transaction_parameters, logger, counterparty_initial_commitment_tx)
66906658 } else { None };
66916659 // Provide a `channel_ready` message if we need to, but only if we're _not_ still pending
@@ -8756,8 +8724,7 @@ impl<SP: Deref> FundedChannel<SP> where
87568724 -> (Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>, CommitmentTransaction)
87578725 where L::Target: Logger
87588726 {
8759- let counterparty_keys = self.context.build_remote_transaction_keys(&self.funding);
8760- let commitment_stats = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, true, logger);
8727+ let commitment_stats = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number, &self.context.counterparty_cur_commitment_point.unwrap(), false, true, logger);
87618728 let counterparty_commitment_tx = commitment_stats.tx;
87628729
87638730 #[cfg(any(test, fuzzing))]
@@ -8788,8 +8755,7 @@ impl<SP: Deref> FundedChannel<SP> where
87888755 #[cfg(any(test, fuzzing))]
87898756 self.build_commitment_no_state_update(logger);
87908757
8791- let counterparty_keys = self.context.build_remote_transaction_keys(&self.funding);
8792- let commitment_stats = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, true, logger);
8758+ let commitment_stats = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number, &self.context.counterparty_cur_commitment_point.unwrap(), false, true, logger);
87938759 let counterparty_commitment_txid = commitment_stats.tx.trust().txid();
87948760
87958761 match &self.context.holder_signer {
@@ -8817,6 +8783,7 @@ impl<SP: Deref> FundedChannel<SP> where
88178783 &counterparty_commitment_txid, encode::serialize_hex(&self.funding.get_funding_redeemscript()),
88188784 log_bytes!(signature.serialize_compact()[..]), &self.context.channel_id());
88198785
8786+ let counterparty_keys = commitment_stats.tx.trust().keys();
88208787 for (ref htlc_sig, ref htlc) in htlc_signatures.iter().zip(htlcs) {
88218788 log_trace!(logger, "Signed remote HTLC tx {} with redeemscript {} with pubkey {} -> {} in channel {}",
88228789 encode::serialize_hex(&chan_utils::build_htlc_transaction(&counterparty_commitment_txid, commitment_stats.feerate_per_kw, self.funding.get_holder_selected_contest_delay(), htlc, &self.context.channel_type, &counterparty_keys.broadcaster_delayed_payment_key, &counterparty_keys.revocation_key)),
@@ -9273,8 +9240,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
92739240
92749241 /// Only allowed after [`FundingScope::channel_transaction_parameters`] is set.
92759242 fn get_funding_created_msg<L: Deref>(&mut self, logger: &L) -> Option<msgs::FundingCreated> where L::Target: Logger {
9276- let counterparty_keys = self.context.build_remote_transaction_keys(&self.funding);
9277- let counterparty_initial_commitment_tx = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, false, logger).tx;
9243+ let counterparty_initial_commitment_tx = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number, &self.context.counterparty_cur_commitment_point.unwrap(), false, false, logger).tx;
92789244 let signature = match &self.context.holder_signer {
92799245 // TODO (taproot|arik): move match into calling method for Taproot
92809246 ChannelSignerType::Ecdsa(ecdsa) => {
@@ -11820,7 +11786,7 @@ mod tests {
1182011786 use bitcoin::secp256k1::Message;
1182111787 use crate::sign::{ChannelDerivationParameters, HTLCDescriptor, ecdsa::EcdsaChannelSigner};
1182211788 use crate::types::payment::PaymentPreimage;
11823- use crate::ln::channel::{ HTLCOutputInCommitment ,TxCreationKeys} ;
11789+ use crate::ln::channel::HTLCOutputInCommitment;
1182411790 use crate::ln::channel_keys::{DelayedPaymentBasepoint, HtlcBasepoint};
1182511791 use crate::ln::chan_utils::{ChannelPublicKeys, HolderCommitmentTransaction, CounterpartyChannelTransactionParameters};
1182611792 use crate::util::logger::Logger;
@@ -11888,11 +11854,6 @@ mod tests {
1188811854 // build_commitment_transaction.
1188911855 let per_commitment_secret = SecretKey::from_slice(&<Vec<u8>>::from_hex("1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100").unwrap()[..]).unwrap();
1189011856 let per_commitment_point = PublicKey::from_secret_key(&secp_ctx, &per_commitment_secret);
11891- let directed_params = chan.funding.channel_transaction_parameters.as_holder_broadcastable();
11892- let keys = TxCreationKeys::from_channel_static_keys(
11893- &per_commitment_point, directed_params.broadcaster_pubkeys(),
11894- directed_params.countersignatory_pubkeys(), &secp_ctx,
11895- );
1189611857
1189711858 macro_rules! test_commitment {
1189811859 ( $counterparty_sig_hex: expr, $sig_hex: expr, $tx_hex: expr, $($remain:tt)* ) => {
@@ -11913,7 +11874,7 @@ mod tests {
1191311874 $( { $htlc_idx: expr, $counterparty_htlc_sig_hex: expr, $htlc_sig_hex: expr, $htlc_tx_hex: expr } ), *
1191411875 } ) => { {
1191511876 let (commitment_tx, htlcs): (_, Vec<HTLCOutputInCommitment>) = {
11916- let mut commitment_stats = chan.context.build_commitment_transaction(&chan.funding, 0xffffffffffff - 42, &keys , true, false, &logger);
11877+ let mut commitment_stats = chan.context.build_commitment_transaction(&chan.funding, 0xffffffffffff - 42, &per_commitment_point , true, false, &logger);
1191711878
1191811879 let htlcs = commitment_stats.htlcs_included.drain(..)
1191911880 .filter_map(|(htlc, _)| if htlc.transaction_output_index.is_some() { Some(htlc) } else { None })
@@ -11961,6 +11922,7 @@ mod tests {
1196111922 let remote_signature = Signature::from_der(&<Vec<u8>>::from_hex($counterparty_htlc_sig_hex).unwrap()[..]).unwrap();
1196211923
1196311924 let ref htlc = htlcs[$htlc_idx];
11925+ let keys = commitment_tx.trust().keys();
1196411926 let mut htlc_tx = chan_utils::build_htlc_transaction(&unsigned_tx.txid, chan.context.feerate_per_kw,
1196511927 chan.funding.get_counterparty_selected_contest_delay().unwrap(),
1196611928 &htlc, $opt_anchors, &keys.broadcaster_delayed_payment_key, &keys.revocation_key);
0 commit comments