From f48c4cae3784092a7015709816319f49c17ac6dc Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Mon, 13 Apr 2020 11:45:02 -0700 Subject: [PATCH] fundingmanager: check remote peer upfront shutdown support before reservation This addresses a bug in which a funding reservation wasn't cleaned up properly if the remote peer didn't support upfront shutdown. Alternatively, we could just cancel the reservation on error, but instead we move the check above so that we don't attempt coin selection in the first place. --- fundingmanager.go | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/fundingmanager.go b/fundingmanager.go index 761227c9..95e6464e 100644 --- a/fundingmanager.go +++ b/fundingmanager.go @@ -3078,6 +3078,27 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) { } } + // Check whether the peer supports upfront shutdown, and get an address + // which should be used (either a user specified address or a new + // address from the wallet if our node is configured to set shutdown + // address by default). + shutdown, err := getUpfrontShutdownScript( + msg.peer, msg.openChanReq.shutdownScript, + func() (lnwire.DeliveryAddress, error) { + addr, err := f.cfg.Wallet.NewAddress( + lnwallet.WitnessPubKey, false, + ) + if err != nil { + return nil, err + } + return txscript.PayToAddrScript(addr) + }, + ) + if err != nil { + msg.err <- err + return + } + // Initialize a funding reservation with the local wallet. If the // wallet doesn't have enough funds to commit to this channel, then the // request will fail, and be aborted. @@ -3112,24 +3133,6 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) { return } - // Check whether the peer supports upfront shutdown, and get an address which - // should be used (either a user specified address or a new address from the - // wallet if our node is configured to set shutdown address by default). - shutdown, err := getUpfrontShutdownScript( - msg.peer, msg.openChanReq.shutdownScript, - func() (lnwire.DeliveryAddress, error) { - addr, err := f.cfg.Wallet.NewAddress(lnwallet.WitnessPubKey, false) - if err != nil { - return nil, err - } - return txscript.PayToAddrScript(addr) - }, - ) - if err != nil { - msg.err <- err - return - } - // Set our upfront shutdown address in the existing reservation. reservation.SetOurUpfrontShutdown(shutdown)