Skip to content

Introduce interactive signing state flags for funded states. - #3637

Merged
jkczyz merged 5 commits into
lightningdevkit:mainfrom
dunxen:2025-02-interactivesigningstate
May 23, 2025
Merged

Introduce interactive signing state flags for funded states.#3637
jkczyz merged 5 commits into
lightningdevkit:mainfrom
dunxen:2025-02-interactivesigningstate

Conversation

@dunxen

Copy link
Copy Markdown
Contributor

This PR includes some deferred follow-ups extracted from #3423 and introduces new state flags to track interactive signing along with persistence of the minimum information needed from a signing session to reconstruct it.

A top-level state flag was avoided so that this work is compatible with splicing as well as V2 channel establishment (dual-funding).

@ldk-reviews-bot

ldk-reviews-bot commented Mar 3, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @jkczyz as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@dunxen
dunxen marked this pull request as draft March 3, 2025 18:50
@dunxen
dunxenforce-pushed the 2025-02-interactivesigningstate branch 2 times, most recently from 4c6b6ab to c1f430aCompareMarch 4, 2025 09:02
@dunxendunxen changed the title DRAFT: Introduce interactive signing state flags for funded states.Introduce interactive signing state flags for funded states.Mar 4, 2025
@dunxen
dunxen marked this pull request as ready for review March 4, 2025 09:03
@dunxen
dunxenforce-pushed the 2025-02-interactivesigningstate branch from c1f430a to e89ba58CompareMarch 4, 2025 11:09

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you want to include test coverage for restarts here?

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadCargo.toml Outdated
Comment threadlightning/src/ln/interactivetxs.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Did you want to include test coverage for restarts here?

Not yet. Tracked in #3636. Will need to be able to contribute inputs first to test a useful order of message exchange + restart.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
@dunxen
dunxenforce-pushed the 2025-02-interactivesigningstate branch from e89ba58 to 3b2ac55CompareMarch 5, 2025 10:05
@codecov

codecovBot commented Mar 5, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 64.55026% with 67 lines in your changes missing coverage. Please review.

Project coverage is 90.01%. Comparing base (89f5217) to head (fb00cb6).
Report is 19 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/channel.rs59.55%49 Missing and 6 partials ⚠️
lightning/src/ln/interactivetxs.rs46.66%8 Missing ⚠️
lightning/src/ln/channelmanager.rs90.90%1 Missing and 1 partial ⚠️
lightning/src/ln/dual_funding_tests.rs87.50%1 Missing ⚠️
lightning/src/util/ser.rs85.71%0 Missing and 1 partial ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3637 +/- ##
==========================================
+ Coverage 89.37% 90.01% +0.63% 
==========================================
Files 157 157 Lines 124095 129376 +5281 Branches 124095 129376 +5281 ==========================================
+ Hits 110915 116452 +5537 + Misses 10469 10187 -282 - Partials 2711 2737 +26 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@dunxen
dunxenforce-pushed the 2025-02-interactivesigningstate branch from 3b2ac55 to 5110eccCompareMarch 5, 2025 14:20
@wpaulino

Copy link
Copy Markdown
Contributor

@dunxen re-request when this is ready for review again, feel free to squash as well

@dunxen
dunxenforce-pushed the 2025-02-interactivesigningstate branch from 5110ecc to 1d96044CompareMarch 6, 2025 12:43
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @TheBlueMatt@jkczyz@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@dunxendunxen added weekly goal Someone wants to land this this week Dual-funding labels Mar 6, 2025
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/interactivetxs.rs Outdated
@TheBlueMatt
TheBlueMatt removed their request for review March 6, 2025 23:01
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Taking myself off since @wpaulino and @jkczyz are on this one. Aside from my first comment I don't have any more high-level feedback.

@dunxen
dunxenforce-pushed the 2025-02-interactivesigningstate branch from 1d96044 to 55e5f6fCompareMarch 11, 2025 11:42
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @jkczyz@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @jkczyz@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@dunxen
dunxenforce-pushed the 2025-02-interactivesigningstate branch from fb00cb6 to 3c0b810CompareMay 12, 2025 10:50
@jkczyz

Copy link
Copy Markdown
Contributor

@dunxen Was the latest push just a rebase?

@dunxen

dunxen commented May 12, 2025

Copy link
Copy Markdown
ContributorAuthor

@dunxen Was the latest push just a rebase?

Oh yip.

Sorry, I didn't put a diff-tree showing that.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

Hey @jkczyz! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@dunxen
dunxenforce-pushed the 2025-02-interactivesigningstate branch from 3c0b810 to 74139d0CompareMay 14, 2025 12:37

@dunxendunxen left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes:

