option_data_loss_protect: concretely define my_current_per_commitment_point - #550

Merged
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point
Aug 9, 2019
Merged

option_data_loss_protect: concretely define my_current_per_commitment_point#550
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point

Conversation

@niftynei

Copy link
Copy Markdown
Collaborator

Make it more obvious what the expected value of my_current_per_commitment_point is.

cdecker
cdecker approved these changes Jan 21, 2019
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

@Roasbeef did you want to add some clarification to this?

Comment thread02-peer-protocol.md
- MUST set `next_remote_revocation_number` to the commitment number of the
next `revoke_and_ack` message it expects to receive.
- if it supports `option_data_loss_protect`:
- MUST set `my_current_per_commitment_point` to its commitment point for

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I think this would be more clear as:

to its current unrevoked commitment point (sent in the last revoke_and_ack message) used by its channel peer to create the last commitment it received from them

As this is the point that the party who lost data will need to use once the surviving party broadcasts their commitment on chain. In our codebase, we call it LocalUnrevokedCommitPoint for this reason. Main thing that IMO makes it easier to grasp is that this is the current unrevoked point for that party.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

How about we append:

(the commitment_point corresponding to the commitment transaction the sender would use to unilaterally close)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

amended to include clarification about being commitment transaction sender would use to unilaterally close

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

commitment transaction sender would use to unilaterally close

Still seems like this is ambiguous when we have two unrevoked commitments. IINM, LND and CL will play different commitments when force closing in this scenario

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

i'm being a bit dense, but can you elaborate on the scenario where you'd have two unrevoked commitments?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since A committed to 1, it's safe for B to consider it's at state 1

The HTLC sent to B isn't fully locked in at this point, it shouldn't be forwarded until B commits to state 1 and A sends a revocation for state 0 to B. The new HTLC is in sort of a limbo state until the full dance is completed.

and it's economically more viable because B received one more HTLC (compared to 0).

It could also be a settle/fail, in which case state 1 has one fewer HTLCs.

I could be wrong, but wouldn't it be more fair and economically interesting to take the highest?

Idk if there's an objective answer to this question. When there are multiple unrevoked commitments, which one is more economically viable depends on the state of the commitments and how the differing states impact the party that holds them.

Game theory would say B should play whichever nets them the most money.

If HTLCs are only added between 0 and 1 and:

  • B is certain they won't learn the preimage (bc it was never locked in and couldn't forward it, or it was a probe to an exit hop), there's no reason to manifest that HTLC on chain. Commitment 0 in that case has fewer HTLCs and so we burn less to fees
  • B already knows the preimage to the new HTLC (if they're the exit hop), then they should play 1 because they can pull that money (assuming it nets more than the fees to add it). Otherwise they should play 0 and take the loss

All of this is dependent on whether A or B funded the channel, since the initiator will pay the fees. It becomes more complex if there are both additions and removals, and whether the removals are settles or fails.

Anyway, don't wanna get too far away from the conversation at hand. The question we need to answer is: should the act of receiving a commitment inherently revoke your prior, or is it the act of the receiver persisting the revocation locally. If we go with the latter, at least it is consistent whether or not saving the commitment and revoking the prior are implemented atomically. Thoughts?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Got it, it's indeed hard to decide whether it's more interesting for B to be at state 0 or 1, it depends on too many factors.

I'm not 100% sure what Eclair does in that case, I'll let @pm47 correct me if I'm wrong, but I think that we choose state 1. Alice committed to it, so if we want to play nice we should resume the dance here and send our revoke_and_ack.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Eclair would send state 1. The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed). But aren't we all doing that?

In short I agree with @Roasbeef, we should send the latest unrevoked commitment point.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed).

This is also how lnd handles the transition.

I wonder if something here could explain the dlp errors we’ve been seeing?

This comment was marked as abuse.

@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from d019238 to cd2a016CompareFebruary 4, 2019 23:07
@cdecker

Copy link
Copy Markdown
Collaborator

ACK cd2a016

@rustyrussellrustyrussell added the Meeting Discussion Raise at next meeting label Jul 8, 2019
@niftyneiniftynei removed the Meeting Discussion Raise at next meeting label Jul 22, 2019
@t-bastt-bast added the Meeting Discussion Raise at next meeting label Aug 5, 2019
`my_current_per_commitment_point`
Make it more obvious what the expected value of
`my_current_per_commitment_point` is.
@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from cd2a016 to fd191faCompareAugust 9, 2019 17:23
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

merging as per action item at last spec meeting

@niftynei
niftynei merged commit 300f7a6 into lightning:masterAug 9, 2019
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 6, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 9, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Meeting DiscussionRaise at next meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@niftynei@cdecker@rustyrussell@Roasbeef@cfromknecht@pm47@ariard@t-bast
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

option_data_loss_protect: concretely define my_current_per_commitment_point - #550

Merged
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point
Aug 9, 2019
Merged

