Include next-hop counterparty node id in log metadata when sending
[rust-lightning] / lightning / src / sign / mod.rs
index 9de3ed8dc534ff9d08721d5640ddbb7fa717541a..5a80cb2318adb22c3e297a9c27238c8041eaf72a 100644 (file)
@@ -57,7 +57,7 @@ use core::convert::TryInto;
 use core::ops::Deref;
 use core::sync::atomic::{AtomicUsize, Ordering};
 #[cfg(taproot)]
-use musig2::types::{PartialSignature, PublicNonce, SecretNonce};
+use musig2::types::{PartialSignature, PublicNonce};
 use crate::io::{self, Error};
 use crate::ln::features::ChannelTypeFeatures;
 use crate::ln::msgs::{DecodeError, MAX_VALUE_MSAT};
@@ -215,6 +215,15 @@ pub enum SpendableOutputDescriptor {
                outpoint: OutPoint,
                /// The output which is referenced by the given outpoint.
                output: TxOut,
+               /// The `channel_keys_id` for the channel which this output came from.
+               ///
+               /// For channels which were generated on LDK 0.0.119 or later, this is the value which was
+               /// passed to the [`SignerProvider::get_destination_script`] call which provided this
+               /// output script.
+               ///
+               /// For channels which were generated prior to LDK 0.0.119, no such argument existed,
+               /// however this field may still be filled in if such data is available.
+               channel_keys_id: Option<[u8; 32]>
        },
        /// An output to a P2WSH script which can be spent with a single signature after an `OP_CSV`
        /// delay.
@@ -278,6 +287,7 @@ pub enum SpendableOutputDescriptor {
 impl_writeable_tlv_based_enum!(SpendableOutputDescriptor,
        (0, StaticOutput) => {
                (0, outpoint, required),
+               (1, channel_keys_id, option),
                (2, output, required),
        },
 ;
@@ -378,7 +388,7 @@ impl SpendableOutputDescriptor {
                                        { witness_weight -= 1; } // Guarantees a low R signature
                                        input_value += descriptor.output.value;
                                },
-                               SpendableOutputDescriptor::StaticOutput { ref outpoint, ref output } => {
+                               SpendableOutputDescriptor::StaticOutput { ref outpoint, ref output, .. } => {
                                        if !output_set.insert(*outpoint) { return Err(()); }
                                        input.push(TxIn {
                                                previous_output: outpoint.into_bitcoin_outpoint(),
@@ -593,6 +603,12 @@ pub trait ChannelSigner {
        fn validate_holder_commitment(&self, holder_tx: &HolderCommitmentTransaction,
                preimages: Vec<PaymentPreimage>) -> Result<(), ()>;
 
+       /// Validate the counterparty's revocation.
+       ///
+       /// This is required in order for the signer to make sure that the state has moved
+       /// forward and it is safe to sign the next counterparty commitment.
+       fn validate_counterparty_revocation(&self, idx: u64, secret: &SecretKey) -> Result<(), ()>;
+
        /// Returns the holder's channel public keys and basepoints.
        fn pubkeys(&self) -> &ChannelPublicKeys;
 
@@ -1074,6 +1090,10 @@ impl ChannelSigner for InMemorySigner {
                Ok(())
        }
 
+       fn validate_counterparty_revocation(&self, _idx: u64, _secret: &SecretKey) -> Result<(), ()> {
+               Ok(())
+       }
+
        fn pubkeys(&self) -> &ChannelPublicKeys { &self.holder_channel_pubkeys }
 
        fn channel_keys_id(&self) -> [u8; 32] { self.channel_keys_id }
@@ -1121,10 +1141,6 @@ impl EcdsaChannelSigner for InMemorySigner {
                Ok((commitment_sig, htlc_sigs))
        }
 
-       fn validate_counterparty_revocation(&self, _idx: u64, _secret: &SecretKey) -> Result<(), ()> {
-               Ok(())
-       }
-
        fn sign_holder_commitment(&self, commitment_tx: &HolderCommitmentTransaction, secp_ctx: &Secp256k1<secp256k1::All>) -> Result<Signature, ()> {
                let funding_pubkey = PublicKey::from_secret_key(secp_ctx, &self.funding_key);
                let counterparty_keys = self.counterparty_pubkeys().expect(MISSING_PARAMS_ERR);
@@ -1248,7 +1264,7 @@ impl TaprootChannelSigner for InMemorySigner {
                todo!()
        }
 
-       fn finalize_holder_commitment(&self, commitment_number: u64, commitment_tx: &HolderCommitmentTransaction, counterparty_partial_signature: PartialSignatureWithNonce, secp_ctx: &Secp256k1<All>) -> Result<PartialSignature, ()> {
+       fn finalize_holder_commitment(&self, commitment_tx: &HolderCommitmentTransaction, counterparty_partial_signature: PartialSignatureWithNonce, secp_ctx: &Secp256k1<All>) -> Result<PartialSignature, ()> {
                todo!()
        }
 
@@ -1540,7 +1556,7 @@ impl KeysManager {
                                        let witness = keys_cache.as_ref().unwrap().0.sign_dynamic_p2wsh_input(&psbt.unsigned_tx, input_idx, &descriptor, &secp_ctx)?;
                                        psbt.inputs[input_idx].final_script_witness = Some(witness);
                                },
-                               SpendableOutputDescriptor::StaticOutput { ref outpoint, ref output } => {
+                               SpendableOutputDescriptor::StaticOutput { ref outpoint, ref output, .. } => {
                                        let input_idx = psbt.unsigned_tx.input.iter().position(|i| i.previous_output == outpoint.into_bitcoin_outpoint()).ok_or(())?;
                                        let derivation_idx = if output.script_pubkey == self.destination_script {
                                                1