git diff-tree -U1 3c0b810 74139d0
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 66305c042..e6e9c8f3b 100644
--- a/lightning/src/ln/channel.rs+++ b/lightning/src/ln/channel.rs@@ -5942,6 +5942,6 @@ impl<SP: Deref> FundedChannel<SP> where
{
- if !matches!(self.context.channel_state, ChannelState::FundingNegotiated(flags) if flags.is_interactive_signing()) {+ if !matches!(self.context.channel_state, ChannelState::FundingNegotiated(flags) if flags.is_interactive_signing() && !flags.is_their_tx_signatures_sent()) {
return Err(ChannelError::Close(
(
- "Received initial commitment_signed before funding transaction constructed!".to_owned(),+ "Received initial commitment_signed before funding transaction constructed or after peer's tx_signatures received!".to_owned(),
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) },
@@ -6615,2 +6615,13 @@ impl<SP: Deref> FundedChannel<SP> where
+ // We need to close the channel if our peer hasn't sent their commitment signed already.+ // Technically we'd wait on having an initial monitor persisted, so we shouldn't be broadcasting+ // the transaction, but this may risk losing funds for a manual broadcast if we continue.+ if !signing_session.has_received_commitment_signed() {+ return Err(ChannelError::Close(+ (+ "Received tx_signatures before initial commitment_signed".to_string(),+ ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) },+ )));+ }+
if msg.witnesses.len() != signing_session.remote_inputs_count() {
@@ -7458,3 +7469,9 @@ impl<SP: Deref> FundedChannel<SP> where
} else {
- return Err(ChannelError::close("Counterparty set `next_funding_txid` at incorrect state".into()));+ // We'll just send a `tx_abort` here if we don't have a signing session for this channel+ // on reestablish and tell our peer to just forget about it.+ // Our peer is doing something strange, but it doesn't warrant closing the channel.+ (None, None, Some(msgs::TxAbort {+ channel_id: self.context.channel_id(),+ data:+ "No active signing session. The associated funding transaction may have already been broadcast.".as_bytes().to_vec() }))
}

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs
@dunxen
dunxen requested a review from wpaulinoMay 14, 2025 12:47
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 5th Reminder

Hey @jkczyz@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @jkczyz@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 6th Reminder

Hey @jkczyz@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @jkczyz@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

jkczyz
jkczyz previously approved these changes May 19, 2025

@jkczyzjkczyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment threadlightning/src/ln/channel.rs Outdated
dunxen added 5 commits May 20, 2025 21:40
Instead of having an explicit `ChannelContext::next_funding_txid` to set
and read, we can get this value on the fly when it is appropriate to do
so.
This follows the the specification closely in branching without being
too verbose, so that it should be easy to follow the logic.
See: https://github.com/lightning/bolts/blob/aa5207a/02-peer-protocol.md?plain=1#L2520-L2531
This intoduces the INTERACTIVE_SIGNING, THEIR_TX_SIGNATURES_SENT, and
OUR_TX_SIGNATURES_SENT funded state flags.
A top-level state flag for INTERACTIVE_SIGNING was avoided so that this
work is compatible with splicing as well as V2 channel establishment
(dual-funding).
This commit also ensures that `ChannelPending` is only emitted after
peers exchange `tx_signatures`.
We fully persist `InteractiveTxSigningSession` as it provides the full
context of the constructed transaction which is still needed for signing.
When this config field is enabled, the dual_fund feature bit will be
set which determines support when receiving `open_channel2` messages.
@dunxen
dunxenforce-pushed the 2025-02-interactivesigningstate branch from 74139d0 to b5ac8e8CompareMay 20, 2025 19:48
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Sorry, a possibly earlier rebase slipped in with the last change 🤦‍♂️
Meant to rebase my draft PR. But just fixed up #3637 (comment)

@dunxen
dunxen requested a review from jkczyzMay 20, 2025 19:58
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

Hey @jkczyz@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@wpaulinowpaulino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One last comment but it can go in a follow-up

} else {
// The `next_funding_txid` does not match the latest interactive funding transaction so we
// MUST send tx_abort to let the remote know that they can forget this funding transaction.
(None, None, Some(msgs::TxAbort {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like we actually need to close the channel here:

A receiving node:
- if next_funding_txid is set:
- if it also sets next_funding_txid in its own channel_reestablish, but the values don't match:
- MUST send an error and fail the channel.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @jkczyz! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@jkczyz
jkczyz merged commit 1156efb into lightningdevkit:mainMay 23, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Dual-fundingweekly goalSomeone wants to land this this week

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@dunxen@ldk-reviews-bot@wpaulino@TheBlueMatt@jkczyz