-
Notifications
You must be signed in to change notification settings - Fork 2.1k
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
Add optional close address #3702
Add optional close address #3702
Conversation
Needs rebase |
30168ae
to
377e730
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Really nice PR!
chancloser.go
Outdated
// checkRemoteDeliveryAddress checks that the address provided by the remote | ||
// peer matches the upfront shutdown address, if it is set. It does not perform | ||
// any validation on the address provided. | ||
func checkRemoteDeliveryAddress(upfront, address lnwire.DeliveryAddress) error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd probably call this function sg like: Matches
and maybe move it under lnwire.DeliveryAddress
(and add a unit test). WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1 for the unit test, see comment below for context on this check :)
chancloser.go
Outdated
// any validation on the address provided. | ||
func checkRemoteDeliveryAddress(upfront, address lnwire.DeliveryAddress) error { | ||
// If an upfront shutdown address is empty, return early. | ||
if len(upfront) == 0 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this check add anything (if yes: should emptyness checked for address
)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So here we are checking whether the address our peer has provided matches the pre-negotiated upfront address. There are two cases:
- They did not negotiate an upfront address (it's an optional feature), so we do not need to enforce close out to a specific address
- They did negotiate an upfront address, and we need to check that they're sticking to it; if not, we need to disconnect as per the spec's instruction because they may be comporomised
lnwallet/reservation.go
Outdated
r.Lock() | ||
defer r.Unlock() | ||
|
||
r.ourContribution.UpfrontShutdown = shutdown |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: As a reader it's really confusing to me that sometimes it's Shutdown, sometimes ShutdownScript. I guess this is because I'm not familiar with the code base yet.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's an inconsistency on my side, trying to keep var names brief. I'll settle on one or the other,
Thanks for the review @bhandras! |
377e730
to
38acea3
Compare
Updated to address comments and rebased on #3655. |
channeldb/channel.go
Outdated
|
||
// Finally, add optional shutdown scripts for the local and remote peer if | ||
// they are present. | ||
if err := putOptionalUpfrontShutdownScript( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
After taking a closer look, it's always inside a Bolt transaction and therefore atomic.
fundingmanager.go
Outdated
if err != nil { | ||
return nil, err | ||
} | ||
return txscript.PayToAddrScript(addr) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duh :) Sorry, didn't pay attention to what txscropt.PayToAddrScript(addr) returns :)
38acea3
to
ee36c82
Compare
Rebased, but going to hold off on review for this one until parent PR is in. |
ee36c82
to
c128b6b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Only nits, other than these: LGTM 💯
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice to finally have this land! Just a few nits from me, also needs a rebase due to a proto conflict.
EDIT: I think it'd be nice to give the original author of the PR credit in the other commits as well.
e1b0b81
to
3ff4ba9
Compare
3ff4ba9
to
6b3280c
Compare
This commit is adapted from @Bluetegu's original pull request lightningnetwork#1462.
This commit is adapted from @Bluetegu's original pull request lightningnetwork#1462.
This commit is adapted from @Bluetegu's original pull request lightningnetwork#1462. This commit reads an optional address to pay funds out to from a user iniitiated close channel address. If the channel already has a shutdown script set, the request will fail if an address is provided. Otherwise, the cooperative close will pay out to the address provided.
6b3280c
to
94d3eb6
Compare
Rebased to clear proto conflicts :) |
This PR adds a
delivery_address
field to lnrpc and lncli'sCloseChannel
request which allows users to specify an address to close out to on cooperative closure of a channel. If an upfront shutdown address was set on channel open, requesting to close the channel out to a specific address will fail.This PR replaces #1462.
This PR is rebased on the open upfront shutdown PR #3655, as much of the logic is shared.
Only the last 3 commits in this PR are relevant for review.