From b7aebd92cf22ade5cc511dd270bff31bf6dfde28 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 18 Sep 2018 00:22:38 -0700 Subject: [PATCH] cnct/contract_resolvers: reliably publish commit sweep --- contractcourt/contract_resolvers.go | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/contractcourt/contract_resolvers.go b/contractcourt/contract_resolvers.go index 223220d6..d0d7328e 100644 --- a/contractcourt/contract_resolvers.go +++ b/contractcourt/contract_resolvers.go @@ -1258,18 +1258,33 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) { log.Infof("%T(%v): sweeping commit output with tx=%v", c, c.chanPoint, spew.Sdump(c.sweepTx)) - // Finally, we'll broadcast the sweep transaction to the - // network. - if err := c.PublishTx(c.sweepTx); err != nil { + // With the sweep transaction constructed, we'll now Checkpoint + // our state. + if err := c.Checkpoint(c); err != nil { + log.Errorf("unable to Checkpoint: %v", err) + return nil, err + } + + // With the sweep transaction checkpointed, we'll now publish + // the transaction. Upon restart, the resolver will immediately + // take the case below since the sweep tx is checkpointed. + err := c.PublishTx(c.sweepTx) + if err != nil && err != lnwallet.ErrDoubleSpend { log.Errorf("%T(%v): unable to publish sweep tx: %v", c, c.chanPoint, err) return nil, err } - // With the sweep transaction confirmed, we'll now Checkpoint - // our state. - if err := c.Checkpoint(c); err != nil { - log.Errorf("unable to Checkpoint: %v", err) + // If the sweep transaction has been generated, and the remote party + // broadcast the commit transaction, we'll republish it for reliability + // to ensure it confirms. The resolver will enter this case after + // checkpointing in the case above, ensuring we reliably on restarts. + case c.sweepTx != nil && !isLocalCommitTx: + err := c.PublishTx(c.sweepTx) + if err != nil && err != lnwallet.ErrDoubleSpend { + log.Errorf("%T(%v): unable to publish sweep tx: %v", + c, c.chanPoint, err) + return nil, err } // Otherwise, this is our commitment transaction, So we'll obtain the