Channel lockup corner case workaround - #3500

Merged
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498
Feb 11, 2020
Merged

Channel lockup corner case workaround#3500
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This is a previously-discussed problem (as shown in lightning/bolts#728 ) but @m-schmoock wrote a proof-of-concept in #3498 so I am pushing a mitigation for the imminent release.

The funder pays the onchain fees: this keeps it simple. If the funder has spent all their funds, they obv. can't use the channel, but the fundee also cannot: most implementations will not add an HTLC if the funder could not afford the resulting fee (c-lightning included). If we were to loosen that, I'm not sure how other implementations would respond :(

The simplest workaround is to keep a little extra around if we're the funder. It's still possible to get into a state (particularly with fee changes) where we're stuck, but this makes it less likely.

@ZmnSCPxjZmnSCPxj left a comment

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.

* additional constraint when we're funder trying to add an HTLC: make
* sure we can afford one more HTLC, even if fees increase 50%.
*
* We could do this for the peer, as well, by rejecting their HTLC

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.

In this case the peer would have to be funder and us the fundee?

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.

Yes.

@ZmnSCPxj

Copy link
Copy Markdown
Contributor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

I originally did that, but we have to change the numbers now it doesn't allow the second HTLC. Seemed cleaner to leave it as a POC unmerged, and have this fast generic one in-tree.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Trivial rebase, Changelog line added.

This is inspired by @m-schmook's ElementsProject#3498
except this is simply a two-channel version which probes for the amount.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Extract out num_untrimmed_htlcs() from inside fee_for_htlcs(), and
remove unused view arg.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Another trivial rebase, fix flake8 warnings.

@m-schmoock

m-schmoock commented Feb 11, 2020

Copy link
Copy Markdown
Collaborator

About the mitigation, adding a soft reserve related to fee makes sense. Some questions:

  1. About the fundee rejecting it's peer running into this situation, @rustyrussell can you elaborate how/why the founder 'gets upset' with us?

  2. How do we mitigate channels that are already in that state right now? Our software could check this and make a circular payment to unlock them on its own.

  3. We need to check that the meaning of 'spendable_msat' in listpeers will not be broken.

I will test try out this PR this evening...

@rustyrussell

rustyrussell commented Feb 11, 2020

Copy link
Copy Markdown
CollaboratorAuthor

Note we're overdue for the 0.8.1 release.

  1. If this code rejects the remote attempt to add an HTLC (i.e. incoming), channeld will close the channel for violating the protocol since the peer should not have tried to do that. If it rejects a local attempt (i.e. outgoing), channeld returns an error to lightningd; this is common (e.g. no capacity). We would need to add a new failure mechanism for remote, to say "they added it, but we need to immediately fail it" which is complex.

  2. Fixing channels already in this state is out of scope for this PR (and I don't think necessary, since it's a not been seen much in the wild?).

  3. Yes, I will need to fix that, good catch.

Much of the testsuite also broke. (Actually, testsuite caught #3 as well, thanks!)

Add new check if we're funder trying to add HTLC, keeping us
with enough extra funds to pay for another HTLC the peer might add.
We also need to adjust the spendable_msat calculation, and update
various tests which try to unbalance channels. We eliminate
the now-redundant test_channel_drainage entirely.
Changelog-Fixed: Corner case where channel could become unusable (lightning/bolts#728)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@cdecker

Copy link
Copy Markdown
Member

ACK dc3a718

@cdecker
cdecker merged commit 86c28b2 into ElementsProject:masterFeb 11, 2020

/* Now, how much would it cost us if feerate increases 50% and we added
* another HTLC? */
fee = commit_tx_base_fee(feerate + feerate/2, untrimmed + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Cleanup: we should split out the feerate + feerate/2 into a separate variable.

@m-schmoock

Copy link
Copy Markdown
Collaborator

hm... that was quick :D
I will still do my tests this evening

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@rustyrussell@ZmnSCPxj@m-schmoock@cdecker
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} 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

Channel lockup corner case workaround - #3500

Merged
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498
Feb 11, 2020
Merged

Channel lockup corner case workaround#3500
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This is a previously-discussed problem (as shown in lightning/bolts#728 ) but @m-schmoock wrote a proof-of-concept in #3498 so I am pushing a mitigation for the imminent release.

The funder pays the onchain fees: this keeps it simple. If the funder has spent all their funds, they obv. can't use the channel, but the fundee also cannot: most implementations will not add an HTLC if the funder could not afford the resulting fee (c-lightning included). If we were to loosen that, I'm not sure how other implementations would respond :(

The simplest workaround is to keep a little extra around if we're the funder. It's still possible to get into a state (particularly with fee changes) where we're stuck, but this makes it less likely.

@ZmnSCPxjZmnSCPxj left a comment

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.

* additional constraint when we're funder trying to add an HTLC: make
* sure we can afford one more HTLC, even if fees increase 50%.
*
* We could do this for the peer, as well, by rejecting their HTLC

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.

In this case the peer would have to be funder and us the fundee?

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.

Yes.

@ZmnSCPxj

Copy link
Copy Markdown
Contributor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

I originally did that, but we have to change the numbers now it doesn't allow the second HTLC. Seemed cleaner to leave it as a POC unmerged, and have this fast generic one in-tree.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Trivial rebase, Changelog line added.

This is inspired by @m-schmook's ElementsProject#3498
except this is simply a two-channel version which probes for the amount.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Extract out num_untrimmed_htlcs() from inside fee_for_htlcs(), and
remove unused view arg.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Another trivial rebase, fix flake8 warnings.

@m-schmoock

m-schmoock commented Feb 11, 2020

Copy link
Copy Markdown
Collaborator

About the mitigation, adding a soft reserve related to fee makes sense. Some questions:

  1. About the fundee rejecting it's peer running into this situation, @rustyrussell can you elaborate how/why the founder 'gets upset' with us?

  2. How do we mitigate channels that are already in that state right now? Our software could check this and make a circular payment to unlock them on its own.

  3. We need to check that the meaning of 'spendable_msat' in listpeers will not be broken.

I will test try out this PR this evening...

@rustyrussell

rustyrussell commented Feb 11, 2020

Copy link
Copy Markdown
CollaboratorAuthor

Note we're overdue for the 0.8.1 release.

  1. If this code rejects the remote attempt to add an HTLC (i.e. incoming), channeld will close the channel for violating the protocol since the peer should not have tried to do that. If it rejects a local attempt (i.e. outgoing), channeld returns an error to lightningd; this is common (e.g. no capacity). We would need to add a new failure mechanism for remote, to say "they added it, but we need to immediately fail it" which is complex.

  2. Fixing channels already in this state is out of scope for this PR (and I don't think necessary, since it's a not been seen much in the wild?).

  3. Yes, I will need to fix that, good catch.

Much of the testsuite also broke. (Actually, testsuite caught #3 as well, thanks!)

Add new check if we're funder trying to add HTLC, keeping us
with enough extra funds to pay for another HTLC the peer might add.
We also need to adjust the spendable_msat calculation, and update
various tests which try to unbalance channels. We eliminate
the now-redundant test_channel_drainage entirely.
Changelog-Fixed: Corner case where channel could become unusable (lightning/bolts#728)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@cdecker

Copy link
Copy Markdown
Member

ACK dc3a718

@cdecker
cdecker merged commit 86c28b2 into ElementsProject:masterFeb 11, 2020

/* Now, how much would it cost us if feerate increases 50% and we added
* another HTLC? */
fee = commit_tx_base_fee(feerate + feerate/2, untrimmed + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Cleanup: we should split out the feerate + feerate/2 into a separate variable.

@m-schmoock

Copy link
Copy Markdown
Collaborator

hm... that was quick :D
I will still do my tests this evening

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Channel lockup corner case workaround - #3500

Merged
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498
Feb 11, 2020
Merged

Channel lockup corner case workaround#3500
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This is a previously-discussed problem (as shown in lightning/bolts#728 ) but @m-schmoock wrote a proof-of-concept in #3498 so I am pushing a mitigation for the imminent release.

The funder pays the onchain fees: this keeps it simple. If the funder has spent all their funds, they obv. can't use the channel, but the fundee also cannot: most implementations will not add an HTLC if the funder could not afford the resulting fee (c-lightning included). If we were to loosen that, I'm not sure how other implementations would respond :(

The simplest workaround is to keep a little extra around if we're the funder. It's still possible to get into a state (particularly with fee changes) where we're stuck, but this makes it less likely.

@ZmnSCPxjZmnSCPxj left a comment

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.

* additional constraint when we're funder trying to add an HTLC: make
* sure we can afford one more HTLC, even if fees increase 50%.
*
* We could do this for the peer, as well, by rejecting their HTLC

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.

In this case the peer would have to be funder and us the fundee?

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.

Yes.

@ZmnSCPxj

Copy link
Copy Markdown
Contributor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

I originally did that, but we have to change the numbers now it doesn't allow the second HTLC. Seemed cleaner to leave it as a POC unmerged, and have this fast generic one in-tree.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Trivial rebase, Changelog line added.

This is inspired by @m-schmook's ElementsProject#3498
except this is simply a two-channel version which probes for the amount.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Extract out num_untrimmed_htlcs() from inside fee_for_htlcs(), and
remove unused view arg.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Another trivial rebase, fix flake8 warnings.

@m-schmoock

m-schmoock commented Feb 11, 2020

Copy link
Copy Markdown
Collaborator

About the mitigation, adding a soft reserve related to fee makes sense. Some questions:

  1. About the fundee rejecting it's peer running into this situation, @rustyrussell can you elaborate how/why the founder 'gets upset' with us?

  2. How do we mitigate channels that are already in that state right now? Our software could check this and make a circular payment to unlock them on its own.

  3. We need to check that the meaning of 'spendable_msat' in listpeers will not be broken.

I will test try out this PR this evening...

@rustyrussell

rustyrussell commented Feb 11, 2020

Copy link
Copy Markdown
CollaboratorAuthor

Note we're overdue for the 0.8.1 release.

  1. If this code rejects the remote attempt to add an HTLC (i.e. incoming), channeld will close the channel for violating the protocol since the peer should not have tried to do that. If it rejects a local attempt (i.e. outgoing), channeld returns an error to lightningd; this is common (e.g. no capacity). We would need to add a new failure mechanism for remote, to say "they added it, but we need to immediately fail it" which is complex.

  2. Fixing channels already in this state is out of scope for this PR (and I don't think necessary, since it's a not been seen much in the wild?).

  3. Yes, I will need to fix that, good catch.

Much of the testsuite also broke. (Actually, testsuite caught #3 as well, thanks!)

Add new check if we're funder trying to add HTLC, keeping us
with enough extra funds to pay for another HTLC the peer might add.
We also need to adjust the spendable_msat calculation, and update
various tests which try to unbalance channels. We eliminate
the now-redundant test_channel_drainage entirely.
Changelog-Fixed: Corner case where channel could become unusable (lightning/bolts#728)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@cdecker

Copy link
Copy Markdown
Member

ACK dc3a718

@cdecker
cdecker merged commit 86c28b2 into ElementsProject:masterFeb 11, 2020

/* Now, how much would it cost us if feerate increases 50% and we added
* another HTLC? */
fee = commit_tx_base_fee(feerate + feerate/2, untrimmed + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Cleanup: we should split out the feerate + feerate/2 into a separate variable.

@m-schmoock

Copy link
Copy Markdown
Collaborator

hm... that was quick :D
I will still do my tests this evening

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Channel lockup corner case workaround - #3500

Merged
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498
Feb 11, 2020
Merged

Channel lockup corner case workaround#3500
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This is a previously-discussed problem (as shown in lightning/bolts#728 ) but @m-schmoock wrote a proof-of-concept in #3498 so I am pushing a mitigation for the imminent release.

The funder pays the onchain fees: this keeps it simple. If the funder has spent all their funds, they obv. can't use the channel, but the fundee also cannot: most implementations will not add an HTLC if the funder could not afford the resulting fee (c-lightning included). If we were to loosen that, I'm not sure how other implementations would respond :(

The simplest workaround is to keep a little extra around if we're the funder. It's still possible to get into a state (particularly with fee changes) where we're stuck, but this makes it less likely.

@ZmnSCPxjZmnSCPxj left a comment

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.

* additional constraint when we're funder trying to add an HTLC: make
* sure we can afford one more HTLC, even if fees increase 50%.
*
* We could do this for the peer, as well, by rejecting their HTLC

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.

In this case the peer would have to be funder and us the fundee?

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.

Yes.

@ZmnSCPxj

Copy link
Copy Markdown
Contributor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

I originally did that, but we have to change the numbers now it doesn't allow the second HTLC. Seemed cleaner to leave it as a POC unmerged, and have this fast generic one in-tree.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Trivial rebase, Changelog line added.

This is inspired by @m-schmook's ElementsProject#3498
except this is simply a two-channel version which probes for the amount.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Extract out num_untrimmed_htlcs() from inside fee_for_htlcs(), and
remove unused view arg.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Another trivial rebase, fix flake8 warnings.

@m-schmoock

m-schmoock commented Feb 11, 2020

Copy link
Copy Markdown
Collaborator

About the mitigation, adding a soft reserve related to fee makes sense. Some questions:

  1. About the fundee rejecting it's peer running into this situation, @rustyrussell can you elaborate how/why the founder 'gets upset' with us?

  2. How do we mitigate channels that are already in that state right now? Our software could check this and make a circular payment to unlock them on its own.

  3. We need to check that the meaning of 'spendable_msat' in listpeers will not be broken.

I will test try out this PR this evening...

@rustyrussell

rustyrussell commented Feb 11, 2020

Copy link
Copy Markdown
CollaboratorAuthor

Note we're overdue for the 0.8.1 release.

  1. If this code rejects the remote attempt to add an HTLC (i.e. incoming), channeld will close the channel for violating the protocol since the peer should not have tried to do that. If it rejects a local attempt (i.e. outgoing), channeld returns an error to lightningd; this is common (e.g. no capacity). We would need to add a new failure mechanism for remote, to say "they added it, but we need to immediately fail it" which is complex.

  2. Fixing channels already in this state is out of scope for this PR (and I don't think necessary, since it's a not been seen much in the wild?).

  3. Yes, I will need to fix that, good catch.

Much of the testsuite also broke. (Actually, testsuite caught #3 as well, thanks!)

Add new check if we're funder trying to add HTLC, keeping us
with enough extra funds to pay for another HTLC the peer might add.
We also need to adjust the spendable_msat calculation, and update
various tests which try to unbalance channels. We eliminate
the now-redundant test_channel_drainage entirely.
Changelog-Fixed: Corner case where channel could become unusable (lightning/bolts#728)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@cdecker

Copy link
Copy Markdown
Member

ACK dc3a718

@cdecker
cdecker merged commit 86c28b2 into ElementsProject:masterFeb 11, 2020

/* Now, how much would it cost us if feerate increases 50% and we added
* another HTLC? */
fee = commit_tx_base_fee(feerate + feerate/2, untrimmed + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Cleanup: we should split out the feerate + feerate/2 into a separate variable.

@m-schmoock

Copy link
Copy Markdown
Collaborator

hm... that was quick :D
I will still do my tests this evening

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@rustyrussell@ZmnSCPxj@m-schmoock@cdecker
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } 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

Channel lockup corner case workaround - #3500

Merged
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498
Feb 11, 2020
Merged

Channel lockup corner case workaround#3500
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This is a previously-discussed problem (as shown in lightning/bolts#728 ) but @m-schmoock wrote a proof-of-concept in #3498 so I am pushing a mitigation for the imminent release.

The funder pays the onchain fees: this keeps it simple. If the funder has spent all their funds, they obv. can't use the channel, but the fundee also cannot: most implementations will not add an HTLC if the funder could not afford the resulting fee (c-lightning included). If we were to loosen that, I'm not sure how other implementations would respond :(

The simplest workaround is to keep a little extra around if we're the funder. It's still possible to get into a state (particularly with fee changes) where we're stuck, but this makes it less likely.

@ZmnSCPxjZmnSCPxj left a comment

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.

* additional constraint when we're funder trying to add an HTLC: make
* sure we can afford one more HTLC, even if fees increase 50%.
*
* We could do this for the peer, as well, by rejecting their HTLC

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.

In this case the peer would have to be funder and us the fundee?

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.

Yes.

@ZmnSCPxj

Copy link
Copy Markdown
Contributor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

I originally did that, but we have to change the numbers now it doesn't allow the second HTLC. Seemed cleaner to leave it as a POC unmerged, and have this fast generic one in-tree.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Trivial rebase, Changelog line added.

This is inspired by @m-schmook's ElementsProject#3498
except this is simply a two-channel version which probes for the amount.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Extract out num_untrimmed_htlcs() from inside fee_for_htlcs(), and
remove unused view arg.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Another trivial rebase, fix flake8 warnings.

@m-schmoock

m-schmoock commented Feb 11, 2020

Copy link
Copy Markdown
Collaborator

About the mitigation, adding a soft reserve related to fee makes sense. Some questions:

  1. About the fundee rejecting it's peer running into this situation, @rustyrussell can you elaborate how/why the founder 'gets upset' with us?

  2. How do we mitigate channels that are already in that state right now? Our software could check this and make a circular payment to unlock them on its own.

  3. We need to check that the meaning of 'spendable_msat' in listpeers will not be broken.

I will test try out this PR this evening...

@rustyrussell

rustyrussell commented Feb 11, 2020

Copy link
Copy Markdown
CollaboratorAuthor

Note we're overdue for the 0.8.1 release.

  1. If this code rejects the remote attempt to add an HTLC (i.e. incoming), channeld will close the channel for violating the protocol since the peer should not have tried to do that. If it rejects a local attempt (i.e. outgoing), channeld returns an error to lightningd; this is common (e.g. no capacity). We would need to add a new failure mechanism for remote, to say "they added it, but we need to immediately fail it" which is complex.

  2. Fixing channels already in this state is out of scope for this PR (and I don't think necessary, since it's a not been seen much in the wild?).

  3. Yes, I will need to fix that, good catch.

Much of the testsuite also broke. (Actually, testsuite caught #3 as well, thanks!)

Add new check if we're funder trying to add HTLC, keeping us
with enough extra funds to pay for another HTLC the peer might add.
We also need to adjust the spendable_msat calculation, and update
various tests which try to unbalance channels. We eliminate
the now-redundant test_channel_drainage entirely.
Changelog-Fixed: Corner case where channel could become unusable (lightning/bolts#728)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@cdecker

Copy link
Copy Markdown
Member

ACK dc3a718

@cdecker
cdecker merged commit 86c28b2 into ElementsProject:masterFeb 11, 2020

/* Now, how much would it cost us if feerate increases 50% and we added
* another HTLC? */
fee = commit_tx_base_fee(feerate + feerate/2, untrimmed + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Cleanup: we should split out the feerate + feerate/2 into a separate variable.

@m-schmoock

Copy link
Copy Markdown
Collaborator

hm... that was quick :D
I will still do my tests this evening

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Channel lockup corner case workaround - #3500

Merged
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498
Feb 11, 2020
Merged

Channel lockup corner case workaround#3500
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This is a previously-discussed problem (as shown in lightning/bolts#728 ) but @m-schmoock wrote a proof-of-concept in #3498 so I am pushing a mitigation for the imminent release.

The funder pays the onchain fees: this keeps it simple. If the funder has spent all their funds, they obv. can't use the channel, but the fundee also cannot: most implementations will not add an HTLC if the funder could not afford the resulting fee (c-lightning included). If we were to loosen that, I'm not sure how other implementations would respond :(

The simplest workaround is to keep a little extra around if we're the funder. It's still possible to get into a state (particularly with fee changes) where we're stuck, but this makes it less likely.

@ZmnSCPxjZmnSCPxj left a comment

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.

* additional constraint when we're funder trying to add an HTLC: make
* sure we can afford one more HTLC, even if fees increase 50%.
*
* We could do this for the peer, as well, by rejecting their HTLC

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.

In this case the peer would have to be funder and us the fundee?

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.

Yes.

@ZmnSCPxj

Copy link
Copy Markdown
Contributor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

I originally did that, but we have to change the numbers now it doesn't allow the second HTLC. Seemed cleaner to leave it as a POC unmerged, and have this fast generic one in-tree.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Trivial rebase, Changelog line added.

This is inspired by @m-schmook's ElementsProject#3498
except this is simply a two-channel version which probes for the amount.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Extract out num_untrimmed_htlcs() from inside fee_for_htlcs(), and
remove unused view arg.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Another trivial rebase, fix flake8 warnings.

@m-schmoock

m-schmoock commented Feb 11, 2020

Copy link
Copy Markdown
Collaborator

About the mitigation, adding a soft reserve related to fee makes sense. Some questions:

  1. About the fundee rejecting it's peer running into this situation, @rustyrussell can you elaborate how/why the founder 'gets upset' with us?

  2. How do we mitigate channels that are already in that state right now? Our software could check this and make a circular payment to unlock them on its own.

  3. We need to check that the meaning of 'spendable_msat' in listpeers will not be broken.

I will test try out this PR this evening...

@rustyrussell

rustyrussell commented Feb 11, 2020

Copy link
Copy Markdown
CollaboratorAuthor

Note we're overdue for the 0.8.1 release.

  1. If this code rejects the remote attempt to add an HTLC (i.e. incoming), channeld will close the channel for violating the protocol since the peer should not have tried to do that. If it rejects a local attempt (i.e. outgoing), channeld returns an error to lightningd; this is common (e.g. no capacity). We would need to add a new failure mechanism for remote, to say "they added it, but we need to immediately fail it" which is complex.

  2. Fixing channels already in this state is out of scope for this PR (and I don't think necessary, since it's a not been seen much in the wild?).

  3. Yes, I will need to fix that, good catch.

Much of the testsuite also broke. (Actually, testsuite caught #3 as well, thanks!)

Add new check if we're funder trying to add HTLC, keeping us
with enough extra funds to pay for another HTLC the peer might add.
We also need to adjust the spendable_msat calculation, and update
various tests which try to unbalance channels. We eliminate
the now-redundant test_channel_drainage entirely.
Changelog-Fixed: Corner case where channel could become unusable (lightning/bolts#728)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@cdecker

Copy link
Copy Markdown
Member

ACK dc3a718

@cdecker
cdecker merged commit 86c28b2 into ElementsProject:masterFeb 11, 2020

/* Now, how much would it cost us if feerate increases 50% and we added
* another HTLC? */
fee = commit_tx_base_fee(feerate + feerate/2, untrimmed + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Cleanup: we should split out the feerate + feerate/2 into a separate variable.

@m-schmoock

Copy link
Copy Markdown
Collaborator

hm... that was quick :D
I will still do my tests this evening

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Channel lockup corner case workaround - #3500

Merged
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498
Feb 11, 2020
Merged

Channel lockup corner case workaround#3500
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This is a previously-discussed problem (as shown in lightning/bolts#728 ) but @m-schmoock wrote a proof-of-concept in #3498 so I am pushing a mitigation for the imminent release.

The funder pays the onchain fees: this keeps it simple. If the funder has spent all their funds, they obv. can't use the channel, but the fundee also cannot: most implementations will not add an HTLC if the funder could not afford the resulting fee (c-lightning included). If we were to loosen that, I'm not sure how other implementations would respond :(

The simplest workaround is to keep a little extra around if we're the funder. It's still possible to get into a state (particularly with fee changes) where we're stuck, but this makes it less likely.

@ZmnSCPxjZmnSCPxj left a comment

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.

* additional constraint when we're funder trying to add an HTLC: make
* sure we can afford one more HTLC, even if fees increase 50%.
*
* We could do this for the peer, as well, by rejecting their HTLC

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.

In this case the peer would have to be funder and us the fundee?

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.

Yes.

@ZmnSCPxj

Copy link
Copy Markdown
Contributor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

I originally did that, but we have to change the numbers now it doesn't allow the second HTLC. Seemed cleaner to leave it as a POC unmerged, and have this fast generic one in-tree.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Trivial rebase, Changelog line added.

This is inspired by @m-schmook's ElementsProject#3498
except this is simply a two-channel version which probes for the amount.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Extract out num_untrimmed_htlcs() from inside fee_for_htlcs(), and
remove unused view arg.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Another trivial rebase, fix flake8 warnings.

@m-schmoock

m-schmoock commented Feb 11, 2020

Copy link
Copy Markdown
Collaborator

About the mitigation, adding a soft reserve related to fee makes sense. Some questions:

  1. About the fundee rejecting it's peer running into this situation, @rustyrussell can you elaborate how/why the founder 'gets upset' with us?

  2. How do we mitigate channels that are already in that state right now? Our software could check this and make a circular payment to unlock them on its own.

  3. We need to check that the meaning of 'spendable_msat' in listpeers will not be broken.

I will test try out this PR this evening...

@rustyrussell

rustyrussell commented Feb 11, 2020

Copy link
Copy Markdown
CollaboratorAuthor

Note we're overdue for the 0.8.1 release.

  1. If this code rejects the remote attempt to add an HTLC (i.e. incoming), channeld will close the channel for violating the protocol since the peer should not have tried to do that. If it rejects a local attempt (i.e. outgoing), channeld returns an error to lightningd; this is common (e.g. no capacity). We would need to add a new failure mechanism for remote, to say "they added it, but we need to immediately fail it" which is complex.

  2. Fixing channels already in this state is out of scope for this PR (and I don't think necessary, since it's a not been seen much in the wild?).

  3. Yes, I will need to fix that, good catch.

Much of the testsuite also broke. (Actually, testsuite caught #3 as well, thanks!)

Add new check if we're funder trying to add HTLC, keeping us
with enough extra funds to pay for another HTLC the peer might add.
We also need to adjust the spendable_msat calculation, and update
various tests which try to unbalance channels. We eliminate
the now-redundant test_channel_drainage entirely.
Changelog-Fixed: Corner case where channel could become unusable (lightning/bolts#728)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@cdecker

Copy link
Copy Markdown
Member

ACK dc3a718

@cdecker
cdecker merged commit 86c28b2 into ElementsProject:masterFeb 11, 2020

/* Now, how much would it cost us if feerate increases 50% and we added
* another HTLC? */
fee = commit_tx_base_fee(feerate + feerate/2, untrimmed + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Cleanup: we should split out the feerate + feerate/2 into a separate variable.

@m-schmoock

Copy link
Copy Markdown
Collaborator

hm... that was quick :D
I will still do my tests this evening

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Channel lockup corner case workaround - #3500

Merged
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498
Feb 11, 2020
Merged

Channel lockup corner case workaround#3500
cdecker merged 3 commits into
ElementsProject:masterfrom
rustyrussell:guilt/pr-3498

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This is a previously-discussed problem (as shown in lightning/bolts#728 ) but @m-schmoock wrote a proof-of-concept in #3498 so I am pushing a mitigation for the imminent release.

The funder pays the onchain fees: this keeps it simple. If the funder has spent all their funds, they obv. can't use the channel, but the fundee also cannot: most implementations will not add an HTLC if the funder could not afford the resulting fee (c-lightning included). If we were to loosen that, I'm not sure how other implementations would respond :(

The simplest workaround is to keep a little extra around if we're the funder. It's still possible to get into a state (particularly with fee changes) where we're stuck, but this makes it less likely.

@ZmnSCPxjZmnSCPxj left a comment

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.

* additional constraint when we're funder trying to add an HTLC: make
* sure we can afford one more HTLC, even if fees increase 50%.
*
* We could do this for the peer, as well, by rejecting their HTLC

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.

In this case the peer would have to be funder and us the fundee?

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.

Yes.

@ZmnSCPxj

Copy link
Copy Markdown
Contributor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Should we add the remote, no-onchain-feerate-change-needed test case made by @m-schmoock in #3498 as well? We would have to modify it to expect failure at the second drain attempt.

I originally did that, but we have to change the numbers now it doesn't allow the second HTLC. Seemed cleaner to leave it as a POC unmerged, and have this fast generic one in-tree.

@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Trivial rebase, Changelog line added.

This is inspired by @m-schmook's ElementsProject#3498
except this is simply a two-channel version which probes for the amount.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Extract out num_untrimmed_htlcs() from inside fee_for_htlcs(), and
remove unused view arg.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell

Copy link
Copy Markdown
CollaboratorAuthor

Another trivial rebase, fix flake8 warnings.

@m-schmoock

m-schmoock commented Feb 11, 2020

Copy link
Copy Markdown
Collaborator

About the mitigation, adding a soft reserve related to fee makes sense. Some questions:

  1. About the fundee rejecting it's peer running into this situation, @rustyrussell can you elaborate how/why the founder 'gets upset' with us?

  2. How do we mitigate channels that are already in that state right now? Our software could check this and make a circular payment to unlock them on its own.

  3. We need to check that the meaning of 'spendable_msat' in listpeers will not be broken.

I will test try out this PR this evening...

@rustyrussell

rustyrussell commented Feb 11, 2020

Copy link
Copy Markdown
CollaboratorAuthor

Note we're overdue for the 0.8.1 release.

  1. If this code rejects the remote attempt to add an HTLC (i.e. incoming), channeld will close the channel for violating the protocol since the peer should not have tried to do that. If it rejects a local attempt (i.e. outgoing), channeld returns an error to lightningd; this is common (e.g. no capacity). We would need to add a new failure mechanism for remote, to say "they added it, but we need to immediately fail it" which is complex.

  2. Fixing channels already in this state is out of scope for this PR (and I don't think necessary, since it's a not been seen much in the wild?).

  3. Yes, I will need to fix that, good catch.

Much of the testsuite also broke. (Actually, testsuite caught #3 as well, thanks!)

Add new check if we're funder trying to add HTLC, keeping us
with enough extra funds to pay for another HTLC the peer might add.
We also need to adjust the spendable_msat calculation, and update
various tests which try to unbalance channels. We eliminate
the now-redundant test_channel_drainage entirely.
Changelog-Fixed: Corner case where channel could become unusable (lightning/bolts#728)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@cdecker

Copy link
Copy Markdown
Member

ACK dc3a718

@cdecker
cdecker merged commit 86c28b2 into ElementsProject:masterFeb 11, 2020

/* Now, how much would it cost us if feerate increases 50% and we added
* another HTLC? */
fee = commit_tx_base_fee(feerate + feerate/2, untrimmed + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Cleanup: we should split out the feerate + feerate/2 into a separate variable.

@m-schmoock

Copy link
Copy Markdown
Collaborator

hm... that was quick :D
I will still do my tests this evening

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@rustyrussell@ZmnSCPxj@m-schmoock@cdecker