sweeper: relax anchor sweeping when there's no deadline pressure (#7965)
* sweep: use longer variable name for clarity in `addToState` * sweeper: add more docs and debug logs * sweep: prioritize smaller inputs when adding wallet UTXOs This commit sorts wallet UTXOs by their values when using them for sweeping inputs. This way we'd avoid locking large UTXOs when sweeping inputs and also provide an opportunity to aggregate wallet UTXOs. * contractcourt+itest: relax anchor sweeping for CPFP purpose This commit changes from always sweeping anchor for a local force close to only do so when there is an actual time pressure. After this change, a forced anchor sweeping will only be attempted when the deadline is less than 144 blocks. * docs: update release notes * itest: update test `testMultiHopHtlcLocalChainClaim` to skip CPFP Since we now only perform CPFP when both the fee rate is higher and the deadline is less than 144, we need to update the test to reflect that Bob will not CPFP the force close tx for the channle Alice->Bob. * itest: fix `testMultiHopRemoteForceCloseOnChainHtlcTimeout` * itest: update related tests to reflect anchor sweeping This commit updates all related tests to reflect the latest anchor sweeping behavior. Previously, anchor sweeping is always attempted as CPFP when a force close is broadcast, while now it only happens when the deadline is less than 144. For non-CPFP purpose sweeping, it will happen after one block is mined after the force close transaction is confirmed as the anchor will be resent to the sweeper with a floor fee rate, hence making it economical to sweep.
This commit is contained in:
9 files changed
+248
-99
No files matched your search
@@ -1310,9 +1310,23 @@ func (c *ChannelArbitrator) sweepAnchors(anchors *lnwallet.AnchorResolutions,
|
||||
return err
|
||||
}
|
||||
|
||||
// Create a force flag that's used to indicate whether we
|
||||
// should force sweeping this anchor.
|
||||
var force bool
|
||||
|
||||
// Check the deadline against the default value. If it's less
|
||||
// than the default value of 144, it means there is a deadline
|
||||
// and we will perform a CPFP for this commitment tx.
|
||||
if deadline < anchorSweepConfTarget {
|
||||
// Signal that this is a force sweep, so that the
|
||||
// anchor will be swept even if it isn't economical
|
||||
// purely based on the anchor value.
|
||||
force = true
|
||||
}
|
||||
|
||||
log.Debugf("ChannelArbitrator(%v): pre-confirmation sweep of "+
|
||||
"anchor of %s commit tx %v", c.cfg.ChanPoint,
|
||||
anchorPath, anchor.CommitAnchor)
|
||||
"anchor of %s commit tx %v, force=%v", c.cfg.ChanPoint,
|
||||
anchorPath, anchor.CommitAnchor, force)
|
||||
|
||||
witnessType := input.CommitmentAnchor
|
||||
|
||||
@@ -1338,20 +1352,17 @@ func (c *ChannelArbitrator) sweepAnchors(anchors *lnwallet.AnchorResolutions,
|
||||
)
|
||||
|
||||
// Sweep anchor output with a confirmation target fee
|
||||
// preference. Because this is a cpfp-operation, the anchor will
|
||||
// only be attempted to sweep when the current fee estimate for
|
||||
// the confirmation target exceeds the commit fee rate.
|
||||
//
|
||||
// Also signal that this is a force sweep, so that the anchor
|
||||
// will be swept even if it isn't economical purely based on the
|
||||
// anchor value.
|
||||
// preference. Because this is a cpfp-operation, the anchor
|
||||
// will only be attempted to sweep when the current fee
|
||||
// estimate for the confirmation target exceeds the commit fee
|
||||
// rate.
|
||||
_, err = c.cfg.Sweeper.SweepInput(
|
||||
&anchorInput,
|
||||
sweep.Params{
|
||||
Fee: sweep.FeePreference{
|
||||
ConfTarget: deadline,
|
||||
},
|
||||
Force: true,
|
||||
Force: force,
|
||||
ExclusiveGroup: &exclusiveGroup,
|
||||
},
|
||||
)
|
||||
@@ -1428,6 +1439,9 @@ func (c *ChannelArbitrator) findCommitmentDeadline(heightHint uint32,
|
||||
|
||||
if htlc.RefundTimeout < deadlineMinHeight {
|
||||
deadlineMinHeight = htlc.RefundTimeout
|
||||
log.Tracef("ChannelArbitrator(%v): outgoing HTLC has "+
|
||||
"deadline: %v", c.cfg.ChanPoint,
|
||||
deadlineMinHeight)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1456,6 +1470,9 @@ func (c *ChannelArbitrator) findCommitmentDeadline(heightHint uint32,
|
||||
|
||||
if htlc.RefundTimeout < deadlineMinHeight {
|
||||
deadlineMinHeight = htlc.RefundTimeout
|
||||
log.Tracef("ChannelArbitrator(%v): incoming HTLC has "+
|
||||
"deadline: %v", c.cfg.ChanPoint,
|
||||
deadlineMinHeight)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user