option_data_loss_protect: concretely define my_current_per_commitment_point#550
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point

Conversation

@niftynei

Copy link
Copy Markdown
Collaborator

Make it more obvious what the expected value of my_current_per_commitment_point is.

cdecker
cdecker approved these changes Jan 21, 2019
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

@Roasbeef did you want to add some clarification to this?

Comment thread02-peer-protocol.md
- MUST set `next_remote_revocation_number` to the commitment number of the
next `revoke_and_ack` message it expects to receive.
- if it supports `option_data_loss_protect`:
- MUST set `my_current_per_commitment_point` to its commitment point for

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I think this would be more clear as:

to its current unrevoked commitment point (sent in the last revoke_and_ack message) used by its channel peer to create the last commitment it received from them

As this is the point that the party who lost data will need to use once the surviving party broadcasts their commitment on chain. In our codebase, we call it LocalUnrevokedCommitPoint for this reason. Main thing that IMO makes it easier to grasp is that this is the current unrevoked point for that party.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

How about we append:

(the commitment_point corresponding to the commitment transaction the sender would use to unilaterally close)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

amended to include clarification about being commitment transaction sender would use to unilaterally close

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

commitment transaction sender would use to unilaterally close

Still seems like this is ambiguous when we have two unrevoked commitments. IINM, LND and CL will play different commitments when force closing in this scenario

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

i'm being a bit dense, but can you elaborate on the scenario where you'd have two unrevoked commitments?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since A committed to 1, it's safe for B to consider it's at state 1

The HTLC sent to B isn't fully locked in at this point, it shouldn't be forwarded until B commits to state 1 and A sends a revocation for state 0 to B. The new HTLC is in sort of a limbo state until the full dance is completed.

and it's economically more viable because B received one more HTLC (compared to 0).

It could also be a settle/fail, in which case state 1 has one fewer HTLCs.

I could be wrong, but wouldn't it be more fair and economically interesting to take the highest?

Idk if there's an objective answer to this question. When there are multiple unrevoked commitments, which one is more economically viable depends on the state of the commitments and how the differing states impact the party that holds them.

Game theory would say B should play whichever nets them the most money.

If HTLCs are only added between 0 and 1 and:

  • B is certain they won't learn the preimage (bc it was never locked in and couldn't forward it, or it was a probe to an exit hop), there's no reason to manifest that HTLC on chain. Commitment 0 in that case has fewer HTLCs and so we burn less to fees
  • B already knows the preimage to the new HTLC (if they're the exit hop), then they should play 1 because they can pull that money (assuming it nets more than the fees to add it). Otherwise they should play 0 and take the loss

All of this is dependent on whether A or B funded the channel, since the initiator will pay the fees. It becomes more complex if there are both additions and removals, and whether the removals are settles or fails.

Anyway, don't wanna get too far away from the conversation at hand. The question we need to answer is: should the act of receiving a commitment inherently revoke your prior, or is it the act of the receiver persisting the revocation locally. If we go with the latter, at least it is consistent whether or not saving the commitment and revoking the prior are implemented atomically. Thoughts?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Got it, it's indeed hard to decide whether it's more interesting for B to be at state 0 or 1, it depends on too many factors.

I'm not 100% sure what Eclair does in that case, I'll let @pm47 correct me if I'm wrong, but I think that we choose state 1. Alice committed to it, so if we want to play nice we should resume the dance here and send our revoke_and_ack.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Eclair would send state 1. The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed). But aren't we all doing that?

In short I agree with @Roasbeef, we should send the latest unrevoked commitment point.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed).

This is also how lnd handles the transition.

I wonder if something here could explain the dlp errors we’ve been seeing?

This comment was marked as abuse.

@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from d019238 to cd2a016CompareFebruary 4, 2019 23:07
@cdecker

Copy link
Copy Markdown
Collaborator

ACK cd2a016

@rustyrussellrustyrussell added the Meeting Discussion Raise at next meeting label Jul 8, 2019
@niftyneiniftynei removed the Meeting Discussion Raise at next meeting label Jul 22, 2019
@t-bastt-bast added the Meeting Discussion Raise at next meeting label Aug 5, 2019
`my_current_per_commitment_point`
Make it more obvious what the expected value of
`my_current_per_commitment_point` is.
@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from cd2a016 to fd191faCompareAugust 9, 2019 17:23
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

merging as per action item at last spec meeting

@niftynei
niftynei merged commit 300f7a6 into lightning:masterAug 9, 2019
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 6, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 9, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Meeting DiscussionRaise at next meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@niftynei@cdecker@rustyrussell@Roasbeef@cfromknecht@pm47@ariard@t-bast
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

option_data_loss_protect: concretely define my_current_per_commitment_point - #550

Merged
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point
Aug 9, 2019
Merged

option_data_loss_protect: concretely define my_current_per_commitment_point#550
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point

Conversation

