From 8807d1d752cd393f0c93e51f11ae776d09c0f91d Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Tue, 16 Jan 2018 20:05:07 -0800 Subject: [PATCH] fundingmgr: add new function closure to send new channels to the ChainArbitrator --- discovery/gossiper.go | 10 +++++----- fundingmanager.go | 42 ++++++++++++++++++++++++++++++++++-------- fundingmanager_test.go | 7 ++++++- 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/discovery/gossiper.go b/discovery/gossiper.go index a23af244..9e59d882 100644 --- a/discovery/gossiper.go +++ b/discovery/gossiper.go @@ -996,7 +996,7 @@ func (d *AuthenticatedGossiper) networkHandler() { } } -// retransmitStaleChannels eaxmines all outgoing channels that the source node +// retransmitStaleChannels examines all outgoing channels that the source node // is known to maintain to check to see if any of them are "stale". A channel // is stale iff, the last timestamp of it's rebroadcast is older then // broadcastInterval. @@ -1012,10 +1012,10 @@ func (d *AuthenticatedGossiper) retransmitStaleChannels() error { info *channeldb.ChannelEdgeInfo, edge *channeldb.ChannelEdgePolicy) error { - // If there's no auth proof attaced to this edge, it - // means that it is a private channel not meant to be - // announced to the greater network, so avoid sending - // channel updates for this channel to not leak its + // If there's no auth proof attached to this edge, it means + // that it is a private channel not meant to be announced to + // the greater network, so avoid sending channel updates for + // this channel to not leak its // existence. if info.AuthProof == nil { log.Debugf("Skipping retransmission of channel "+ diff --git a/fundingmanager.go b/fundingmanager.go index 65f411c2..d08b8dc8 100644 --- a/fundingmanager.go +++ b/fundingmanager.go @@ -234,6 +234,14 @@ type fundingConfig struct { // in order to give us more time to claim funds in the case of a // contract breach. RequiredRemoteDelay func(btcutil.Amount) uint16 + + // ArbitrateNewChan is to be called once a new channel enters the final + // funding stage: waiting for on-chain confirmation. This method sends + // the channel to the ChainArbitrator so it can watch for any on-chain + // events related to the channel. + // + // TODO(roasbeef): pass signal as well? + ArbitrateNewChan func(*channeldb.OpenChannel) error } // fundingManager acts as an orchestrator/bridge between the wallet's @@ -1198,6 +1206,14 @@ func (f *fundingManager) handleFundingCreated(fmsg *fundingCreatedMsg) { return } + // Now that we've sent over our final signature for this channel, we'll + // send it to the ChainArbitrator so it can watch for any on-chain + // actions during this final confirmation stage. + if err := f.cfg.ArbitrateNewChan(completeChan); err != nil { + fndgLog.Error("Unable to send new ChannelPoint(%v) for "+ + "arbitration", fundingOut) + } + // Create an entry in the local discovery map so we can ensure that we // process the channel confirmation fully before we receive a funding // locked message. @@ -1328,6 +1344,17 @@ func (f *fundingManager) handleFundingSigned(fmsg *fundingSignedMsg) { return } + // Now that we have a finalized reservation for this funding flow, + // we'll send the to be active channel to the ChainArbitrator so it can + // watch for any on-chin actions before the channel has fully + // confirmed. + // + // TODO(roasbeef): ensure later it also gets new signals + if err := f.cfg.ArbitrateNewChan(completeChan); err != nil { + fndgLog.Error("Unable to send new ChannelPoint(%v) for "+ + "arbitration", fundingPoint) + } + fndgLog.Infof("Finalizing pendingID(%x) over ChannelPoint(%v), "+ "waiting for channel open on-chain", pendingChanID[:], fundingPoint) @@ -1352,7 +1379,7 @@ func (f *fundingManager) handleFundingSigned(fmsg *fundingSignedMsg) { // In case the fundingManager is stopped at some point during // the remaining part of the opening process, we must wait for - // this process to finish (either successully or with some + // this process to finish (either successfully or with some // error), before the fundingManager can be shut down. f.wg.Add(1) go func() { @@ -1374,16 +1401,14 @@ func (f *fundingManager) handleFundingSigned(fmsg *fundingSignedMsg) { } } - // Success, funding transaction was confirmed. fndgLog.Debugf("Channel with ShortChanID %v now confirmed", shortChanID.ToUint64()) // Go on adding the channel to the channel graph, and crafting // channel announcements. - - // We create the state-machine object which wraps the database state. - lnChannel, err := lnwallet.NewLightningChannel(nil, nil, f.cfg.FeeEstimator, - completeChan) + lnChannel, err := lnwallet.NewLightningChannel( + nil, nil, nil, completeChan, + ) if err != nil { fndgLog.Errorf("failed creating lnChannel: %v", err) return @@ -1628,8 +1653,9 @@ func (f *fundingManager) handleFundingConfirmation(completeChan *channeldb.OpenC shortChanID *lnwire.ShortChannelID) error { // We create the state-machine object which wraps the database state. - lnChannel, err := lnwallet.NewLightningChannel(nil, nil, f.cfg.FeeEstimator, - completeChan) + lnChannel, err := lnwallet.NewLightningChannel( + nil, nil, nil, completeChan, + ) if err != nil { return err } diff --git a/fundingmanager_test.go b/fundingmanager_test.go index d5ce818e..68a4fb0c 100644 --- a/fundingmanager_test.go +++ b/fundingmanager_test.go @@ -14,6 +14,7 @@ import ( "github.com/btcsuite/btclog" "github.com/lightningnetwork/lnd/chainntnfs" "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/contractcourt" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwire" @@ -135,6 +136,7 @@ type testNode struct { func init() { channeldb.UseLogger(btclog.Disabled) lnwallet.UseLogger(btclog.Disabled) + contractcourt.UseLogger(btclog.Disabled) fndgLog = btclog.Disabled } @@ -255,7 +257,7 @@ func createTestFundingManager(t *testing.T, privKey *btcec.PrivateKey, return lnwallet.NewLightningChannel( signer, nil, - estimator, + nil, channel) } } @@ -269,6 +271,9 @@ func createTestFundingManager(t *testing.T, privKey *btcec.PrivateKey, RequiredRemoteDelay: func(amt btcutil.Amount) uint16 { return 4 }, + ArbitrateNewChan: func(*channeldb.OpenChannel) error { + return nil + }, }) if err != nil { t.Fatalf("failed creating fundingManager: %v", err)