From 3e36adf476c6ece37fce084083f0ab855af9794e Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Thu, 1 Aug 2024 03:01:54 +0800 Subject: [PATCH] mulit: remove `ListLeasedOutputs` in `LeaseOutput` This commit removes the call toe `ListLeasedOutputs` in `LeaseOutput` - the returned info from `ListLeasedOutputs` can easily be accessed via `FetchInputInfo` and this info is only used at one callsite. `ListLeasedOutputs` then becomes unnecessary here, plus it's very slow and needs to be refactored in `btcwallet` instead. --- lnrpc/walletrpc/psbt.go | 2 +- lnrpc/walletrpc/walletkit_server.go | 2 +- lntest/mock/walletcontroller.go | 4 ++-- lnwallet/btcwallet/btcwallet.go | 24 ++++-------------------- lnwallet/chanfunding/assembler.go | 2 +- lnwallet/chanfunding/wallet_assembler.go | 2 +- lnwallet/interface.go | 3 +-- lnwallet/mock.go | 4 ++-- sweep/walletsweep.go | 4 ++-- sweep/walletsweep_test.go | 4 ++-- 10 files changed, 17 insertions(+), 34 deletions(-) diff --git a/lnrpc/walletrpc/psbt.go b/lnrpc/walletrpc/psbt.go index 4d3e8641a..057751964 100644 --- a/lnrpc/walletrpc/psbt.go +++ b/lnrpc/walletrpc/psbt.go @@ -62,7 +62,7 @@ func lockInputs(w lnwallet.WalletController, return nil, fmt.Errorf("fetch outpoint info: %w", err) } - expiration, _, _, err := w.LeaseOutput( + expiration, err := w.LeaseOutput( lock.LockID, lock.Outpoint, chanfunding.DefaultLockDuration, ) diff --git a/lnrpc/walletrpc/walletkit_server.go b/lnrpc/walletrpc/walletkit_server.go index f72c6986a..cc836e809 100644 --- a/lnrpc/walletrpc/walletkit_server.go +++ b/lnrpc/walletrpc/walletkit_server.go @@ -490,7 +490,7 @@ func (w *WalletKit) LeaseOutput(ctx context.Context, // other concurrent processes attempting to lease the same UTXO. var expiration time.Time err = w.cfg.CoinSelectionLocker.WithCoinSelectLock(func() error { - expiration, _, _, err = w.cfg.Wallet.LeaseOutput( + expiration, err = w.cfg.Wallet.LeaseOutput( lockID, *op, duration, ) return err diff --git a/lntest/mock/walletcontroller.go b/lntest/mock/walletcontroller.go index bfef14ee0..cb7e38701 100644 --- a/lntest/mock/walletcontroller.go +++ b/lntest/mock/walletcontroller.go @@ -195,9 +195,9 @@ func (w *WalletController) ListTransactionDetails(int32, int32, // LeaseOutput returns the current time and a nil error. func (w *WalletController) LeaseOutput(wtxmgr.LockID, wire.OutPoint, - time.Duration) (time.Time, []byte, btcutil.Amount, error) { + time.Duration) (time.Time, error) { - return time.Now(), nil, 0, nil + return time.Now(), nil } // ReleaseOutput currently does nothing. diff --git a/lnwallet/btcwallet/btcwallet.go b/lnwallet/btcwallet/btcwallet.go index b3f9b4f9b..22204dea3 100644 --- a/lnwallet/btcwallet/btcwallet.go +++ b/lnwallet/btcwallet/btcwallet.go @@ -1079,36 +1079,20 @@ func (b *BtcWallet) CreateSimpleTx(inputs fn.Set[wire.OutPoint], // // NOTE: This method requires the global coin selection lock to be held. func (b *BtcWallet) LeaseOutput(id wtxmgr.LockID, op wire.OutPoint, - duration time.Duration) (time.Time, []byte, btcutil.Amount, error) { + duration time.Duration) (time.Time, error) { // Make sure we don't attempt to double lock an output that's been // locked by the in-memory implementation. if b.wallet.LockedOutpoint(op) { - return time.Time{}, nil, 0, wtxmgr.ErrOutputAlreadyLocked + return time.Time{}, wtxmgr.ErrOutputAlreadyLocked } lockedUntil, err := b.wallet.LeaseOutput(id, op, duration) if err != nil { - return time.Time{}, nil, 0, err + return time.Time{}, err } - // Get the pkScript and value for this lock from the list of all leased - // outputs. - allLeases, err := b.wallet.ListLeasedOutputs() - if err != nil { - return time.Time{}, nil, 0, err - } - - for _, lease := range allLeases { - if lease.Outpoint == op { - return lockedUntil, lease.PkScript, - btcutil.Amount(lease.Value), nil - } - } - - // We MUST find the leased output in the loop above, otherwise something - // is seriously wrong. - return time.Time{}, nil, 0, wtxmgr.ErrUnknownOutput + return lockedUntil, nil } // ListLeasedOutputs returns a list of all currently locked outputs. diff --git a/lnwallet/chanfunding/assembler.go b/lnwallet/chanfunding/assembler.go index a694d2a2c..2fdb87b32 100644 --- a/lnwallet/chanfunding/assembler.go +++ b/lnwallet/chanfunding/assembler.go @@ -44,7 +44,7 @@ type OutputLeaser interface { // LeaseOutput leases a target output, rendering it unusable for coin // selection. LeaseOutput(i wtxmgr.LockID, o wire.OutPoint, d time.Duration) ( - time.Time, []byte, btcutil.Amount, error) + time.Time, error) // ReleaseOutput releases a target output, allowing it to be used for // coin selection once again. diff --git a/lnwallet/chanfunding/wallet_assembler.go b/lnwallet/chanfunding/wallet_assembler.go index 4f2aa759b..f824210e1 100644 --- a/lnwallet/chanfunding/wallet_assembler.go +++ b/lnwallet/chanfunding/wallet_assembler.go @@ -525,7 +525,7 @@ func (w *WalletAssembler) ProvisionChannel(r *Request) (Intent, error) { for _, coin := range selectedCoins { outpoint := coin.OutPoint - _, _, _, err = w.cfg.CoinLeaser.LeaseOutput( + _, err = w.cfg.CoinLeaser.LeaseOutput( LndInternalLockID, outpoint, DefaultReservationTimeout, ) diff --git a/lnwallet/interface.go b/lnwallet/interface.go index 94478f111..d3b123509 100644 --- a/lnwallet/interface.go +++ b/lnwallet/interface.go @@ -413,8 +413,7 @@ type WalletController interface { // // NOTE: This method requires the global coin selection lock to be held. LeaseOutput(id wtxmgr.LockID, op wire.OutPoint, - duration time.Duration) (time.Time, []byte, btcutil.Amount, - error) + duration time.Duration) (time.Time, error) // ReleaseOutput unlocks an output, allowing it to be available for coin // selection if it remains unspent. The ID should match the one used to diff --git a/lnwallet/mock.go b/lnwallet/mock.go index 5016fa0d6..faac5fa67 100644 --- a/lnwallet/mock.go +++ b/lnwallet/mock.go @@ -201,9 +201,9 @@ func (w *mockWalletController) ListTransactionDetails(int32, int32, // LeaseOutput returns the current time and a nil error. func (w *mockWalletController) LeaseOutput(wtxmgr.LockID, wire.OutPoint, - time.Duration) (time.Time, []byte, btcutil.Amount, error) { + time.Duration) (time.Time, error) { - return time.Now(), nil, 0, nil + return time.Now(), nil } // ReleaseOutput currently does nothing. diff --git a/sweep/walletsweep.go b/sweep/walletsweep.go index 919e5f1d5..da5e56dee 100644 --- a/sweep/walletsweep.go +++ b/sweep/walletsweep.go @@ -179,7 +179,7 @@ type OutputLeaser interface { // LeaseOutput leases a target output, rendering it unusable for coin // selection. LeaseOutput(i wtxmgr.LockID, o wire.OutPoint, d time.Duration) ( - time.Time, []byte, btcutil.Amount, error) + time.Time, error) // ReleaseOutput releases a target output, allowing it to be used for // coin selection once again. @@ -284,7 +284,7 @@ func CraftSweepAllTx(feeRate, maxFeeRate chainfee.SatPerKWeight, log.Tracef("[WithCoinSelectLock] leasing utxo: %v", utxo.OutPoint) - _, _, _, err = outputLeaser.LeaseOutput( + _, err = outputLeaser.LeaseOutput( chanfunding.LndInternalLockID, utxo.OutPoint, chanfunding.DefaultLockDuration, ) diff --git a/sweep/walletsweep_test.go b/sweep/walletsweep_test.go index f5ed0283e..968d9cb4f 100644 --- a/sweep/walletsweep_test.go +++ b/sweep/walletsweep_test.go @@ -199,11 +199,11 @@ func newMockOutputLeaser() *mockOutputLeaser { } func (m *mockOutputLeaser) LeaseOutput(_ wtxmgr.LockID, o wire.OutPoint, - t time.Duration) (time.Time, []byte, btcutil.Amount, error) { + t time.Duration) (time.Time, error) { m.leasedOutputs[o] = struct{}{} - return time.Now().Add(t), nil, 0, nil + return time.Now().Add(t), nil } func (m *mockOutputLeaser) ReleaseOutput(_ wtxmgr.LockID,