@niftynei

Copy link
Copy Markdown
Collaborator

Make it more obvious what the expected value of my_current_per_commitment_point is.

cdecker
cdecker approved these changes Jan 21, 2019
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

@Roasbeef did you want to add some clarification to this?

Comment thread02-peer-protocol.md
- MUST set `next_remote_revocation_number` to the commitment number of the
next `revoke_and_ack` message it expects to receive.
- if it supports `option_data_loss_protect`:
- MUST set `my_current_per_commitment_point` to its commitment point for

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I think this would be more clear as:

to its current unrevoked commitment point (sent in the last revoke_and_ack message) used by its channel peer to create the last commitment it received from them

As this is the point that the party who lost data will need to use once the surviving party broadcasts their commitment on chain. In our codebase, we call it LocalUnrevokedCommitPoint for this reason. Main thing that IMO makes it easier to grasp is that this is the current unrevoked point for that party.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

How about we append:

(the commitment_point corresponding to the commitment transaction the sender would use to unilaterally close)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

amended to include clarification about being commitment transaction sender would use to unilaterally close

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

commitment transaction sender would use to unilaterally close

Still seems like this is ambiguous when we have two unrevoked commitments. IINM, LND and CL will play different commitments when force closing in this scenario

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

i'm being a bit dense, but can you elaborate on the scenario where you'd have two unrevoked commitments?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since A committed to 1, it's safe for B to consider it's at state 1

The HTLC sent to B isn't fully locked in at this point, it shouldn't be forwarded until B commits to state 1 and A sends a revocation for state 0 to B. The new HTLC is in sort of a limbo state until the full dance is completed.

and it's economically more viable because B received one more HTLC (compared to 0).

It could also be a settle/fail, in which case state 1 has one fewer HTLCs.

I could be wrong, but wouldn't it be more fair and economically interesting to take the highest?

Idk if there's an objective answer to this question. When there are multiple unrevoked commitments, which one is more economically viable depends on the state of the commitments and how the differing states impact the party that holds them.

Game theory would say B should play whichever nets them the most money.

If HTLCs are only added between 0 and 1 and:

  • B is certain they won't learn the preimage (bc it was never locked in and couldn't forward it, or it was a probe to an exit hop), there's no reason to manifest that HTLC on chain. Commitment 0 in that case has fewer HTLCs and so we burn less to fees
  • B already knows the preimage to the new HTLC (if they're the exit hop), then they should play 1 because they can pull that money (assuming it nets more than the fees to add it). Otherwise they should play 0 and take the loss

All of this is dependent on whether A or B funded the channel, since the initiator will pay the fees. It becomes more complex if there are both additions and removals, and whether the removals are settles or fails.

Anyway, don't wanna get too far away from the conversation at hand. The question we need to answer is: should the act of receiving a commitment inherently revoke your prior, or is it the act of the receiver persisting the revocation locally. If we go with the latter, at least it is consistent whether or not saving the commitment and revoking the prior are implemented atomically. Thoughts?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Got it, it's indeed hard to decide whether it's more interesting for B to be at state 0 or 1, it depends on too many factors.

I'm not 100% sure what Eclair does in that case, I'll let @pm47 correct me if I'm wrong, but I think that we choose state 1. Alice committed to it, so if we want to play nice we should resume the dance here and send our revoke_and_ack.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Eclair would send state 1. The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed). But aren't we all doing that?

In short I agree with @Roasbeef, we should send the latest unrevoked commitment point.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed).

This is also how lnd handles the transition.

I wonder if something here could explain the dlp errors we’ve been seeing?

This comment was marked as abuse.

@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from d019238 to cd2a016CompareFebruary 4, 2019 23:07
@cdecker

Copy link
Copy Markdown
Collaborator

ACK cd2a016

@rustyrussellrustyrussell added the Meeting Discussion Raise at next meeting label Jul 8, 2019
@niftyneiniftynei removed the Meeting Discussion Raise at next meeting label Jul 22, 2019
@t-bastt-bast added the Meeting Discussion Raise at next meeting label Aug 5, 2019
`my_current_per_commitment_point`
Make it more obvious what the expected value of
`my_current_per_commitment_point` is.
@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from cd2a016 to fd191faCompareAugust 9, 2019 17:23
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

merging as per action item at last spec meeting

@niftynei
niftynei merged commit 300f7a6 into lightning:masterAug 9, 2019
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 6, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 9, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Meeting DiscussionRaise at next meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@niftynei@cdecker@rustyrussell@Roasbeef@cfromknecht@pm47@ariard@t-bast
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

option_data_loss_protect: concretely define my_current_per_commitment_point - #550

Merged
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point
Aug 9, 2019
Merged

option_data_loss_protect: concretely define my_current_per_commitment_point#550
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point

Conversation

@niftynei

Copy link
Copy Markdown
Collaborator

Make it more obvious what the expected value of my_current_per_commitment_point is.

