-
Notifications
You must be signed in to change notification settings - Fork 424
Contribute funding inputs on accepting dual-funded channel #3735
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
👋 Thanks for assigning @wpaulino as a reviewer! |
e22fa33 to
fabbf86
Compare
c42f3d0 to
186d66b
Compare
186d66b to
c7d8e89
Compare
c7d8e89 to
540b8a7
Compare
|
Looks like this needs a rebase after #3637 |
540b8a7 to
94bf848
Compare
ugh right! |
|
Don't the first three commits need to be dropped? |
67504f0 to
9f276d8
Compare
|
Just needs node reload tests but it can still get some initial review. |
9f276d8 to
60f58b1
Compare
lightning/src/ln/channel.rs
Outdated
| script_pubkey: funding.get_funding_redeemscript().to_p2wsh(), | ||
| }; | ||
|
|
||
| // Optionally add change output |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wouldn't this already be covered by begin_interactive_funding_tx_construction?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh indeed. begin_interactive_funding_tx_construction was modified to include that in a previous pre-splicing work. Thanks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Regarding locktime, maybe we just throw it in UnfundedChannelContext or directly in PendingV2Channel? Using FundingNegotiation may not be ideal given it has a variant (AwaitingSignatures) where the locktime is no longer available, even though we'd never have a PendingV2Channel in that state.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As mentioned offline, I added a fixup to store the locktime directly in PendingV2Channel. Using UnfundedChannelContext won't work since it is used for v1 channels, too. I considered passing the locktime to the relevant method (get_open_channel_v2) after constructing the channel. However, that method is called in some other places, too.
lightning/src/ln/channel.rs
Outdated
| }; | ||
|
|
||
| // Optionally add change output | ||
| let change_script = signer_provider.get_destination_script(context.channel_keys_id) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe let the user optionally provide a change address along with their inputs?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
|
Since the |
|
🔔 1st Reminder Hey @jkczyz! This PR has been waiting for your review. |
|
🔔 2nd Reminder Hey @jkczyz! This PR has been waiting for your review. |
Agreed. Apologies for the late response. Back home now. I'll split it into a separate PR and we can discuss changes. |
|
🔔 3rd Reminder Hey @jkczyz! This PR has been waiting for your review. |
9a2a5ce to
8006303
Compare
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #3735 +/- ##
==========================================
+ Coverage 89.32% 89.61% +0.29%
==========================================
Files 180 181 +1
Lines 138176 138525 +349
Branches 138176 138525 +349
==========================================
+ Hits 123424 124141 +717
+ Misses 12137 11774 -363
+ Partials 2615 2610 -5
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
🔔 4th Reminder Hey @jkczyz! This PR has been waiting for your review. |
|
Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking? |
Yeah, probably best to use a fresh issue than re-open an older one that's accumulated the splicing work. |
c059e03 to
fe940d6
Compare
|
Rebased! Will take over the PR from here 🫡 |
Thanks, @jkczyz! I will be able to give some review this week. Blocked out some space for it. |
|
Just looked through the docs/comments and hope they are still valid since this PR was opened. |
…annel We introduce a `ChannelManager::accept_inbound_channel_with_contribution` method allowing contributing to the overall channel capacity of an inbound dual-funded channel by contributing inputs.
lightning/src/ln/channelmanager.rs
Outdated
| /// portion of the channel value. Our contribution will be calculated as the total value of these | ||
| /// inputs minus the fees we need to cover for the interactive funding transaction. The witness |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This actually isn't accurate. The contribution is given by our_funding_satoshis, while funding_inputs must have enough for that plus any fees. The remaining value should go to change. Updated the docs accordingly.
lightning/src/ln/channel.rs
Outdated
| script_pubkey: funding.get_funding_redeemscript().to_p2wsh(), | ||
| }; | ||
|
|
||
| // Optionally add change output |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?
lightning/src/ln/channel.rs
Outdated
| }; | ||
|
|
||
| // Optionally add change output | ||
| let change_script = signer_provider.get_destination_script(context.channel_keys_id) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
fe940d6 to
ed4d8a5
Compare
We can now run through the case where the acceptor contributes to an inbound channel, with either more value in inputs, or less value, leading to a different `tx_signatures` exchange order. We also cannot use dummy P2WPKH funding inputs and witnesses anymore as `funding_transaction_signed` internally verifies signatures. Hence, we create external keypairs that we can create outputs for and sign with.
ed4d8a5 to
9a04ed0
Compare
|
🔔 1st Reminder Hey @wpaulino! This PR has been waiting for your review. |
|
🔔 2nd Reminder Hey @wpaulino! This PR has been waiting for your review. |
|
🔔 3rd Reminder Hey @wpaulino! This PR has been waiting for your review. |
|
🔔 4th Reminder Hey @wpaulino! This PR has been waiting for your review. |
|
🔔 5th Reminder Hey @wpaulino! This PR has been waiting for your review. |
|
🔔 6th Reminder Hey @wpaulino! This PR has been waiting for your review. |
|
🔔 7th Reminder Hey @wpaulino! This PR has been waiting for your review. |
|
🔔 8th Reminder Hey @wpaulino! This PR has been waiting for your review. |
| funding_negotiation_context: None, | ||
| interactive_tx_constructor: Some(interactive_tx_constructor), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would be nice to reuse FundingNegotiation here, but it seems unclear whether the last AwaitingSignatures state can be adapted to the initial dual funding state
|
|
||
| // TODO(dual_funding): Use real node and API for creating V2 channels as initiator when available, | ||
| // instead of manually constructing messages. | ||
| fn do_test_v2_channel_establishment(session: V2ChannelEstablishmentTestSession) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's just drop these until we can use the real API?
| pub fn accept_inbound_channel_with_contribution( | ||
| &self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, | ||
| user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>, | ||
| our_funding_contribution: Amount, funding_inputs: Vec<FundingTxInput>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We're also allowed to include outputs, behaving similar to the mixed mode splice, so maybe it's worth waiting until we figure that out in #4261 so we can adopt it here?
We introduce a
ChannelManager::accept_inbound_channel_with_contributionmethod allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.