Skip to content

Commit

Permalink
Merge pull request lightningdevkit#3316 from optout21/signer_extend
Browse files Browse the repository at this point in the history
[Splicing] Signer extended with method to sign prev funding transaction input
  • Loading branch information
TheBlueMatt authored Oct 16, 2024
2 parents 0db051b + f22b011 commit d4e8b49
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 0 deletions.
14 changes: 14 additions & 0 deletions lightning/src/sign/ecdsa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,4 +209,18 @@ pub trait EcdsaChannelSigner: ChannelSigner {
fn sign_channel_announcement_with_funding_key(
&self, msg: &UnsignedChannelAnnouncement, secp_ctx: &Secp256k1<secp256k1::All>,
) -> Result<Signature, ()>;

/// 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<secp256k1::All>,
) -> Result<Signature, ()>;
}
21 changes: 21 additions & 0 deletions lightning/src/sign/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<secp256k1::All>,
) -> Result<Signature, ()> {
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)]
Expand Down
7 changes: 7 additions & 0 deletions lightning/src/util/test_channel_signer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,13 @@ impl EcdsaChannelSigner for TestChannelSigner {
) -> Result<Signature, ()> {
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<secp256k1::All>,
) -> Result<Signature, ()> {
self.inner.sign_splicing_funding_input(tx, input_index, input_value, secp_ctx)
}
}

#[cfg(taproot)]
Expand Down

0 comments on commit d4e8b49

Please sign in to comment.