cdecker
cdecker approved these changes Jan 21, 2019
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

@Roasbeef did you want to add some clarification to this?

Comment thread02-peer-protocol.md
- MUST set `next_remote_revocation_number` to the commitment number of the
next `revoke_and_ack` message it expects to receive.
- if it supports `option_data_loss_protect`:
- MUST set `my_current_per_commitment_point` to its commitment point for

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I think this would be more clear as:

to its current unrevoked commitment point (sent in the last revoke_and_ack message) used by its channel peer to create the last commitment it received from them

As this is the point that the party who lost data will need to use once the surviving party broadcasts their commitment on chain. In our codebase, we call it LocalUnrevokedCommitPoint for this reason. Main thing that IMO makes it easier to grasp is that this is the current unrevoked point for that party.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

How about we append:

(the commitment_point corresponding to the commitment transaction the sender would use to unilaterally close)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

amended to include clarification about being commitment transaction sender would use to unilaterally close

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

commitment transaction sender would use to unilaterally close

Still seems like this is ambiguous when we have two unrevoked commitments. IINM, LND and CL will play different commitments when force closing in this scenario

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

i'm being a bit dense, but can you elaborate on the scenario where you'd have two unrevoked commitments?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since A committed to 1, it's safe for B to consider it's at state 1

The HTLC sent to B isn't fully locked in at this point, it shouldn't be forwarded until B commits to state 1 and A sends a revocation for state 0 to B. The new HTLC is in sort of a limbo state until the full dance is completed.

and it's economically more viable because B received one more HTLC (compared to 0).

It could also be a settle/fail, in which case state 1 has one fewer HTLCs.

I could be wrong, but wouldn't it be more fair and economically interesting to take the highest?

Idk if there's an objective answer to this question. When there are multiple unrevoked commitments, which one is more economically viable depends on the state of the commitments and how the differing states impact the party that holds them.

Game theory would say B should play whichever nets them the most money.

If HTLCs are only added between 0 and 1 and:

  • B is certain they won't learn the preimage (bc it was never locked in and couldn't forward it, or it was a probe to an exit hop), there's no reason to manifest that HTLC on chain. Commitment 0 in that case has fewer HTLCs and so we burn less to fees
  • B already knows the preimage to the new HTLC (if they're the exit hop), then they should play 1 because they can pull that money (assuming it nets more than the fees to add it). Otherwise they should play 0 and take the loss

All of this is dependent on whether A or B funded the channel, since the initiator will pay the fees. It becomes more complex if there are both additions and removals, and whether the removals are settles or fails.

Anyway, don't wanna get too far away from the conversation at hand. The question we need to answer is: should the act of receiving a commitment inherently revoke your prior, or is it the act of the receiver persisting the revocation locally. If we go with the latter, at least it is consistent whether or not saving the commitment and revoking the prior are implemented atomically. Thoughts?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Got it, it's indeed hard to decide whether it's more interesting for B to be at state 0 or 1, it depends on too many factors.

I'm not 100% sure what Eclair does in that case, I'll let @pm47 correct me if I'm wrong, but I think that we choose state 1. Alice committed to it, so if we want to play nice we should resume the dance here and send our revoke_and_ack.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Eclair would send state 1. The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed). But aren't we all doing that?

In short I agree with @Roasbeef, we should send the latest unrevoked commitment point.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed).

This is also how lnd handles the transition.

I wonder if something here could explain the dlp errors we’ve been seeing?

This comment was marked as abuse.

@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from d019238 to cd2a016CompareFebruary 4, 2019 23:07
@cdecker

Copy link
Copy Markdown
Collaborator

ACK cd2a016

@rustyrussellrustyrussell added the Meeting Discussion Raise at next meeting label Jul 8, 2019
@niftyneiniftynei removed the Meeting Discussion Raise at next meeting label Jul 22, 2019
@t-bastt-bast added the Meeting Discussion Raise at next meeting label Aug 5, 2019
`my_current_per_commitment_point`
Make it more obvious what the expected value of
`my_current_per_commitment_point` is.
@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from cd2a016 to fd191faCompareAugust 9, 2019 17:23
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

merging as per action item at last spec meeting

@niftynei
niftynei merged commit 300f7a6 into lightning:masterAug 9, 2019
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 6, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 9, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Meeting DiscussionRaise at next meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@niftynei@cdecker@rustyrussell@Roasbeef@cfromknecht@pm47@ariard@t-bast
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

option_data_loss_protect: concretely define my_current_per_commitment_point - #550

Merged
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point
Aug 9, 2019
Merged

option_data_loss_protect: concretely define my_current_per_commitment_point#550
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point

Conversation

@niftynei

Copy link
Copy Markdown
Collaborator

Make it more obvious what the expected value of my_current_per_commitment_point is.

cdecker
cdecker approved these changes Jan 21, 2019
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

