Skip to content

Commit

Permalink
fixup! Add ability to retrieve latest commitment transactions from Ch…
Browse files Browse the repository at this point in the history
…annelManager
  • Loading branch information
luckysori committed Jul 21, 2023
1 parent b190b7e commit 5af1b2f
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 13 deletions.
13 changes: 11 additions & 2 deletions lightning/src/ln/chan_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -823,7 +823,14 @@ pub struct ChannelTransactionParameters {
/// The late-bound counterparty channel transaction parameters.
/// These parameters are populated at the point in the protocol where the counterparty provides them.
pub counterparty_parameters: Option<CounterpartyChannelTransactionParameters>,
/// The late-bound funding outpoint
/// The late-bound funding outpoint.
///
/// If it's a vanilla LN channel, this value corresponds to the actual funding outpoint that
/// goes on-chain when the channel is created.
///
/// If instead we're dealing with a split channel, this value corresponds to a glue
/// transaction which sits in between the funding transaction and the commitment
/// transaction.
pub funding_outpoint: Option<chain::transaction::OutPoint>,
/// Are anchors (zero fee HTLC transaction variant) used for this channel. Boolean is
/// serialization backwards-compatible.
Expand All @@ -832,7 +839,9 @@ pub struct ChannelTransactionParameters {
/// It is intended merely for backwards compatibility with signers that need it.
/// There is no support for this feature in LDK channel negotiation.
pub opt_non_zero_fee_anchors: Option<()>,
///
/// This value always corresponds to the actual funding outpoint. This is different to
/// [`ChannelTransactionParameters::funding_outpoint`], which varies depending on the type
/// of Lightning channel we have.
pub original_funding_outpoint: Option<chain::transaction::OutPoint>,
}

Expand Down
46 changes: 35 additions & 11 deletions lightning/src/ln/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5120,21 +5120,45 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
}
}

let original_funding_outpoint = self.get_original_funding_txo().map(|x| x.into_bitcoin_outpoint());
let funding_bitcoin_outpoint = funding_txo.into_bitcoin_outpoint();
let funding_match = |prev_outpoint: &bitcoin::OutPoint| -> bool {
prev_outpoint == &funding_bitcoin_outpoint
// If we have a vanilla LN channel, this checks if the transaction
// spends from the actual funding output.
//
// If we have a split channel, this checks if the transaction spends
// from the glue output.
//
// In both cases we are checking if this transaction is the
// commitment transaction.
let is_funding_or_glue_txo = |prev_outpoint: &bitcoin::OutPoint| -> bool {
prev_outpoint == &funding_txo.into_bitcoin_outpoint()
};
let original_funding_match = |prev_outpoint: &bitcoin::OutPoint, outputs: &[bitcoin::TxOut]| -> bool {
if let Some(original_funding_outpoint) = original_funding_outpoint {
// We want to filter for the split tx which is not closing the LN channel.
prev_outpoint == &original_funding_outpoint && !(outputs.len() == 2 && outputs[0].script_pubkey == outputs[1].script_pubkey)
} else {
false

// This check only runs if the check above returns `false`.
//
// Given that, if we have a vanilla LN channel this check will
// return `false` too, because for vanilla LN channels `funding_txo
// == original_funding_txo`.
//
// If we have a split channel, this checks if the transaction spends
// from the actual funding output BUT it is _not_ the split
// transaction. This can happen if the split channel is closed using
// a revoked commitment transaction!
//
// We purposefully do not announce the closure of the channel with
// the confirmation of the split transaction. TODO(lucas): Exactly
// why is this, Tibo?
let is_revoked_commitment_transaction = |prev_outpoint: &bitcoin::OutPoint, outputs: &[bitcoin::TxOut]| -> bool {
match self.get_original_funding_txo().map(|x| x.into_bitcoin_outpoint()) {
Some(original_funding_outpoint) => {
// Transaction spends from actual funding output.
prev_outpoint == &original_funding_outpoint &&
// Transaction is _not_ a split transaction.
!(outputs.len() == 2 && outputs[0].script_pubkey == outputs[1].script_pubkey)
}
None => false,
}
};
for inp in tx.input.iter() {
if funding_match(&inp.previous_output) || original_funding_match(&inp.previous_output, &tx.output) {
if is_funding_or_glue_txo(&inp.previous_output) || is_revoked_commitment_transaction(&inp.previous_output, &tx.output) {
log_info!(logger, "Detected channel-closing tx {} spending {}:{}, closing channel {}", tx.txid(), inp.previous_output.txid, inp.previous_output.vout, log_bytes!(self.channel_id()));
return Err(ClosureReason::CommitmentTxConfirmed);
}
Expand Down

0 comments on commit 5af1b2f

Please sign in to comment.