diff --git a/channeldb/channel.go b/channeldb/channel.go index 046ef8806..ad0208467 100644 --- a/channeldb/channel.go +++ b/channeldb/channel.go @@ -25,6 +25,7 @@ import ( "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/kvdb" + "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/shachain" "github.com/lightningnetwork/lnd/tlv" @@ -1690,11 +1691,11 @@ func (c *OpenChannel) isBorked(chanBucket kvdb.RBucket) (bool, error) { // republish this tx at startup to ensure propagation, and we should still // handle the case where a different tx actually hits the chain. func (c *OpenChannel) MarkCommitmentBroadcasted(closeTx *wire.MsgTx, - locallyInitiated bool) error { + closer lntypes.ChannelParty) error { return c.markBroadcasted( ChanStatusCommitBroadcasted, forceCloseTxKey, closeTx, - locallyInitiated, + closer, ) } @@ -1706,11 +1707,11 @@ func (c *OpenChannel) MarkCommitmentBroadcasted(closeTx *wire.MsgTx, // ensure propagation, and we should still handle the case where a different tx // actually hits the chain. func (c *OpenChannel) MarkCoopBroadcasted(closeTx *wire.MsgTx, - locallyInitiated bool) error { + closer lntypes.ChannelParty) error { return c.markBroadcasted( ChanStatusCoopBroadcasted, coopCloseTxKey, closeTx, - locallyInitiated, + closer, ) } @@ -1719,7 +1720,7 @@ func (c *OpenChannel) MarkCoopBroadcasted(closeTx *wire.MsgTx, // which should specify either a coop or force close. It adds a status which // indicates the party that initiated the channel close. func (c *OpenChannel) markBroadcasted(status ChannelStatus, key []byte, - closeTx *wire.MsgTx, locallyInitiated bool) error { + closeTx *wire.MsgTx, closer lntypes.ChannelParty) error { c.Lock() defer c.Unlock() @@ -1741,7 +1742,7 @@ func (c *OpenChannel) markBroadcasted(status ChannelStatus, key []byte, // Add the initiator status to the status provided. These statuses are // set in addition to the broadcast status so that we do not need to // migrate the original logic which does not store initiator. - if locallyInitiated { + if closer.IsLocal() { status |= ChanStatusLocalCloseInitiator } else { status |= ChanStatusRemoteCloseInitiator @@ -4486,6 +4487,15 @@ func NewShutdownInfo(deliveryScript lnwire.DeliveryAddress, } } +// Closer identifies the ChannelParty that initiated the coop-closure process. +func (s ShutdownInfo) Closer() lntypes.ChannelParty { + if s.LocalInitiator.Val { + return lntypes.Local + } + + return lntypes.Remote +} + // encode serialises the ShutdownInfo to the given io.Writer. func (s *ShutdownInfo) encode(w io.Writer) error { records := []tlv.Record{ diff --git a/channeldb/channel_test.go b/channeldb/channel_test.go index 981ddf688..e630b1c48 100644 --- a/channeldb/channel_test.go +++ b/channeldb/channel_test.go @@ -21,6 +21,7 @@ import ( "github.com/lightningnetwork/lnd/kvdb" "github.com/lightningnetwork/lnd/lnmock" "github.com/lightningnetwork/lnd/lntest/channels" + "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/shachain" "github.com/lightningnetwork/lnd/tlv" @@ -1084,13 +1085,17 @@ func TestFetchWaitingCloseChannels(t *testing.T) { }, ) - if err := channel.MarkCommitmentBroadcasted(closeTx, true); err != nil { + if err := channel.MarkCommitmentBroadcasted( + closeTx, lntypes.Local, + ); err != nil { t.Fatalf("unable to mark commitment broadcast: %v", err) } // Now try to marking a coop close with a nil tx. This should // succeed, but it shouldn't exit when queried. - if err = channel.MarkCoopBroadcasted(nil, true); err != nil { + if err = channel.MarkCoopBroadcasted( + nil, lntypes.Local, + ); err != nil { t.Fatalf("unable to mark nil coop broadcast: %v", err) } _, err := channel.BroadcastedCooperative() @@ -1102,7 +1107,9 @@ func TestFetchWaitingCloseChannels(t *testing.T) { // it as coop closed. Later we will test that distinct // transactions are returned for both coop and force closes. closeTx.TxIn[0].PreviousOutPoint.Index ^= 1 - if err := channel.MarkCoopBroadcasted(closeTx, true); err != nil { + if err := channel.MarkCoopBroadcasted( + closeTx, lntypes.Local, + ); err != nil { t.Fatalf("unable to mark coop broadcast: %v", err) } } @@ -1324,7 +1331,7 @@ func TestCloseInitiator(t *testing.T) { // by the local party. updateChannel: func(c *OpenChannel) error { return c.MarkCoopBroadcasted( - &wire.MsgTx{}, true, + &wire.MsgTx{}, lntypes.Local, ) }, expectedStatuses: []ChannelStatus{ @@ -1338,7 +1345,7 @@ func TestCloseInitiator(t *testing.T) { // by the remote party. updateChannel: func(c *OpenChannel) error { return c.MarkCoopBroadcasted( - &wire.MsgTx{}, false, + &wire.MsgTx{}, lntypes.Remote, ) }, expectedStatuses: []ChannelStatus{ @@ -1352,7 +1359,7 @@ func TestCloseInitiator(t *testing.T) { // local initiator. updateChannel: func(c *OpenChannel) error { return c.MarkCommitmentBroadcasted( - &wire.MsgTx{}, true, + &wire.MsgTx{}, lntypes.Local, ) }, expectedStatuses: []ChannelStatus{ diff --git a/channeldb/db_test.go b/channeldb/db_test.go index a954f2828..025bf1261 100644 --- a/channeldb/db_test.go +++ b/channeldb/db_test.go @@ -14,6 +14,7 @@ import ( "github.com/btcsuite/btcd/wire" "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/kvdb" + "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/shachain" "github.com/stretchr/testify/require" @@ -606,7 +607,9 @@ func TestFetchChannels(t *testing.T) { channelIDOption(pendingWaitingChan), ) - err = pendingClosing.MarkCoopBroadcasted(nil, true) + err = pendingClosing.MarkCoopBroadcasted( + nil, lntypes.Local, + ) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -626,7 +629,9 @@ func TestFetchChannels(t *testing.T) { channelIDOption(openWaitingChan), openChannelOption(), ) - err = openClosing.MarkCoopBroadcasted(nil, true) + err = openClosing.MarkCoopBroadcasted( + nil, lntypes.Local, + ) if err != nil { t.Fatalf("unexpected error: %v", err) } diff --git a/contractcourt/chain_arbitrator_test.go b/contractcourt/chain_arbitrator_test.go index 36f6dad18..abaca5c2b 100644 --- a/contractcourt/chain_arbitrator_test.go +++ b/contractcourt/chain_arbitrator_test.go @@ -11,6 +11,7 @@ import ( "github.com/lightningnetwork/lnd/channeldb/models" "github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/lntest/mock" + "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwallet" "github.com/stretchr/testify/require" ) @@ -61,12 +62,14 @@ func TestChainArbitratorRepublishCloses(t *testing.T) { for i := 0; i < numChans/2; i++ { closeTx := channels[i].FundingTxn.Copy() closeTx.TxIn[0].PreviousOutPoint = channels[i].FundingOutpoint - err := channels[i].MarkCommitmentBroadcasted(closeTx, true) + err := channels[i].MarkCommitmentBroadcasted( + closeTx, lntypes.Local, + ) if err != nil { t.Fatal(err) } - err = channels[i].MarkCoopBroadcasted(closeTx, true) + err = channels[i].MarkCoopBroadcasted(closeTx, lntypes.Local) if err != nil { t.Fatal(err) } diff --git a/contractcourt/channel_arbitrator.go b/contractcourt/channel_arbitrator.go index 8add61ce6..cb5cee872 100644 --- a/contractcourt/channel_arbitrator.go +++ b/contractcourt/channel_arbitrator.go @@ -129,7 +129,7 @@ type ChannelArbitratorConfig struct { // MarkCommitmentBroadcasted should mark the channel as the commitment // being broadcast, and we are waiting for the commitment to confirm. - MarkCommitmentBroadcasted func(*wire.MsgTx, bool) error + MarkCommitmentBroadcasted func(*wire.MsgTx, lntypes.ChannelParty) error // MarkChannelClosed marks the channel closed in the database, with the // passed close summary. After this method successfully returns we can @@ -1084,7 +1084,7 @@ func (c *ChannelArbitrator) stateStep( // database, such that we can re-publish later in case it // didn't propagate. We initiated the force close, so we // mark broadcast with local initiator set to true. - err = c.cfg.MarkCommitmentBroadcasted(closeTx, true) + err = c.cfg.MarkCommitmentBroadcasted(closeTx, lntypes.Local) if err != nil { log.Errorf("ChannelArbitrator(%v): unable to "+ "mark commitment broadcasted: %v", diff --git a/contractcourt/channel_arbitrator_test.go b/contractcourt/channel_arbitrator_test.go index 43238494e..916cd5f58 100644 --- a/contractcourt/channel_arbitrator_test.go +++ b/contractcourt/channel_arbitrator_test.go @@ -416,7 +416,9 @@ func createTestChannelArbitrator(t *testing.T, log ArbitratorLog, resolvedChan <- struct{}{} return nil }, - MarkCommitmentBroadcasted: func(_ *wire.MsgTx, _ bool) error { + MarkCommitmentBroadcasted: func(_ *wire.MsgTx, + _ lntypes.ChannelParty) error { + return nil }, MarkChannelClosed: func(*channeldb.ChannelCloseSummary, diff --git a/lnwallet/channel.go b/lnwallet/channel.go index abe8b6276..3e2e8cf39 100644 --- a/lnwallet/channel.go +++ b/lnwallet/channel.go @@ -8460,7 +8460,12 @@ func (lc *LightningChannel) MarkCommitmentBroadcasted(tx *wire.MsgTx, lc.Lock() defer lc.Unlock() - return lc.channelState.MarkCommitmentBroadcasted(tx, locallyInitiated) + party := lntypes.Remote + if locallyInitiated { + party = lntypes.Local + } + + return lc.channelState.MarkCommitmentBroadcasted(tx, party) } // MarkCoopBroadcasted marks the channel as a cooperative close transaction has @@ -8473,7 +8478,12 @@ func (lc *LightningChannel) MarkCoopBroadcasted(tx *wire.MsgTx, lc.Lock() defer lc.Unlock() - return lc.channelState.MarkCoopBroadcasted(tx, localInitiated) + party := lntypes.Remote + if localInitiated { + party = lntypes.Local + } + + return lc.channelState.MarkCoopBroadcasted(tx, party) } // MarkShutdownSent persists the given ShutdownInfo. The existence of the