@Roasbeef did you want to add some clarification to this?

Comment thread02-peer-protocol.md
- MUST set `next_remote_revocation_number` to the commitment number of the
next `revoke_and_ack` message it expects to receive.
- if it supports `option_data_loss_protect`:
- MUST set `my_current_per_commitment_point` to its commitment point for

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I think this would be more clear as:

to its current unrevoked commitment point (sent in the last revoke_and_ack message) used by its channel peer to create the last commitment it received from them

As this is the point that the party who lost data will need to use once the surviving party broadcasts their commitment on chain. In our codebase, we call it LocalUnrevokedCommitPoint for this reason. Main thing that IMO makes it easier to grasp is that this is the current unrevoked point for that party.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

How about we append:

(the commitment_point corresponding to the commitment transaction the sender would use to unilaterally close)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

amended to include clarification about being commitment transaction sender would use to unilaterally close

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

commitment transaction sender would use to unilaterally close

Still seems like this is ambiguous when we have two unrevoked commitments. IINM, LND and CL will play different commitments when force closing in this scenario

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

i'm being a bit dense, but can you elaborate on the scenario where you'd have two unrevoked commitments?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since A committed to 1, it's safe for B to consider it's at state 1

The HTLC sent to B isn't fully locked in at this point, it shouldn't be forwarded until B commits to state 1 and A sends a revocation for state 0 to B. The new HTLC is in sort of a limbo state until the full dance is completed.

and it's economically more viable because B received one more HTLC (compared to 0).

It could also be a settle/fail, in which case state 1 has one fewer HTLCs.

I could be wrong, but wouldn't it be more fair and economically interesting to take the highest?

Idk if there's an objective answer to this question. When there are multiple unrevoked commitments, which one is more economically viable depends on the state of the commitments and how the differing states impact the party that holds them.

Game theory would say B should play whichever nets them the most money.

If HTLCs are only added between 0 and 1 and:

  • B is certain they won't learn the preimage (bc it was never locked in and couldn't forward it, or it was a probe to an exit hop), there's no reason to manifest that HTLC on chain. Commitment 0 in that case has fewer HTLCs and so we burn less to fees
  • B already knows the preimage to the new HTLC (if they're the exit hop), then they should play 1 because they can pull that money (assuming it nets more than the fees to add it). Otherwise they should play 0 and take the loss

All of this is dependent on whether A or B funded the channel, since the initiator will pay the fees. It becomes more complex if there are both additions and removals, and whether the removals are settles or fails.

Anyway, don't wanna get too far away from the conversation at hand. The question we need to answer is: should the act of receiving a commitment inherently revoke your prior, or is it the act of the receiver persisting the revocation locally. If we go with the latter, at least it is consistent whether or not saving the commitment and revoking the prior are implemented atomically. Thoughts?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Got it, it's indeed hard to decide whether it's more interesting for B to be at state 0 or 1, it depends on too many factors.

I'm not 100% sure what Eclair does in that case, I'll let @pm47 correct me if I'm wrong, but I think that we choose state 1. Alice committed to it, so if we want to play nice we should resume the dance here and send our revoke_and_ack.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Eclair would send state 1. The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed). But aren't we all doing that?

In short I agree with @Roasbeef, we should send the latest unrevoked commitment point.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed).

This is also how lnd handles the transition.

I wonder if something here could explain the dlp errors we’ve been seeing?

This comment was marked as abuse.

@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from d019238 to cd2a016CompareFebruary 4, 2019 23:07
@cdecker

Copy link
Copy Markdown
Collaborator

ACK cd2a016

@rustyrussellrustyrussell added the Meeting Discussion Raise at next meeting label Jul 8, 2019
@niftyneiniftynei removed the Meeting Discussion Raise at next meeting label Jul 22, 2019
@t-bastt-bast added the Meeting Discussion Raise at next meeting label Aug 5, 2019
`my_current_per_commitment_point`
Make it more obvious what the expected value of
`my_current_per_commitment_point` is.
@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from cd2a016 to fd191faCompareAugust 9, 2019 17:23
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

merging as per action item at last spec meeting

@niftynei
niftynei merged commit 300f7a6 into lightning:masterAug 9, 2019
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 6, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 9, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Meeting DiscussionRaise at next meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@niftynei@cdecker@rustyrussell@Roasbeef@cfromknecht@pm47@ariard@t-bast
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

option_data_loss_protect: concretely define my_current_per_commitment_point - #550

Merged
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point
Aug 9, 2019
Merged

option_data_loss_protect: concretely define my_current_per_commitment_point#550
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point

Conversation

@niftynei

Copy link
Copy Markdown
Collaborator

Make it more obvious what the expected value of my_current_per_commitment_point is.

cdecker
cdecker approved these changes Jan 21, 2019
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

@Roasbeef did you want to add some clarification to this?

Comment thread02-peer-protocol.md
- MUST set `next_remote_revocation_number` to the commitment number of the
next `revoke_and_ack` message it expects to receive.
- if it supports `option_data_loss_protect`:
- MUST set `my_current_per_commitment_point` to its commitment point for

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I think this would be more clear as:

to its current unrevoked commitment point (sent in the last revoke_and_ack message) used by its channel peer to create the last commitment it received from them

As this is the point that the party who lost data will need to use once the surviving party broadcasts their commitment on chain. In our codebase, we call it LocalUnrevokedCommitPoint for this reason. Main thing that IMO makes it easier to grasp is that this is the current unrevoked point for that party.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

How about we append:

(the commitment_point corresponding to the commitment transaction the sender would use to unilaterally close)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

amended to include clarification about being commitment transaction sender would use to unilaterally close

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

commitment transaction sender would use to unilaterally close

Still seems like this is ambiguous when we have two unrevoked commitments. IINM, LND and CL will play different commitments when force closing in this scenario

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

i'm being a bit dense, but can you elaborate on the scenario where you'd have two unrevoked commitments?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since A committed to 1, it's safe for B to consider it's at state 1

The HTLC sent to B isn't fully locked in at this point, it shouldn't be forwarded until B commits to state 1 and A sends a revocation for state 0 to B. The new HTLC is in sort of a limbo state until the full dance is completed.

and it's economically more viable because B received one more HTLC (compared to 0).

It could also be a settle/fail, in which case state 1 has one fewer HTLCs.

I could be wrong, but wouldn't it be more fair and economically interesting to take the highest?

Idk if there's an objective answer to this question. When there are multiple unrevoked commitments, which one is more economically viable depends on the state of the commitments and how the differing states impact the party that holds them.

Game theory would say B should play whichever nets them the most money.

If HTLCs are only added between 0 and 1 and:

  • B is certain they won't learn the preimage (bc it was never locked in and couldn't forward it, or it was a probe to an exit hop), there's no reason to manifest that HTLC on chain. Commitment 0 in that case has fewer HTLCs and so we burn less to fees
  • B already knows the preimage to the new HTLC (if they're the exit hop), then they should play 1 because they can pull that money (assuming it nets more than the fees to add it). Otherwise they should play 0 and take the loss

All of this is dependent on whether A or B funded the channel, since the initiator will pay the fees. It becomes more complex if there are both additions and removals, and whether the removals are settles or fails.

Anyway, don't wanna get too far away from the conversation at hand. The question we need to answer is: should the act of receiving a commitment inherently revoke your prior, or is it the act of the receiver persisting the revocation locally. If we go with the latter, at least it is consistent whether or not saving the commitment and revoking the prior are implemented atomically. Thoughts?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Got it, it's indeed hard to decide whether it's more interesting for B to be at state 0 or 1, it depends on too many factors.

I'm not 100% sure what Eclair does in that case, I'll let @pm47 correct me if I'm wrong, but I think that we choose state 1. Alice committed to it, so if we want to play nice we should resume the dance here and send our revoke_and_ack.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Eclair would send state 1. The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed). But aren't we all doing that?

In short I agree with @Roasbeef, we should send the latest unrevoked commitment point.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed).

This is also how lnd handles the transition.

I wonder if something here could explain the dlp errors we’ve been seeing?

This comment was marked as abuse.

@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from d019238 to cd2a016CompareFebruary 4, 2019 23:07
@cdecker

Copy link
Copy Markdown
Collaborator

ACK cd2a016

@rustyrussellrustyrussell added the Meeting Discussion Raise at next meeting label Jul 8, 2019
@niftyneiniftynei removed the Meeting Discussion Raise at next meeting label Jul 22, 2019
@t-bastt-bast added the Meeting Discussion Raise at next meeting label Aug 5, 2019
`my_current_per_commitment_point`
Make it more obvious what the expected value of
`my_current_per_commitment_point` is.
@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from cd2a016 to fd191faCompareAugust 9, 2019 17:23
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

merging as per action item at last spec meeting

@niftynei
niftynei merged commit 300f7a6 into lightning:masterAug 9, 2019
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 6, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 9, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Meeting DiscussionRaise at next meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@niftynei@cdecker@rustyrussell@Roasbeef@cfromknecht@pm47@ariard@t-bast
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

option_data_loss_protect: concretely define my_current_per_commitment_point - #550

Merged
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point
Aug 9, 2019
Merged

option_data_loss_protect: concretely define my_current_per_commitment_point#550
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point

Conversation

@niftynei

Copy link
Copy Markdown
Collaborator

Make it more obvious what the expected value of my_current_per_commitment_point is.

cdecker
cdecker approved these changes Jan 21, 2019
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

@Roasbeef did you want to add some clarification to this?

Comment thread02-peer-protocol.md
- MUST set `next_remote_revocation_number` to the commitment number of the
next `revoke_and_ack` message it expects to receive.
- if it supports `option_data_loss_protect`:
- MUST set `my_current_per_commitment_point` to its commitment point for

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I think this would be more clear as:

to its current unrevoked commitment point (sent in the last revoke_and_ack message) used by its channel peer to create the last commitment it received from them

As this is the point that the party who lost data will need to use once the surviving party broadcasts their commitment on chain. In our codebase, we call it LocalUnrevokedCommitPoint for this reason. Main thing that IMO makes it easier to grasp is that this is the current unrevoked point for that party.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

How about we append:

(the commitment_point corresponding to the commitment transaction the sender would use to unilaterally close)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

amended to include clarification about being commitment transaction sender would use to unilaterally close

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

commitment transaction sender would use to unilaterally close

Still seems like this is ambiguous when we have two unrevoked commitments. IINM, LND and CL will play different commitments when force closing in this scenario

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

i'm being a bit dense, but can you elaborate on the scenario where you'd have two unrevoked commitments?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since A committed to 1, it's safe for B to consider it's at state 1

The HTLC sent to B isn't fully locked in at this point, it shouldn't be forwarded until B commits to state 1 and A sends a revocation for state 0 to B. The new HTLC is in sort of a limbo state until the full dance is completed.

and it's economically more viable because B received one more HTLC (compared to 0).

It could also be a settle/fail, in which case state 1 has one fewer HTLCs.

I could be wrong, but wouldn't it be more fair and economically interesting to take the highest?

Idk if there's an objective answer to this question. When there are multiple unrevoked commitments, which one is more economically viable depends on the state of the commitments and how the differing states impact the party that holds them.

Game theory would say B should play whichever nets them the most money.

If HTLCs are only added between 0 and 1 and:

  • B is certain they won't learn the preimage (bc it was never locked in and couldn't forward it, or it was a probe to an exit hop), there's no reason to manifest that HTLC on chain. Commitment 0 in that case has fewer HTLCs and so we burn less to fees
  • B already knows the preimage to the new HTLC (if they're the exit hop), then they should play 1 because they can pull that money (assuming it nets more than the fees to add it). Otherwise they should play 0 and take the loss

All of this is dependent on whether A or B funded the channel, since the initiator will pay the fees. It becomes more complex if there are both additions and removals, and whether the removals are settles or fails.

Anyway, don't wanna get too far away from the conversation at hand. The question we need to answer is: should the act of receiving a commitment inherently revoke your prior, or is it the act of the receiver persisting the revocation locally. If we go with the latter, at least it is consistent whether or not saving the commitment and revoking the prior are implemented atomically. Thoughts?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Got it, it's indeed hard to decide whether it's more interesting for B to be at state 0 or 1, it depends on too many factors.

I'm not 100% sure what Eclair does in that case, I'll let @pm47 correct me if I'm wrong, but I think that we choose state 1. Alice committed to it, so if we want to play nice we should resume the dance here and send our revoke_and_ack.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Eclair would send state 1. The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed). But aren't we all doing that?

In short I agree with @Roasbeef, we should send the latest unrevoked commitment point.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed).

This is also how lnd handles the transition.

I wonder if something here could explain the dlp errors we’ve been seeing?

This comment was marked as abuse.

@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from d019238 to cd2a016CompareFebruary 4, 2019 23:07
@cdecker

Copy link
Copy Markdown
Collaborator

ACK cd2a016

@rustyrussellrustyrussell added the Meeting Discussion Raise at next meeting label Jul 8, 2019
@niftyneiniftynei removed the Meeting Discussion Raise at next meeting label Jul 22, 2019
@t-bastt-bast added the Meeting Discussion Raise at next meeting label Aug 5, 2019
`my_current_per_commitment_point`
Make it more obvious what the expected value of
`my_current_per_commitment_point` is.
@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from cd2a016 to fd191faCompareAugust 9, 2019 17:23
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

merging as per action item at last spec meeting

@niftynei
niftynei merged commit 300f7a6 into lightning:masterAug 9, 2019
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 6, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 9, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Meeting DiscussionRaise at next meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@niftynei@cdecker@rustyrussell@Roasbeef@cfromknecht@pm47@ariard@t-bast
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

option_data_loss_protect: concretely define my_current_per_commitment_point - #550

Merged
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point
Aug 9, 2019
Merged

option_data_loss_protect: concretely define my_current_per_commitment_point#550
niftynei merged 1 commit into
lightning:masterfrom
niftynei:nifty/my_current_per_commitment_point

Conversation

@niftynei

Copy link
Copy Markdown
Collaborator

Make it more obvious what the expected value of my_current_per_commitment_point is.

cdecker
cdecker approved these changes Jan 21, 2019
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

@Roasbeef did you want to add some clarification to this?

Comment thread02-peer-protocol.md
- MUST set `next_remote_revocation_number` to the commitment number of the
next `revoke_and_ack` message it expects to receive.
- if it supports `option_data_loss_protect`:
- MUST set `my_current_per_commitment_point` to its commitment point for

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I think this would be more clear as:

to its current unrevoked commitment point (sent in the last revoke_and_ack message) used by its channel peer to create the last commitment it received from them

As this is the point that the party who lost data will need to use once the surviving party broadcasts their commitment on chain. In our codebase, we call it LocalUnrevokedCommitPoint for this reason. Main thing that IMO makes it easier to grasp is that this is the current unrevoked point for that party.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

How about we append:

(the commitment_point corresponding to the commitment transaction the sender would use to unilaterally close)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

amended to include clarification about being commitment transaction sender would use to unilaterally close

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

commitment transaction sender would use to unilaterally close

Still seems like this is ambiguous when we have two unrevoked commitments. IINM, LND and CL will play different commitments when force closing in this scenario

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

i'm being a bit dense, but can you elaborate on the scenario where you'd have two unrevoked commitments?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since A committed to 1, it's safe for B to consider it's at state 1

The HTLC sent to B isn't fully locked in at this point, it shouldn't be forwarded until B commits to state 1 and A sends a revocation for state 0 to B. The new HTLC is in sort of a limbo state until the full dance is completed.

and it's economically more viable because B received one more HTLC (compared to 0).

It could also be a settle/fail, in which case state 1 has one fewer HTLCs.

I could be wrong, but wouldn't it be more fair and economically interesting to take the highest?

Idk if there's an objective answer to this question. When there are multiple unrevoked commitments, which one is more economically viable depends on the state of the commitments and how the differing states impact the party that holds them.

Game theory would say B should play whichever nets them the most money.

If HTLCs are only added between 0 and 1 and:

  • B is certain they won't learn the preimage (bc it was never locked in and couldn't forward it, or it was a probe to an exit hop), there's no reason to manifest that HTLC on chain. Commitment 0 in that case has fewer HTLCs and so we burn less to fees
  • B already knows the preimage to the new HTLC (if they're the exit hop), then they should play 1 because they can pull that money (assuming it nets more than the fees to add it). Otherwise they should play 0 and take the loss

All of this is dependent on whether A or B funded the channel, since the initiator will pay the fees. It becomes more complex if there are both additions and removals, and whether the removals are settles or fails.

Anyway, don't wanna get too far away from the conversation at hand. The question we need to answer is: should the act of receiving a commitment inherently revoke your prior, or is it the act of the receiver persisting the revocation locally. If we go with the latter, at least it is consistent whether or not saving the commitment and revoking the prior are implemented atomically. Thoughts?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Got it, it's indeed hard to decide whether it's more interesting for B to be at state 0 or 1, it depends on too many factors.

I'm not 100% sure what Eclair does in that case, I'll let @pm47 correct me if I'm wrong, but I think that we choose state 1. Alice committed to it, so if we want to play nice we should resume the dance here and send our revoke_and_ack.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Eclair would send state 1. The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed). But aren't we all doing that?

In short I agree with @Roasbeef, we should send the latest unrevoked commitment point.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The storing of the latest commit_sig and newly generated revoke_and_ack happens in one atomic step, so either we are at state 0, or we are at state 1 and the revocation has been generated and sent (and will be re-sent if needed).

This is also how lnd handles the transition.

I wonder if something here could explain the dlp errors we’ve been seeing?

This comment was marked as abuse.

@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from d019238 to cd2a016CompareFebruary 4, 2019 23:07
@cdecker

Copy link
Copy Markdown
Collaborator

ACK cd2a016

@rustyrussellrustyrussell added the Meeting Discussion Raise at next meeting label Jul 8, 2019
@niftyneiniftynei removed the Meeting Discussion Raise at next meeting label Jul 22, 2019
@t-bastt-bast added the Meeting Discussion Raise at next meeting label Aug 5, 2019
`my_current_per_commitment_point`
Make it more obvious what the expected value of
`my_current_per_commitment_point` is.
@niftynei
niftyneiforce-pushed the nifty/my_current_per_commitment_point branch from cd2a016 to fd191faCompareAugust 9, 2019 17:23
@niftynei

Copy link
Copy Markdown
CollaboratorAuthor

merging as per action item at last spec meeting

@niftynei
niftynei merged commit 300f7a6 into lightning:masterAug 9, 2019
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 6, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 9, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
TheBlueMatt added a commit to TheBlueMatt/rust-lightning that referenced this pull request Mar 17, 2020
This was the way DataLossProtect was originally written, however it
didn't match other implementations at the time during testing. It
turns out, other implementations didn't agree with each other
anyway (depending on the exact timeline), so the spec was clarified
somewhat in lightning/bolts#550
. This updates us to be in line with the new guidance and appears
to solve out-of-sync issues in testing.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Meeting DiscussionRaise at next meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@niftynei@cdecker@rustyrussell@Roasbeef@cfromknecht@pm47@ariard@t-bast