Skip to content

Commit 8dd569b

Browse files
committed
Add InMemorySigner::overwrite_channel_parameters
Builds of `CommitmentTransaction` now query a `ChannelSigner` for the script pubkey to use in the `to_remote` output of the commitment transaction. So we need to overwrite the `ChannelTransactionParameters` of a `ChannelSigner` anytime we want to build a new commitment transaction with a different set of features. This is feature is only used in tests, so we cfg-gate it behind the test flag.
1 parent 480236c commit 8dd569b

File tree

4 files changed

+35
-18
lines changed

4 files changed

+35
-18
lines changed

lightning/src/ln/chan_utils.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1896,7 +1896,7 @@ pub fn get_commitment_transaction_number_obscure_factor(
18961896
mod tests {
18971897
use super::{CounterpartyCommitmentSecrets, ChannelPublicKeys};
18981898
use crate::chain;
1899-
use crate::ln::chan_utils::{get_counterparty_payment_script, get_htlc_redeemscript, get_to_countersignatory_with_anchors_redeemscript, CommitmentTransaction, TxCreationKeys, ChannelTransactionParameters, CounterpartyChannelTransactionParameters, HTLCOutputInCommitment};
1899+
use crate::ln::chan_utils::{get_htlc_redeemscript, get_to_countersignatory_with_anchors_redeemscript, CommitmentTransaction, TxCreationKeys, ChannelTransactionParameters, CounterpartyChannelTransactionParameters, HTLCOutputInCommitment};
19001900
use bitcoin::secp256k1::{PublicKey, SecretKey, Secp256k1};
19011901
use crate::util::test_utils;
19021902
use crate::sign::{ChannelSigner, SignerProvider};
@@ -1906,6 +1906,7 @@ mod tests {
19061906
use crate::types::payment::PaymentHash;
19071907
use bitcoin::PublicKey as BitcoinPublicKey;
19081908
use crate::types::features::ChannelTypeFeatures;
1909+
use crate::util::test_channel_signer::TestChannelSigner;
19091910

19101911
#[allow(unused_imports)]
19111912
use crate::prelude::*;
@@ -1919,6 +1920,7 @@ mod tests {
19191920
htlcs_with_aux: Vec<(HTLCOutputInCommitment, ())>,
19201921
channel_parameters: ChannelTransactionParameters,
19211922
counterparty_pubkeys: ChannelPublicKeys,
1923+
signer: TestChannelSigner,
19221924
}
19231925

19241926
impl TestCommitmentTxBuilder {
@@ -1927,15 +1929,13 @@ mod tests {
19271929
let seed = [42; 32];
19281930
let network = Network::Testnet;
19291931
let keys_provider = test_utils::TestKeysInterface::new(&seed, network);
1930-
let signer = keys_provider.derive_channel_signer(3000, keys_provider.generate_channel_keys_id(false, 1_000_000, 0));
1932+
let mut signer = keys_provider.derive_channel_signer(3000, keys_provider.generate_channel_keys_id(false, 1_000_000, 0));
19311933
let counterparty_signer = keys_provider.derive_channel_signer(3000, keys_provider.generate_channel_keys_id(true, 1_000_000, 1));
1932-
let delayed_payment_base = &signer.pubkeys().delayed_payment_basepoint;
19331934
let per_commitment_secret = SecretKey::from_slice(&<Vec<u8>>::from_hex("1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100").unwrap()[..]).unwrap();
19341935
let per_commitment_point = PublicKey::from_secret_key(&secp_ctx, &per_commitment_secret);
1935-
let htlc_basepoint = &signer.pubkeys().htlc_basepoint;
1936-
let holder_pubkeys = signer.pubkeys();
1936+
let holder_pubkeys = signer.pubkeys().clone();
19371937
let counterparty_pubkeys = counterparty_signer.pubkeys().clone();
1938-
let keys = TxCreationKeys::derive_new(&secp_ctx, &per_commitment_point, delayed_payment_base, htlc_basepoint, &counterparty_pubkeys.revocation_basepoint, &counterparty_pubkeys.htlc_basepoint);
1938+
let keys = TxCreationKeys::from_channel_static_keys(&per_commitment_point, &holder_pubkeys, &counterparty_pubkeys, &secp_ctx);
19391939
let channel_parameters = ChannelTransactionParameters {
19401940
holder_pubkeys: holder_pubkeys.clone(),
19411941
holder_selected_contest_delay: 0,
@@ -1944,6 +1944,7 @@ mod tests {
19441944
funding_outpoint: Some(chain::transaction::OutPoint { txid: Txid::all_zeros(), index: 0 }),
19451945
channel_type_features: ChannelTypeFeatures::only_static_remote_key(),
19461946
};
1947+
signer.provide_channel_parameters(&channel_parameters);
19471948
let htlcs_with_aux = Vec::new();
19481949

19491950
Self {
@@ -1955,12 +1956,12 @@ mod tests {
19551956
htlcs_with_aux,
19561957
channel_parameters,
19571958
counterparty_pubkeys,
1959+
signer,
19581960
}
19591961
}
19601962

19611963
fn build(&mut self, to_broadcaster_sats: u64, to_countersignatory_sats: u64) -> CommitmentTransaction {
1962-
let channel_parameters = self.channel_parameters.as_holder_broadcastable();
1963-
let counterparty_payment_script = get_counterparty_payment_script(&channel_parameters.channel_type_features(), &channel_parameters.countersignatory_pubkeys().payment_point);
1964+
let counterparty_payment_script = self.signer.get_counterparty_payment_script(false);
19641965
let counterparty_txout = TxOut {
19651966
script_pubkey: counterparty_payment_script,
19661967
value: Amount::from_sat(to_countersignatory_sats),
@@ -1972,9 +1973,14 @@ mod tests {
19721973
self.holder_funding_pubkey.clone(),
19731974
self.counterparty_funding_pubkey.clone(),
19741975
self.keys.clone(), self.feerate_per_kw,
1975-
&mut self.htlcs_with_aux, &channel_parameters,
1976+
&mut self.htlcs_with_aux, &self.channel_parameters.as_holder_broadcastable(),
19761977
)
19771978
}
1979+
1980+
fn overwrite_channel_features(&mut self, channel_type_features: ChannelTypeFeatures) {
1981+
self.channel_parameters.channel_type_features = channel_type_features;
1982+
self.signer.overwrite_channel_parameters(&self.channel_parameters);
1983+
}
19781984
}
19791985

19801986
#[test]
@@ -1987,7 +1993,7 @@ mod tests {
19871993
assert_eq!(tx.built.transaction.output[1].script_pubkey, bitcoin::address::Address::p2wpkh(&CompressedPublicKey(builder.counterparty_pubkeys.payment_point), Network::Testnet).script_pubkey());
19881994

19891995
// Generate broadcaster and counterparty outputs as well as two anchors
1990-
builder.channel_parameters.channel_type_features = ChannelTypeFeatures::anchors_zero_htlc_fee_and_dependencies();
1996+
builder.overwrite_channel_features(ChannelTypeFeatures::anchors_zero_htlc_fee_and_dependencies());
19911997
let tx = builder.build(1000, 2000);
19921998
assert_eq!(tx.built.transaction.output.len(), 4);
19931999
assert_eq!(tx.built.transaction.output[3].script_pubkey, get_to_countersignatory_with_anchors_redeemscript(&builder.counterparty_pubkeys.payment_point).to_p2wsh());
@@ -2017,7 +2023,7 @@ mod tests {
20172023
};
20182024

20192025
// Generate broadcaster output and received and offered HTLC outputs, w/o anchors
2020-
builder.channel_parameters.channel_type_features = ChannelTypeFeatures::only_static_remote_key();
2026+
builder.overwrite_channel_features(ChannelTypeFeatures::only_static_remote_key());
20212027
builder.htlcs_with_aux = vec![(received_htlc.clone(), ()), (offered_htlc.clone(), ())];
20222028
let tx = builder.build(3000, 0);
20232029
let keys = &builder.keys.clone();
@@ -2030,7 +2036,7 @@ mod tests {
20302036
"0020215d61bba56b19e9eadb6107f5a85d7f99c40f65992443f69229c290165bc00d");
20312037

20322038
// Generate broadcaster output and received and offered HTLC outputs, with anchors
2033-
builder.channel_parameters.channel_type_features = ChannelTypeFeatures::anchors_zero_htlc_fee_and_dependencies();
2039+
builder.overwrite_channel_features(ChannelTypeFeatures::anchors_zero_htlc_fee_and_dependencies());
20342040
builder.htlcs_with_aux = vec![(received_htlc.clone(), ()), (offered_htlc.clone(), ())];
20352041
let tx = builder.build(3000, 0);
20362042
assert_eq!(tx.built.transaction.output.len(), 5);

lightning/src/ln/channel.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10917,19 +10917,17 @@ mod tests {
1091710917
macro_rules! test_commitment {
1091810918
( $counterparty_sig_hex: expr, $sig_hex: expr, $tx_hex: expr, $($remain:tt)* ) => {
1091910919
chan.context.channel_transaction_parameters.channel_type_features = ChannelTypeFeatures::only_static_remote_key();
10920-
let mut holder_signer = keys_provider.derive_channel_signer(chan.context.channel_value_satoshis, chan.context.channel_keys_id);
10921-
holder_signer.provide_channel_parameters(&chan.context.channel_transaction_parameters);
10922-
chan.context.holder_signer = ChannelSignerType::Ecdsa(holder_signer);
10920+
let mut_signer = chan.context.holder_signer.as_mut_ecdsa().unwrap();
10921+
mut_signer.overwrite_channel_parameters(&chan.context.channel_transaction_parameters);
1092310922
test_commitment_common!($counterparty_sig_hex, $sig_hex, $tx_hex, &ChannelTypeFeatures::only_static_remote_key(), $($remain)*);
1092410923
};
1092510924
}
1092610925

1092710926
macro_rules! test_commitment_with_anchors {
1092810927
( $counterparty_sig_hex: expr, $sig_hex: expr, $tx_hex: expr, $($remain:tt)* ) => {
1092910928
chan.context.channel_transaction_parameters.channel_type_features = ChannelTypeFeatures::anchors_zero_htlc_fee_and_dependencies();
10930-
let mut holder_signer = keys_provider.derive_channel_signer(chan.context.channel_value_satoshis, chan.context.channel_keys_id);
10931-
holder_signer.provide_channel_parameters(&chan.context.channel_transaction_parameters);
10932-
chan.context.holder_signer = ChannelSignerType::Ecdsa(holder_signer);
10929+
let mut_signer = chan.context.holder_signer.as_mut_ecdsa().unwrap();
10930+
mut_signer.overwrite_channel_parameters(&chan.context.channel_transaction_parameters);
1093310931
test_commitment_common!($counterparty_sig_hex, $sig_hex, $tx_hex, &ChannelTypeFeatures::anchors_zero_htlc_fee_and_dependencies(), $($remain)*);
1093410932
};
1093510933
}

lightning/src/sign/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,14 @@ impl InMemorySigner {
13341334
witness_script.as_bytes(),
13351335
]))
13361336
}
1337+
1338+
#[cfg(test)]
1339+
pub(crate) fn overwrite_channel_parameters(
1340+
&mut self, channel_parameters: &ChannelTransactionParameters,
1341+
) {
1342+
assert!(channel_parameters.is_populated(), "Channel parameters must be fully populated");
1343+
self.channel_parameters = Some(channel_parameters.clone());
1344+
}
13371345
}
13381346

13391347
impl EntropySource for InMemorySigner {

lightning/src/util/test_channel_signer.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ impl TestChannelSigner {
162162
fn is_signer_available(&self, signer_op: SignerOp) -> bool {
163163
!self.get_enforcement_state().disabled_signer_ops.contains(&signer_op)
164164
}
165+
166+
#[cfg(test)]
167+
pub(crate) fn overwrite_channel_parameters(&mut self, channel_parameters: &ChannelTransactionParameters) {
168+
self.inner.overwrite_channel_parameters(channel_parameters)
169+
}
165170
}
166171

167172
impl ChannelSigner for TestChannelSigner {

0 commit comments

Comments
 (0)