Merge pull request #1166 from TheBlueMatt/2021-11-chan-size-scoring
[rust-lightning] / lightning / src / ln / chan_utils.rs
index e457315544c0c2eef67bfef64f25dfed9e4daeba..9be58a9cc894e2ec04500e6a75518b6ee92dbe1e 100644 (file)
@@ -81,7 +81,7 @@ pub fn build_commitment_secret(commitment_seed: &[u8; 32], idx: u64) -> [u8; 32]
 }
 
 /// Build a closing transaction
-pub fn build_closing_transaction(value_to_holder: u64, value_to_counterparty: u64, holder_shutdown_script: Script, counterparty_shutdown_script: Script, funding_outpoint: OutPoint) -> Transaction {
+pub fn build_closing_transaction(to_holder_value_sat: u64, to_counterparty_value_sat: u64, to_holder_script: Script, to_counterparty_script: Script, funding_outpoint: OutPoint) -> Transaction {
        let txins = {
                let mut ins: Vec<TxIn> = Vec::new();
                ins.push(TxIn {
@@ -95,17 +95,17 @@ pub fn build_closing_transaction(value_to_holder: u64, value_to_counterparty: u6
 
        let mut txouts: Vec<(TxOut, ())> = Vec::new();
 
-       if value_to_counterparty > 0 {
+       if to_counterparty_value_sat > 0 {
                txouts.push((TxOut {
-                       script_pubkey: counterparty_shutdown_script,
-                       value: value_to_counterparty
+                       script_pubkey: to_counterparty_script,
+                       value: to_counterparty_value_sat
                }, ()));
        }
 
-       if value_to_holder > 0 {
+       if to_holder_value_sat > 0 {
                txouts.push((TxOut {
-                       script_pubkey: holder_shutdown_script,
-                       value: value_to_holder
+                       script_pubkey: to_holder_script,
+                       value: to_holder_value_sat
                }, ()));
        }
 
@@ -608,6 +608,17 @@ pub fn build_htlc_transaction(commitment_txid: &Txid, feerate_per_kw: u32, conte
        }
 }
 
+/// Gets the witnessScript for the to_remote output when anchors are enabled.
+#[inline]
+pub(crate) fn get_to_countersignatory_with_anchors_redeemscript(payment_point: &PublicKey) -> Script {
+       Builder::new()
+               .push_slice(&payment_point.serialize()[..])
+               .push_opcode(opcodes::all::OP_CHECKSIGVERIFY)
+               .push_int(1)
+               .push_opcode(opcodes::all::OP_CSV)
+               .into_script()
+}
+
 /// Gets the witnessScript for an anchor output from the funding public key.
 /// The witness in the spending input must be:
 /// <BIP 143 funding_signature>
@@ -1130,7 +1141,11 @@ impl CommitmentTransaction {
                let mut txouts: Vec<(TxOut, Option<&mut HTLCOutputInCommitment>)> = Vec::new();
 
                if to_countersignatory_value_sat > 0 {
-                       let script = script_for_p2wpkh(&countersignatory_pubkeys.payment_point);
+                       let script = if opt_anchors {
+                           get_to_countersignatory_with_anchors_redeemscript(&countersignatory_pubkeys.payment_point).to_v0_p2wsh()
+                       } else {
+                           get_p2wpkh_redeemscript(&countersignatory_pubkeys.payment_point)
+                       };
                        txouts.push((
                                TxOut {
                                        script_pubkey: script.clone(),
@@ -1424,7 +1439,7 @@ pub fn get_commitment_transaction_number_obscure_factor(
                | ((res[31] as u64) << 0 * 8)
 }
 
-fn script_for_p2wpkh(key: &PublicKey) -> Script {
+fn get_p2wpkh_redeemscript(key: &PublicKey) -> Script {
        Builder::new().push_opcode(opcodes::all::OP_PUSHBYTES_0)
                .push_slice(&WPubkeyHash::hash(&key.serialize())[..])
                .into_script()
@@ -1435,7 +1450,7 @@ mod tests {
        use super::CounterpartyCommitmentSecrets;
        use ::{hex, chain};
        use prelude::*;
-       use ln::chan_utils::{CommitmentTransaction, TxCreationKeys, ChannelTransactionParameters, CounterpartyChannelTransactionParameters, HTLCOutputInCommitment};
+       use ln::chan_utils::{get_to_countersignatory_with_anchors_redeemscript, get_p2wpkh_redeemscript, CommitmentTransaction, TxCreationKeys, ChannelTransactionParameters, CounterpartyChannelTransactionParameters, HTLCOutputInCommitment};
        use bitcoin::secp256k1::{PublicKey, SecretKey, Secp256k1};
        use util::test_utils;
        use chain::keysinterface::{KeysInterface, BaseSign};
@@ -1478,6 +1493,7 @@ mod tests {
                        &mut htlcs_with_aux, &channel_parameters.as_holder_broadcastable()
                );
                assert_eq!(tx.built.transaction.output.len(), 2);
+               assert_eq!(tx.built.transaction.output[1].script_pubkey, get_p2wpkh_redeemscript(&counterparty_pubkeys.payment_point));
 
                // Generate broadcaster and counterparty outputs as well as two anchors
                let tx = CommitmentTransaction::new_with_auxiliary_htlc_data(
@@ -1489,6 +1505,7 @@ mod tests {
                        &mut htlcs_with_aux, &channel_parameters.as_holder_broadcastable()
                );
                assert_eq!(tx.built.transaction.output.len(), 4);
+               assert_eq!(tx.built.transaction.output[3].script_pubkey, get_to_countersignatory_with_anchors_redeemscript(&counterparty_pubkeys.payment_point).to_v0_p2wsh());
 
                // Generate broadcaster output and anchor
                let tx = CommitmentTransaction::new_with_auxiliary_htlc_data(