contractcourt: only look for local force close for non-recovered channel

In this commit, we modify the main `closeObserver` dispatch loop to only
look for the local force close if we didn't recover the channel. We do
this, as for a recovered channel, it isn't possible for us to force
close from a recovered channel.
This commit is contained in:
Olaoluwa Osuntokun 2019-03-10 17:05:00 -07:00
parent b491488c6f
commit c722f2c064
No known key found for this signature in database
GPG Key ID: CE58F7F8E20FD9A2
2 changed files with 28 additions and 15 deletions

@ -320,22 +320,35 @@ func (c *chainWatcher) closeObserver(spendNtfn *chainntnfs.SpendEvent) {
return return
} }
// If this is our commitment transaction, then we can // If this channel has been recovered, then we'll modify our
// exit here as we don't have any further processing we // behavior as it isn't possible for us to close out the
// need to do (we can't cheat ourselves :p). // channel off-chain ourselves. It can only be the remote party
commitmentHash := localCommit.CommitTx.TxHash() // force closing, or a cooperative closure we signed off on
isOurCommitment := commitSpend.SpenderTxHash.IsEqual( // before losing data getting confirmed in the chain.
&commitmentHash, isRecoveredChan := c.cfg.chanState.HasChanStatus(
channeldb.ChanStatusRestored,
) )
if isOurCommitment {
if err := c.dispatchLocalForceClose( // If we're not recovering this channel, and this is our
commitSpend, *localCommit, // commitment transaction, then we can exit here as we don't
); err != nil { // have any further processing we need to do (we can't cheat
log.Errorf("unable to handle local"+ // ourselves :p).
"close for chan_point=%v: %v", if !isRecoveredChan {
c.cfg.chanState.FundingOutpoint, err) commitmentHash := localCommit.CommitTx.TxHash()
isOurCommitment := commitSpend.SpenderTxHash.IsEqual(
&commitmentHash,
)
if isOurCommitment {
if err := c.dispatchLocalForceClose(
commitSpend, *localCommit,
); err != nil {
log.Errorf("unable to handle local"+
"close for chan_point=%v: %v",
c.cfg.chanState.FundingOutpoint, err)
}
return
} }
return
} }
// Next, we'll check to see if this is a cooperative channel // Next, we'll check to see if this is a cooperative channel

@ -3504,7 +3504,7 @@ func (lc *LightningChannel) ProcessChanSyncMsg(
// Alternatively, if their height is two beyond what we know their best // Alternatively, if their height is two beyond what we know their best
// height to be, then they're holding onto two commitments, and the // height to be, then they're holding onto two commitments, and the
// highest unrevoked point it their next revocation. // highest unrevoked point is their next revocation.
// //
// TODO(roasbeef): verify this in the spec... // TODO(roasbeef): verify this in the spec...
case msg.NextLocalCommitHeight == remoteTailHeight+2: case msg.NextLocalCommitHeight == remoteTailHeight+2: