Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

funding: decouple funding wait from fundingLocked and chanAnn #319

Merged
merged 1 commit into from Oct 27, 2017

Conversation

Crypt-iQ
Copy link
Collaborator

@Crypt-iQ Crypt-iQ commented Sep 7, 2017

This PR tackles the first step of issue #305. waitForFundingConfirmation is decoupled from the channel announcements and sendFundingLockedAndAnnounceChannel is now decoupled into sendFundingLocked and sendChannelAnnouncement.

A future PR will handle:

  1. Waiting for 6 confirmations before channel announcement in sendChannelAnnouncement.
  2. Adding the channel to the channel graph immediately after sending the FundingLocked message.

@mention-bot
Copy link

@Crypt-iQ, thanks for your PR! By analyzing the history of the files in this pull request, we identified @Roasbeef, @bryanvu and @AndrewSamokhvalov to be potential reviewers.

Copy link
Contributor

@halseth halseth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for working on this! The funding flow code definitely needs some refactoring 😆 I'll try to answer the questions you have 😄

  1. See comments inline, I think this is close to what we want, but it should also be decoupled from waitForFundingWithTimeout.

  2. The spec says that

If sent, announcement_signatures messages MUST NOT be sent until [...] the funding transaction is has at least 6 confirmations.

So I believe in this case we should actually wait for at least six confirmations.

Looking at *fundingConfig.NumRequiredConfs I think this is meant as a method to determine our preferred minimum_depth for the accept_channel message:
https://github.com/lightningnetwork/lightning-rfc/blob/master/02-peer-protocol.md#the-accept_channel-message.
This basically determine how many blocks we want the funding confirmation to have before we send funding_locked. This is different from the announcement message minimum confirmations:
https://github.com/lightningnetwork/lightning-rfc/blob/master/07-routing-gossip.md#the-announcement_signatures-message, but as you can see it also requires the funding_locked to have been sent, meaning it will indirectly require max(numConfs, 6) confirmations.

// Successfully received confirmation details
// from waitForFundingConfirmation. Now we
// we wait to receive from doneChan.
case <-doneChan:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't need two channels here, the confirmChan should be enough.

// The funding tx has the correct number of confirmations,
// so we can now broadcast the channel announcement messages
// to the greater network.
f.announceChannelAfterConfirmations(completeChan, confDetails)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be done outside waitForFundingWithTimeout

// Finally, the fundingLocked message is sent to the peer and the channel is announced
// to the greater network. This method should be called only after waitForFundingConfirmation
// completes successfully.
func (f *fundingManager) announceChannelAfterConfirmations(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before announcing the channel, this method marks the channel opened in the db, and sends the fundingLocked message to the peer, so I think the name is a bit misleading. Maybe something like processConfirmedFunding could be more telling?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, I actually had trouble coming up with a name for this...

@Crypt-iQ
Copy link
Collaborator Author

Crypt-iQ commented Sep 7, 2017

Thanks for the comments, especially re: confirmations stuff. I was a bit confused by the mention of confirmations for different messages, but I get it now. I'm going to rework it and update the PR today most likely.

Copy link
Contributor

@halseth halseth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, getting very close I think! 💯

The 6 confirmations check should be done here: https://github.com/lightningnetwork/lnd/pull/319/files#diff-691ca64693e704fd2e5080998f3e640eR1457

I think it should also be fairly easy to add a test for this to fundingmanager_test.go

// Success, funding transaction was confirmed.
case err = <-errChan:
// Encountered an error
fndgLog.Errorf("Encountered an error")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

log the actual error

case <-doneChan:
case err := <-errChan:
// Encountered an error
fndgLog.Errorf("Encountered an error: %v", err)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better text here is "error waiting for funding transaction to confirm: %v"

// Success, funding transaction was confirmed.
f.deleteReservationCtx(peerKey,
fmsg.msg.PendingChannelID)
// Now we can call processConfirmedFunding
f.processConfirmedFunding(completeChan, confDetails)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this must be done before the reservation context is deleted, to keep the original behavior.

}()

select {
case <-f.quit:
return
case <-doneChan:
case err := <-errChan:
fndgLog.Errorf("Encountered an error: %v", err)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

@@ -1200,32 +1222,35 @@ func (f *fundingManager) handleFundingSigned(fmsg *fundingSignedMsg) {
// passed from bestHeight. In the case of timeout, the timeoutChan will be
// closed. In case of confirmation or error, doneChan will be closed.
func (f *fundingManager) waitForFundingWithTimeout(completeChan *channeldb.OpenChannel,
doneChan chan<- struct{}, timeoutChan chan<- struct{}) {
errChan chan<- error, timeoutChan chan<- struct{},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe have the channels in this order: confirmChan, timeoutChan, errChan? :)

cancelChan <-chan struct{}, doneChan chan<- struct{}) {

defer close(doneChan)
cancelChan <-chan struct{}, errChan chan<- error,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

order: cancelChan, confirmChan, errChan


// Register with the ChainNotifier for a notification once the funding
// transaction reaches `numConfs` confirmations.
txid := completeChan.FundingOutpoint.Hash
numConfs := uint32(completeChan.NumConfsRequired)
if (numConfs < 6) {
numConfs = 6
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be wrong. This will prevent the fundingLocked being sent with < 6 confirmations, which is not what we want. This check should be done after fundingLocked is sent.

@@ -1310,6 +1344,20 @@ func (f *fundingManager) waitForFundingConfirmation(completeChan *channeldb.Open
return
}

// Send confirmation details to confirmChan for use in processConfirmedFunding
confirmChan <- confDetails
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

move this together with the !ok check inside the select

@Crypt-iQ
Copy link
Collaborator Author

Crypt-iQ commented Sep 8, 2017

I believe that I have successfully decoupled waitForFundingConfirmation from the channel announcement. Adding the channel to the ChannelRouter immediately after the fundingLocked message has been sent is still TODO.

I still have some concerns:

  1. Do I need to wait for 6 confirmations here before sendChannelAnnouncement is called?

  2. As I was testing my new code with the TestFundingManagerNormalWorkflow test in fundingmanager_test.go, it did not pass successfully. It was not until I duplicated lines 531 & 532, and adjusted mockNotifier.confChannel to have a capacity of 2 that the test passed. Looking here, I noticed that the tuple (txid, numConfs) had to be identical for it to be dispatched to ALL clients. However, I tried setting numConfs in waitForFundingConfirmation to 6, but this still resulted in failure.

@Crypt-iQ
Copy link
Collaborator Author

My recent changes also include the first steps to a fix for issue #306. I added ChannelFlags to the OpenChannel struct and have specific methods for putting, fetching, & deleting ChannelFlags in channel.go.

@Crypt-iQ
Copy link
Collaborator Author

Crypt-iQ commented Sep 10, 2017

I have several TODOs left such as a command-line option for channelFlags / "stealth channel", and handling confirmations here.

Additionally in this latest commit 5d6498a, issue #306 should be completed.

@Crypt-iQ
Copy link
Collaborator Author

Crypt-iQ commented Sep 12, 2017

I added a --stealth option which sets the LSB of channel_flags to 0 if the option is included.
I also handled confirmations here.

My main obstacle that I must tackle before this is completed is that to have a functional channel graph where users can send payments to one another, both edges in a channel must be defined. Channels are bidirectional. It is trivial to send OUR data (ChannelEdgeInfo & ChannelEdgePolicy) to the ChannelRouter before any announcements are made. However, it is not trivial to send our peer's ChannelEdgePolicy to the ChannelRouter before announcements happen. Is some sort of exchange of ChannelEdgePolicys made at the TODO here?

Additionally, what channel info is added in the case of ChannelFlags LSB being set to 0 and when it's set to 1? Do we need to add our peer's ChannelEdgePolicy when the LSB is 1 (since it will get added anyways during the announcement phase... I'm thinking yes)? In the case of the LSB being 0, I'm thinking that ChannelEdgeInfo, ChannelEdgePolicy, our peer's ChannelEdgePolicy must all be added at that TODO.

@Crypt-iQ
Copy link
Collaborator Author

@halseth suggested splitting this PR into multiple PRs. The current PR now only contains the decoupling of sending the fundingLocked message and the sending of the channel announcement from waitForFundingConfirmation.

Copy link
Contributor

@halseth halseth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Only stylistic nits from me at this point.

Please also update the PR description to what parts of the issue this currently is handling, and what will be done in a follow-up PR.

Also, if you take a look at the contribution guidelines and earlier commits, you can see how commit messages should be formatted. Thanks!

}
defer lnChannel.Stop()

if err = f.sendFundingLocked(ch, lnChannel,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might fit on one line if you do

err = f.sendFundingLocked( ...
if err != nil {
...

"fundingLocked: %v", err)
return
}
if err = f.sendChannelAnnouncement(ch, lnChannel,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

}
defer lnChannel.Stop()

if err = f.sendFundingLocked(channel, lnChannel,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

"fundingLocked: %v", err)
return
}
if err = f.sendChannelAnnouncement(channel,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

f.sendFundingLockedAndAnnounceChannel(channel,
shortChanID)

// With the channel marked open, we'll create
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

probably redundant comment

fndgLog.Errorf("Failed to send fundingLocked: %v", err)
return
}
if err = f.sendChannelAnnouncement(completeChan,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

}
defer lnChannel.Stop()

if err = f.sendFundingLocked(completeChan, lnChannel,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

@@ -1230,21 +1342,21 @@ func (f *fundingManager) handleFundingSigned(fmsg *fundingSignedMsg) {
// waitForFundingWithTimeout is a wrapper around waitForFundingConfirmation that
// will cancel the wait for confirmation if maxWaitNumBlocksFundingConf has
// passed from bestHeight. In the case of timeout, the timeoutChan will be
// closed. In case of confirmation or error, doneChan will be closed.
// closed. In case of confirmation or error, confChan will be closed.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

update comment to reflect the returned value on success

@@ -1297,9 +1414,9 @@ func (f *fundingManager) waitForFundingWithTimeout(completeChan *channeldb.OpenC
// when a channel has become active for lightning transactions.
// The wait can be canceled by closing the cancelChan.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add confChan to comment

@@ -2105,4 +2211,4 @@ func (f *fundingManager) deleteChannelOpeningState(chanPoint *wire.OutPoint) err
}
return nil
})
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add back newline

@Crypt-iQ Crypt-iQ force-pushed the blockBasedGracePeriod branch 2 times, most recently from 38331d4 to e004e10 Compare September 13, 2017 15:29
@Crypt-iQ Crypt-iQ changed the title Decoupled waitForFundingConfirmation with channel announcement funding: decouple funding wait from fundingLocked and chanAnn Sep 13, 2017
Copy link
Contributor

@halseth halseth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM now 👍

case <-doneChan:
case shortChanID, ok := <-confChan:
if !ok {
fndgLog.Errorf("confChan was closed")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

better error message here

Copy link
Contributor

@halseth halseth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed that the build is failing. Looks like you must run gofmt -s on the changed files.

close(doneChan)
case shortChanID, ok := <-waitingConfChan:
if !ok {
fndgLog.Errorf("waiting for funding confirmation" +
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is getting logged twice, both here and in Start. I would drop this log line and just close & return here.

// With the channel marked open, we'll create the
// state-machine object which wraps the database
// state.
lnChannel, err := lnwallet.NewLightningChannel(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know this is only part 1 of a two-part change, but this chunk of code is now repeated 4 times. I think it makes more sense to keep it in its own method for now, and the method name sendFundingLockedAndAnnounceChannel is still appropriate.

Copy link
Collaborator Author

@Crypt-iQ Crypt-iQ Sep 17, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with all of the suggested changes besides sendFundingLockedAndAnnounceChannel because my later PR will have complicated logic that is better off from having them decoupled. There is a branch of code which ONLY sends the announcement, but not the funding locked message (this code branch needs to add the channel to the channel graph before announcement). The issue says to include adding to the channel router graph immediately after
sending the funding locked message. I think the code is cleaner having sendFundingLocked, sendChannelAnnouncement, & addToRouterGraph as separate functions.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not suggesting you remove the sendFundingLocked, sendChannelAnnouncement, and addToRouterGraph methods, I'm just suggesting you add another method sendFundingLockedAndAnnounceChannel (or handleFundingConfirmation), that calls those methods in the right order. I read over #332, and it appears the duplicated code exists there as well with no differences between the 4 occurrences.

Copy link
Collaborator Author

@Crypt-iQ Crypt-iQ Sep 17, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah gotcha. #332 is still dependent on this, so it very well could change - it's more of a placeholder PR at this point.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like handleFundingConfirmation :)

@@ -1463,7 +1579,7 @@ func (f *fundingManager) sendChannelAnnouncement(completeChan *channeldb.OpenCha
*shortChanID, chanID)
if err != nil {
fndgLog.Errorf("channel announcement failed: %v", err)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error gets logged twice, both here and where the returned error value is handled. I'll let someone more familiar with this project's style weigh in, but if the error gets returned, I don't think it's appropriate to log here. There are more instances in this method and in sendFundingLocked.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the best way to handle this is to return a new error that combines the two:
return fmt.Errorf("channel announcement failed: %v", err)

Copy link
Contributor

@halseth halseth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few comments on line length and returned errors, otherwise very good :)

// wait for funding transaction on startup.
case shortChanID, ok := <-confChan:
if !ok {
fndgLog.Errorf("waiting for funding confirmation failed")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line looks a bit long. We try to keep a 80 character line length width 8 width tabs.


// Call the function that handles funding
// confirmation.
err := f.handleFundingConfirmation(completeChan, shortChanID)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

probably a bit long

case <-doneChan:
case shortChanID, ok := <-confChan:
if !ok {
fndgLog.Errorf("waiting for funding confirmation failed")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

long line


// Call the function that handles funding
// confirmation.
err := f.handleFundingConfirmation(completeChan, shortChanID)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

long

@@ -455,11 +476,17 @@ func (f *fundingManager) Start() error {
if err != nil {
fndgLog.Errorf("error creating "+
"lightning channel: %v", err)
return
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch!

@@ -1188,8 +1228,10 @@ func (f *fundingManager) handleFundingSigned(fmsg *fundingSignedMsg) {
},
}

f.wg.Add(1)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, this had to be added to make sure the goroutine was properly shutdown between tests.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💯

func (f *fundingManager) sendFundingLockedAndAnnounceChannel(
completeChan *channeldb.OpenChannel, shortChanID *lnwire.ShortChannelID) {
// handleFundingConfirmation is a wrapper method for creating a new lightning
// channel, calling sendFundingLocked, and for calling sendChannelAnnouncement.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lightning channel ->LightningChannel

completeChan *channeldb.OpenChannel, shortChanID *lnwire.ShortChannelID) {
// handleFundingConfirmation is a wrapper method for creating a new lightning
// channel, calling sendFundingLocked, and for calling sendChannelAnnouncement.
// This is called when the funding transaction is first confirmed and the channel
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... called after the funding...

@@ -1416,14 +1493,14 @@ func (f *fundingManager) sendFundingLockedAndAnnounceChannel(
nextRevocation, err := channel.NextRevocationKey()
if err != nil {
fndgLog.Errorf("unable to create next revocation: %v", err)
return
return err
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do return fmt.Errorf("unable to create next revocation: %v", err) here and other places in this method

@@ -1474,7 +1550,7 @@ func (f *fundingManager) sendChannelAnnouncement(completeChan *channeldb.OpenCha
err = f.deleteChannelOpeningState(&completeChan.FundingOutpoint)
if err != nil {
fndgLog.Errorf("error deleting channel state: %v", err)
return
return err
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same in this method

// Success, funding transaction was confirmed.

// Call the function that handles funding
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment is not necessary IMO. The next line is pretty clear.

Copy link
Contributor

@halseth halseth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix the last comments, rebase and squash and it LGTM! 🌔

f.deleteReservationCtx(peerKey,
fmsg.msg.PendingChannelID)

// Call the function that handles funding
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

comment can also be removed, as discussed earlier.

}

// Call the function that handles funding
// confirmation.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use
// Success, funding transaction was confirmed.

close(doneChan)
case shortChanID, ok := <-waitingConfChan:
if !ok {
close(confChan)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add comment
// Failed waiting for confirmation, close confChan to indicate failure.

if err != nil {
fndgLog.Errorf("error creating new lightning channel: %v", err)
return
return err
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fmt.Errorf("failed sending fundingLocked: %v", err)

defer channel.Stop()
err = f.sendChannelAnnouncement(completeChan, lnChannel, shortChanID)
if err != nil {
return err
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fmt.Errorf("failed sending channel announcement: %v", err)

@Crypt-iQ Crypt-iQ force-pushed the blockBasedGracePeriod branch 2 times, most recently from 58d0532 to 9f5d54f Compare September 17, 2017 19:37

chanID := lnwire.NewChanIDFromOutPoint(&completeChan.FundingOutpoint)
// We create the state-machine object which wraps the database state
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: missing a period at the end of the sentence.

// Now that the funding transaction has the required number of
// confirmations, we send the fundingLocked message to the peer.
f.sendFundingLockedAndAnnounceChannel(completeChan, &shortChanID)
confChan <- &shortChanID
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In order to avoid possible future deadlocks on shutdown, this should be converted to instead be a conditional send:

select {
   case confChan <- &shortChanID:
   case <-f.quit:
        return
}

close(confChan)
return
}
confChan <- shortChanID
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In order to avoid possible future deadlocks on shutdown, this should be converted to instead be a conditional send:

select {
   case confChan <- shortChanID:
   case <-f.quit:
        return
}

@jimpo
Copy link
Contributor

jimpo commented Sep 21, 2017

fad92ce is a merge. I think it might be preferred to rebase onto master instead (https://github.com/lightningnetwork/lnd/blob/master/docs/code_contribution_guidelines.md#53-acceptance).

@Crypt-iQ Crypt-iQ force-pushed the blockBasedGracePeriod branch 2 times, most recently from 6fb2446 to bb2cbfe Compare September 23, 2017 22:07
This commit decouples the wait for funding transaction confirmations
in the waitForFundingConfirmation function from the announcement of
the channel in the sendFundingLockedAndAnnounceChannel function.
Additionally, the sendFundingLockedAndAnnounceChannel function is
now decoupled into the sendFundingLocked and sendChannelAnnouncement
functions. There is also now a helper function that houses creation
of a lnwire.LightningChannel object, calls to both sendFundingLocked
and sendChannelAnnouncement.
Copy link
Member

@Roasbeef Roasbeef left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 💫

@Roasbeef Roasbeef merged commit 9c0c889 into lightningnetwork:master Oct 27, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants