From e635b958a5e05320dd77c8681cb8b0752ecbb40a Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Tue, 23 May 2017 15:22:56 -0700 Subject: [PATCH] peer: consolidate sendClosingSigned into shutdown resp flow --- peer.go | 55 ++++++++++++++++++++++++++----------------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/peer.go b/peer.go index d7fe6eeb..699dd1bc 100644 --- a/peer.go +++ b/peer.go @@ -907,17 +907,40 @@ func (p *peer) handleShutdownResponse(msg *lnwire.Shutdown) []byte { return nil } + // As we just received a shutdown message, we'll also send a shutdown + // message with our desired fee so we can start the negotiation. if err := p.sendShutdown(channel); err != nil { peerLog.Errorf("error while sending shutdown message: %v", err) return nil } - // TODO(bvu): add logic to wait for HTLCs to close here. - closeSig, err := p.sendClosingSigned(channel) + // Calculate an initial proposed fee rate for the close transaction. + feeRate := p.server.feeEstimator.EstimateFeePerWeight(1) * 1000 + + // TODO(roasbeef): actually perform fee negotiation here, only send sig + // if we agree to fee + + // Once both sides agree on a fee, we'll create a signature that closes + // the channel using the agree upon fee rate. + // TODO(roasbeef): remove encoding redundancy + closeSig, proposedFee, err := channel.CreateCloseProposal(feeRate) if err != nil { - peerLog.Errorf("error generating/sending ClosingSigned: %v", err) + peerLog.Errorf("unable to create close proposal: %v", err) return nil } + parsedSig, err := btcec.ParseSignature(closeSig, btcec.S256()) + if err != nil { + peerLog.Errorf("unable to parse signature: %v", err) + return nil + } + + // With the closing signature assembled, we'll send the matching close + // signed message to the other party so they can broadcast the closing + // transaction. + closingSigned := lnwire.NewClosingSigned(msg.ChannelID, proposedFee, + parsedSig) + p.queueMsg(closingSigned, nil) + return closeSig } @@ -1216,32 +1239,6 @@ func (p *peer) sendShutdown(channel *lnwallet.LightningChannel) error { return nil } -// sendClosingSigned handles the creation and sending of proposed channel -// close transactions. -func (p *peer) sendClosingSigned(channel *lnwallet.LightningChannel) ([]byte, error) { - - // Calculate an initial proposed fee rate for the close transaction. - feeRate := p.server.feeEstimator.EstimateFeePerWeight(1) * 1000 - - // Create a proposed channel close transaction with our fee proposal. - closeSig, proposedFee, err := channel.CreateCloseProposal(feeRate) - if err != nil { - return nil, err - } - - // TODO(roasbeef): remove encoding redundancy - parsedSig, err := btcec.ParseSignature(closeSig, btcec.S256()) - if err != nil { - return nil, err - } - - chanID := lnwire.NewChanIDFromOutPoint(channel.ChannelPoint()) - closingSigned := lnwire.NewClosingSigned(chanID, proposedFee, parsedSig) - p.queueMsg(closingSigned, nil) - - return closeSig, nil -} - // wipeChannel removes the passed channel from all indexes associated with the // peer, and deletes the channel from the database. func wipeChannel(p *peer, channel *lnwallet.LightningChannel) error {