-
Notifications
You must be signed in to change notification settings - Fork 2.2k
contractcourt+sweep: make anchor inputs exclusive #10117
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
Changes from all commits
ae08a75
5ee54b3
3da4093
ab8e035
4d7622a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -29,6 +29,13 @@ | |
|
||
## Functional Enhancements | ||
|
||
- Previously, when sweeping non-time sensitive anchor outputs, they might be | ||
grouped with other non-time sensitive outputs such as `to_local` outputs, | ||
which potentially allow the sweeping tx to be pinned. This is now | ||
[fixed](https://github.com/lightningnetwork/lnd/pull/10117) by moving sweeping | ||
anchors into its own tx, which means the anchor outputs won't be swept in a | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. would be cool to actually group at least anchors together, seems like sub 1 sat/vbyte transactions can now be propagated quite reliably There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Gotta say I'm very confused, as on one hand you were saying you really wanna the anchor sweeping to be removed but now you think it's cool to group them? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I did not know about the sub 1 sat/vbyte rule going to be removed by the core-devs, moreover you explained to me that anchors don't block a wallet input so given this new knowledge I would say there is nothing wrong with grouping them and therefore being able to recover valuable sathosis ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was gonna create a PR to remove the anchor sweeping - based on your current view, it seems unnecessary to create that PR? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Curious what your opinion is, but I would say either we remove the anchors or we make sure we can group different anchors from different channel force closes and make also sure we can broadcast them sub 1 sat/vbyte ? Current version as mentioned before never sweeps the anchors anyways so I think we need an improvement anyways here going forward ? |
||
high fee environment. | ||
|
||
## RPC Additions | ||
|
||
## lncli Additions | ||
|
@@ -62,4 +69,6 @@ | |
## Tooling and Documentation | ||
|
||
# Contributors (Alphabetical Order) | ||
* Olaoluwa Osuntokun | ||
|
||
* Olaoluwa Osuntokun | ||
* Yong Yu |
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
|
@@ -1224,8 +1224,8 @@ func testSweepHTLCs(ht *lntest.HarnessTest) { | |||
// 4. Alice force closes the channel. | ||||
// | ||||
// Test: | ||||
// 1. Alice's anchor sweeping is not attempted, instead, it should be swept | ||||
// together with her to_local output using the no deadline path. | ||||
// 1. Alice's CPFP-anchor sweeping is not attempted, instead, it should be | ||||
// swept using the no deadline path and failed due it's not economical. | ||||
Comment on lines
+1227
to
+1228
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we should update the test to assert the behavior that the anchor is not spent. I see failures because the fee rate delta is zero, which is probably equivalent of it not being economical to spend the anchor, or is this very specific to the test? Would it be possible to also have the case where the anchor is swept as a non-CPFP? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated a bit.
Correct, and there's another log, which also stops the anchor sweeping,
We have two places to stop the sweeping,
This is not possible given we hardcoded the dust limit here, Line 46 in 8f94929
So it's always 330 sats, which is why the anchors won't be swept, until we make There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah ok TIL that the 330 sat are computed with a static min relay fee of 3 sat/vb. So basically we'll never sweep if that is not made dynamic, because we'd always leave less than 330 sat? |
||||
// 2. Bob would also sweep his anchor and to_local outputs separately due to | ||||
// they have different deadline heights, which means only the to_local | ||||
// sweeping tx will succeed as the anchor sweeping is not economical. | ||||
|
@@ -1241,10 +1241,15 @@ func testSweepCommitOutputAndAnchor(ht *lntest.HarnessTest) { | |||
// config. | ||||
deadline := uint32(1000) | ||||
|
||||
// deadlineA is the deadline used for Alice, since her commit output is | ||||
// offered to the sweeper at CSV-1. With a deadline of 1000, her actual | ||||
// width of her fee func is CSV+1000-1. Given we are using a CSV of 2 | ||||
// here, her fee func deadline then becomes 1001. | ||||
// deadlineA is the deadline used for Alice, given that, | ||||
// - the force close tx is broadcast at height 445, her inputs are | ||||
// registered at the same height, so her to_local and anchor outputs | ||||
// have a deadline height of 1445. | ||||
// - the force close tx is mined at 446, which means her anchor output | ||||
// now has a deadline delta of (1445-446) = 999 blocks. | ||||
// - for her to_local output, with a deadline of 1000, the width of the | ||||
// fee func is CSV+1000-1. Given we are using a CSV of 2 here, her fee | ||||
// func deadline then becomes 1001. | ||||
deadlineA := deadline + 1 | ||||
|
||||
// deadlineB is the deadline used for Bob, the actual deadline used by | ||||
|
@@ -1267,6 +1272,11 @@ func testSweepCommitOutputAndAnchor(ht *lntest.HarnessTest) { | |||
// conf target is the deadline. | ||||
ht.SetFeeEstimateWithConf(startFeeRate, deadlineB) | ||||
|
||||
// Set up the starting fee for Alice's anchor sweeping. With this low | ||||
// fee rate, her anchor sweeping should be attempted and failed due to | ||||
// dust output generated in the sweeping tx. | ||||
ht.SetFeeEstimateWithConf(startFeeRate, deadline-1) | ||||
|
||||
// toLocalCSV is the CSV delay for Alice's to_local output. We use a | ||||
// small value to save us from mining blocks. | ||||
// | ||||
|
@@ -1427,10 +1437,10 @@ func testSweepCommitOutputAndAnchor(ht *lntest.HarnessTest) { | |||
// With Alice's starting fee rate being validated, we now calculate her | ||||
// ending fee rate and fee rate delta. | ||||
// | ||||
// Alice sweeps two inputs - anchor and commit, so the starting budget | ||||
// should come from the sum of these two. However, due to the value | ||||
// being too large, the actual ending fee rate used should be the | ||||
// sweeper's max fee rate configured. | ||||
// Alice sweeps the to_local input, so the starting budget should come | ||||
// from the to_local balance. However, due to the value being too large, | ||||
// the actual ending fee rate used should be the sweeper's max fee rate | ||||
// configured. | ||||
aliceTxWeight := uint64(ht.CalculateTxWeight(aliceSweepTx)) | ||||
aliceEndingFeeRate := sweep.DefaultMaxFeeRate.FeePerKWeight() | ||||
aliceFeeRateDelta := (aliceEndingFeeRate - aliceStartingFeeRate) / | ||||
|
@@ -1507,10 +1517,10 @@ func testSweepCommitOutputAndAnchor(ht *lntest.HarnessTest) { | |||
} | ||||
|
||||
// We should see two txns in the mempool: | ||||
// - Alice's sweeping tx, which sweeps both her anchor and | ||||
// commit outputs, using the increased fee rate. | ||||
// - Bob's previous sweeping tx, which sweeps both his anchor | ||||
// and commit outputs, at the possible increased fee rate. | ||||
// - Alice's sweeping tx, which sweeps her commit output, using | ||||
// the increased fee rate. | ||||
// - Bob's previous sweeping tx, which sweeps his commit output, | ||||
// at the possible increased fee rate. | ||||
txns := ht.GetNumTxsFromMempool(2) | ||||
|
||||
// Assume the first tx is Alice's sweeping tx, if the second tx | ||||
|
@@ -1577,6 +1587,11 @@ func testSweepCommitOutputAndAnchor(ht *lntest.HarnessTest) { | |||
// Mine a block to confirm both sweeping txns, this is needed to clean | ||||
// up the mempool. | ||||
ht.MineBlocksAndAssertNumTxes(1, 2) | ||||
|
||||
// Finally, assert that both Alice and Bob still have the anchor | ||||
// outputs, which cannot be swept due to it being uneconomical. | ||||
ht.AssertNumPendingSweeps(alice, 1) | ||||
ht.AssertNumPendingSweeps(bob, 1) | ||||
} | ||||
|
||||
// testBumpForceCloseFee tests that when a force close transaction, in | ||||
|
Uh oh!
There was an error while loading. Please reload this page.