From f22b011f934b427a2ffca75fd69f1a86e0458e5a Mon Sep 17 00:00:00 2001 From: optout <13562139+optout21@users.noreply.github.com> Date: Tue, 15 Oct 2024 23:12:43 +0200 Subject: [PATCH] Signer extended with method to sign prev funding transaction input --- lightning/src/sign/ecdsa.rs | 14 ++++++++++++++ lightning/src/sign/mod.rs | 21 +++++++++++++++++++++ lightning/src/util/test_channel_signer.rs | 7 +++++++ 3 files changed, 42 insertions(+) diff --git a/lightning/src/sign/ecdsa.rs b/lightning/src/sign/ecdsa.rs index ecdd45aa3f5..3390f9ce184 100644 --- a/lightning/src/sign/ecdsa.rs +++ b/lightning/src/sign/ecdsa.rs @@ -209,4 +209,18 @@ pub trait EcdsaChannelSigner: ChannelSigner { fn sign_channel_announcement_with_funding_key( &self, msg: &UnsignedChannelAnnouncement, secp_ctx: &Secp256k1, ) -> Result; + + /// Signs the input of a splicing funding transaction with our funding key. + /// + /// In splicing, the previous funding transaction output is spent as the input of + /// the new funding transaction, and is a 2-of-2 multisig. + /// + /// `input_index`: The index of the input within the new funding transaction `tx`, + /// spending the previous funding transaction's output + /// + /// `input_value`: The value of the previous funding transaction output. + fn sign_splicing_funding_input( + &self, tx: &Transaction, input_index: usize, input_value: u64, + secp_ctx: &Secp256k1, + ) -> Result; } diff --git a/lightning/src/sign/mod.rs b/lightning/src/sign/mod.rs index 8ad34f2d653..25164f05758 100644 --- a/lightning/src/sign/mod.rs +++ b/lightning/src/sign/mod.rs @@ -1695,6 +1695,27 @@ impl EcdsaChannelSigner for InMemorySigner { let msghash = hash_to_message!(&Sha256dHash::hash(&msg.encode()[..])[..]); Ok(secp_ctx.sign_ecdsa(&msghash, &self.funding_key)) } + + fn sign_splicing_funding_input( + &self, tx: &Transaction, input_index: usize, input_value: u64, + secp_ctx: &Secp256k1, + ) -> Result { + let funding_pubkey = PublicKey::from_secret_key(secp_ctx, &self.funding_key); + let counterparty_funding_key = + &self.counterparty_pubkeys().expect(MISSING_PARAMS_ERR).funding_pubkey; + let funding_redeemscript = + make_funding_redeemscript(&funding_pubkey, counterparty_funding_key); + let sighash = &sighash::SighashCache::new(tx) + .p2wsh_signature_hash( + input_index, + &funding_redeemscript, + Amount::from_sat(input_value), + EcdsaSighashType::All, + ) + .unwrap()[..]; + let msg = hash_to_message!(sighash); + Ok(sign(secp_ctx, &msg, &self.funding_key)) + } } #[cfg(taproot)] diff --git a/lightning/src/util/test_channel_signer.rs b/lightning/src/util/test_channel_signer.rs index 9aa34fd4ca6..d9df500f2f8 100644 --- a/lightning/src/util/test_channel_signer.rs +++ b/lightning/src/util/test_channel_signer.rs @@ -353,6 +353,13 @@ impl EcdsaChannelSigner for TestChannelSigner { ) -> Result { self.inner.sign_channel_announcement_with_funding_key(msg, secp_ctx) } + + fn sign_splicing_funding_input( + &self, tx: &Transaction, input_index: usize, input_value: u64, + secp_ctx: &Secp256k1, + ) -> Result { + self.inner.sign_splicing_funding_input(tx, input_index, input_value, secp_ctx) + } } #[cfg(taproot)]