mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-07-01 19:10:59 +02:00
sweep: make sweeper block-driven instead of time-driven
This commit changes the source that drives the state changes in the sweeper. Previously we used a ticker with default interval of 30s to trigger sweepings periodically. The assumption is, within this 30s we'd batch multiple inputs into one transaction to maximize profits. However, the efficacy of this batch is questionable. At a high level, we can put our inputs into two categories - one that's forced, and one that's not. For forced inputs, we should sweep them immediately as the force flag indicates they are very urgent, eg, CPFPing the force closing tx. For non-forced inputs, such as anchors or HTLCs with CLTV that's far away, we can wait to sweep them till a new block comes in and triggers the sweeping process. Eventually, all inputs will be deadline-aware, and the sweeper will consult our fee bumper about the most economical fee rate to be used for a given deadline. Since the deadlines here are blockstamp, it's also easier to manage them if the sweeper is also using blockstamp instead of timestamp.
This commit is contained in:
@ -43,7 +43,8 @@ type sweeperTestContext struct {
|
||||
backend *mockBackend
|
||||
store SweeperStore
|
||||
|
||||
publishChan chan wire.MsgTx
|
||||
publishChan chan wire.MsgTx
|
||||
currentHeight int32
|
||||
}
|
||||
|
||||
var (
|
||||
@ -125,12 +126,13 @@ func createSweeperTestContext(t *testing.T) *sweeperTestContext {
|
||||
)
|
||||
|
||||
ctx := &sweeperTestContext{
|
||||
notifier: notifier,
|
||||
publishChan: backend.publishChan,
|
||||
t: t,
|
||||
estimator: estimator,
|
||||
backend: backend,
|
||||
store: store,
|
||||
notifier: notifier,
|
||||
publishChan: backend.publishChan,
|
||||
t: t,
|
||||
estimator: estimator,
|
||||
backend: backend,
|
||||
store: store,
|
||||
currentHeight: mockChainHeight,
|
||||
}
|
||||
|
||||
ctx.sweeper = New(&UtxoSweeperConfig{
|
||||
@ -214,6 +216,11 @@ func (ctx *sweeperTestContext) assertNoTx() {
|
||||
|
||||
func (ctx *sweeperTestContext) receiveTx() wire.MsgTx {
|
||||
ctx.t.Helper()
|
||||
|
||||
// Every time we want to receive a tx, we send a new block epoch to the
|
||||
// sweeper to trigger a sweeping action.
|
||||
ctx.notifier.NotifyEpochNonBlocking(ctx.currentHeight + 1)
|
||||
|
||||
var tx wire.MsgTx
|
||||
select {
|
||||
case tx = <-ctx.publishChan:
|
||||
@ -1775,6 +1782,10 @@ func TestRequiredTxOuts(t *testing.T) {
|
||||
inputs[*op] = inp
|
||||
}
|
||||
|
||||
// Send a new block epoch to trigger the sweeper to
|
||||
// sweep the inputs.
|
||||
ctx.notifier.NotifyEpoch(ctx.sweeper.currentHeight + 1)
|
||||
|
||||
// Check the sweeps transactions, ensuring all inputs
|
||||
// are there, and all the locktimes are satisfied.
|
||||
var sweeps []*wire.MsgTx
|
||||
|
Reference in New Issue
Block a user