Skip to content

Correct and update confirmation target constant definitions - #3608

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants
Mar 6, 2025
Merged

Correct and update confirmation target constant definitions#3608
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

In the process of #3340 I noticed a bunch of our confirmation target constants don't make sense anymore post-anchor (and one of our checks made no sense ever). So here we update them, taking this opportunity to also increase a few windows.

@wpaulinowpaulino 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.

CI has a few test failures that need to be fixed

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch 2 times, most recently from 5314c7d to dac2cc2CompareFebruary 24, 2025 20:29
@wpaulino

Copy link
Copy Markdown
Contributor

Feel free to squash

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from dac2cc2 to 84ce4f0CompareFebruary 24, 2025 21:40
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes.

@wpaulino

Copy link
Copy Markdown
Contributor

Needs rustfmt

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from 84ce4f0 to 7fb9ba1CompareFebruary 25, 2025 19:46
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grrr, done.

wpaulino
wpaulino previously approved these changes Feb 25, 2025
@TheBlueMatt
TheBlueMatt removed the request for review from arik-soMarch 4, 2025 13:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
// in with enough time left to fail the corresponding HTLC back to our inbound edge before they
// force-close on us.
// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

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.

s/after expiry/before expiry?

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.

No after. We FC a channel several blocks after an HTLC expires.

// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have
// 2*MAX_BLOCKS_FOR_CONF + ANTI_REORG_DELAY left to get two transactions on chain and the second
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

suggestion:

Suggested change
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the
// fully locked in before the inbound peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

That reads kinda confusing to me? Makes it sound like the channel was inbound from the peer, rather than the HTLC was relayed inbound from the peer?

Comment on lines 233 to 235
/// If an HTLC expires within this many blocks, force-close the channel to broadcast the
/// HTLC-Success transaction.

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.

"HTLC-Success transaction" phrasing seems to suggest this const is only used in the context of channels with inbound HTLC(s) where we have the preimage. But it seems to be used for inbounds where we don't have the preimage as well, and/or other contexts? I wonder if this could be clarified?

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.

Not directly? Its only used directly as !htlc_outbound && htlc.cltv_expiry <= height + CLTV_CLAIM_BUFFER && self.payment_preimages.contains_key(&htlc.payment_hash) and indirectly to calculate HTLC_FAIL_BACK_BUFFER which is the same concept.

The `CHECK_CLTV_EXPIRY_SANITY_2` check actually made no sense -
its use of `2*CLTV_CLAIM_BUFFER` implicitly assumed that we were
failing HTLCs `CLTV_CLAIM_BUFFER` after they expired, which is
nonsense.
Instead, we improve the readability of the docs on
`_CHECK_CLTV_EXPIRY_SANITY` and add a new
`_CHECK_CLTV_EXPIRY_OFFCHAIN` that correctly tests for what the
`CHECK_CLTV_EXPIRY_SANITY_2` check was supposed to look at.
Over the years we've built up a few tests which rely on block count
constants but without making direct references to those constants.
Here we fix three such tests to ensure changing block count
constants in the next commit do not break tests.
`test_duplicate_payment_hash_one_failure_one_success` makes a
number of assumptions which rely on our specific CLTV constants,
which we intend to change. Specifically, it relies on forwarding
two HTLCs, one which goes one hop longer, and that it can close
the channel with both HTLCs sitting on chain with enough time to
claim that it doesn't give up on them but also that they get
claimed in separate transactions.
Here we clean up, simplify, and better document the test such that
it is more resilient to future CLTV constant changes.
`CLTV_CLAIM_BUFFER`'s definition stated "this is an upper bound on
how many blocks we think it can take us to get a transaction
confirmed". This was mostly okay for pre-anchor channels, where we
broadcasted HTLC claim transactions at the same time as the
commitment transactions themselves, but for anchor channels we can
no longer do that - HTLC transactions are always CSV 1'd.
Further, when we do go to broadcast HTLC transactions, we start
the feerate estimate for them back at the users' feerate estimator,
rather than whatever feerate we ended up using to get the
commitment transaction confirmed. While we should maybe consider
changing that, for now that means that we really need to run the
whole "get a transaction confirmed" process from start to finish
*twice* in order to claim an HTLC.
Thus, `CLTV_CLAIM_BUFFER` is here redefined to be two times "the
upper bound on how many blocks we think it can take for us to get
a transaction confirmed", with a new `MAX_BLOCKS_FOR_CONF` constant
defining the expected max blocks.
In the previous commit it was observed that we actually have to run
the whole "get a transaction confirmed" process from start to
finish twice to claim an HTLC on an anchor channel. This leaves us
with only 9 blocks to get each transaction confirmed, which is
quite aggressive.
Here we double this threshold, force-closing channels which have an
expiring HTLC 36 blocks before expiry instead of 18. We also
increase the minimum CLTV expiry delta to 48 to ensure we have at
least a few blocks after the transactions get confirmed before we
need to fail the inbound edge of a forwarded HTLC back.
We do not change the default CLTV expiry delta of 72 blocks.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Cleaned up the commit history with the following additional diff, plus rebased.

diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 66f004356..d01d25bbc 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -2816,3 +2816,3 @@ pub(crate) const MAX_LOCAL_BREAKDOWN_TIMEOUT: u16 = 2 * 6 * 24 * 7;
/// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
-/// HTLC's CLTV. The current default represents roughly seven hours of blocks at six blocks/hour.+/// HTLC's CLTV. The current default represents roughly eight hours of blocks at six blocks/hour.
///
@@ -2845,3 +2845,3 @@ pub const MIN_FINAL_CLTV_EXPIRY_DELTA: u16 = HTLC_FAIL_BACK_BUFFER as u16 + 3;
// force-close on us.
-// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our+// In other words, if the next-hop peer fails HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from d078b10 to e7c2a61CompareMarch 5, 2025 19:23
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.

3 participants

@TheBlueMatt@wpaulino@valentinewallace
, '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" + '
Correct and update confirmation target constant definitions by TheBlueMatt · Pull Request #3608 · lightningdevkit/rust-lightning · GitHub
Skip to content

Correct and update confirmation target constant definitions - #3608

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants
Mar 6, 2025
Merged

Correct and update confirmation target constant definitions#3608
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

In the process of #3340 I noticed a bunch of our confirmation target constants don't make sense anymore post-anchor (and one of our checks made no sense ever). So here we update them, taking this opportunity to also increase a few windows.

@wpaulinowpaulino 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.

CI has a few test failures that need to be fixed

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch 2 times, most recently from 5314c7d to dac2cc2CompareFebruary 24, 2025 20:29
@wpaulino

Copy link
Copy Markdown
Contributor

Feel free to squash

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from dac2cc2 to 84ce4f0CompareFebruary 24, 2025 21:40
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes.

@wpaulino

Copy link
Copy Markdown
Contributor

Needs rustfmt

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from 84ce4f0 to 7fb9ba1CompareFebruary 25, 2025 19:46
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grrr, done.

wpaulino
wpaulino previously approved these changes Feb 25, 2025
@TheBlueMatt
TheBlueMatt removed the request for review from arik-soMarch 4, 2025 13:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
// in with enough time left to fail the corresponding HTLC back to our inbound edge before they
// force-close on us.
// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

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.

s/after expiry/before expiry?

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.

No after. We FC a channel several blocks after an HTLC expires.

// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have
// 2*MAX_BLOCKS_FOR_CONF + ANTI_REORG_DELAY left to get two transactions on chain and the second
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

suggestion:

Suggested change
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the
// fully locked in before the inbound peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

That reads kinda confusing to me? Makes it sound like the channel was inbound from the peer, rather than the HTLC was relayed inbound from the peer?

Comment on lines 233 to 235
/// If an HTLC expires within this many blocks, force-close the channel to broadcast the
/// HTLC-Success transaction.

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.

"HTLC-Success transaction" phrasing seems to suggest this const is only used in the context of channels with inbound HTLC(s) where we have the preimage. But it seems to be used for inbounds where we don't have the preimage as well, and/or other contexts? I wonder if this could be clarified?

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.

Not directly? Its only used directly as !htlc_outbound && htlc.cltv_expiry <= height + CLTV_CLAIM_BUFFER && self.payment_preimages.contains_key(&htlc.payment_hash) and indirectly to calculate HTLC_FAIL_BACK_BUFFER which is the same concept.

The `CHECK_CLTV_EXPIRY_SANITY_2` check actually made no sense -
its use of `2*CLTV_CLAIM_BUFFER` implicitly assumed that we were
failing HTLCs `CLTV_CLAIM_BUFFER` after they expired, which is
nonsense.
Instead, we improve the readability of the docs on
`_CHECK_CLTV_EXPIRY_SANITY` and add a new
`_CHECK_CLTV_EXPIRY_OFFCHAIN` that correctly tests for what the
`CHECK_CLTV_EXPIRY_SANITY_2` check was supposed to look at.
Over the years we've built up a few tests which rely on block count
constants but without making direct references to those constants.
Here we fix three such tests to ensure changing block count
constants in the next commit do not break tests.
`test_duplicate_payment_hash_one_failure_one_success` makes a
number of assumptions which rely on our specific CLTV constants,
which we intend to change. Specifically, it relies on forwarding
two HTLCs, one which goes one hop longer, and that it can close
the channel with both HTLCs sitting on chain with enough time to
claim that it doesn't give up on them but also that they get
claimed in separate transactions.
Here we clean up, simplify, and better document the test such that
it is more resilient to future CLTV constant changes.
`CLTV_CLAIM_BUFFER`'s definition stated "this is an upper bound on
how many blocks we think it can take us to get a transaction
confirmed". This was mostly okay for pre-anchor channels, where we
broadcasted HTLC claim transactions at the same time as the
commitment transactions themselves, but for anchor channels we can
no longer do that - HTLC transactions are always CSV 1'd.
Further, when we do go to broadcast HTLC transactions, we start
the feerate estimate for them back at the users' feerate estimator,
rather than whatever feerate we ended up using to get the
commitment transaction confirmed. While we should maybe consider
changing that, for now that means that we really need to run the
whole "get a transaction confirmed" process from start to finish
*twice* in order to claim an HTLC.
Thus, `CLTV_CLAIM_BUFFER` is here redefined to be two times "the
upper bound on how many blocks we think it can take for us to get
a transaction confirmed", with a new `MAX_BLOCKS_FOR_CONF` constant
defining the expected max blocks.
In the previous commit it was observed that we actually have to run
the whole "get a transaction confirmed" process from start to
finish twice to claim an HTLC on an anchor channel. This leaves us
with only 9 blocks to get each transaction confirmed, which is
quite aggressive.
Here we double this threshold, force-closing channels which have an
expiring HTLC 36 blocks before expiry instead of 18. We also
increase the minimum CLTV expiry delta to 48 to ensure we have at
least a few blocks after the transactions get confirmed before we
need to fail the inbound edge of a forwarded HTLC back.
We do not change the default CLTV expiry delta of 72 blocks.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Cleaned up the commit history with the following additional diff, plus rebased.

diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 66f004356..d01d25bbc 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -2816,3 +2816,3 @@ pub(crate) const MAX_LOCAL_BREAKDOWN_TIMEOUT: u16 = 2 * 6 * 24 * 7;
/// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
-/// HTLC's CLTV. The current default represents roughly seven hours of blocks at six blocks/hour.+/// HTLC's CLTV. The current default represents roughly eight hours of blocks at six blocks/hour.
///
@@ -2845,3 +2845,3 @@ pub const MIN_FINAL_CLTV_EXPIRY_DELTA: u16 = HTLC_FAIL_BACK_BUFFER as u16 + 3;
// force-close on us.
-// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our+// In other words, if the next-hop peer fails HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from d078b10 to e7c2a61CompareMarch 5, 2025 19:23
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.

3 participants

@TheBlueMatt@wpaulino@valentinewallace
, '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('^' + ".*" + ' Correct and update confirmation target constant definitions by TheBlueMatt · Pull Request #3608 · lightningdevkit/rust-lightning · GitHub
Skip to content

Correct and update confirmation target constant definitions - #3608

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants
Mar 6, 2025
Merged

Correct and update confirmation target constant definitions#3608
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

In the process of #3340 I noticed a bunch of our confirmation target constants don't make sense anymore post-anchor (and one of our checks made no sense ever). So here we update them, taking this opportunity to also increase a few windows.

@wpaulinowpaulino 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.

CI has a few test failures that need to be fixed

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch 2 times, most recently from 5314c7d to dac2cc2CompareFebruary 24, 2025 20:29
@wpaulino

Copy link
Copy Markdown
Contributor

Feel free to squash

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from dac2cc2 to 84ce4f0CompareFebruary 24, 2025 21:40
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes.

@wpaulino

Copy link
Copy Markdown
Contributor

Needs rustfmt

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from 84ce4f0 to 7fb9ba1CompareFebruary 25, 2025 19:46
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grrr, done.

wpaulino
wpaulino previously approved these changes Feb 25, 2025
@TheBlueMatt
TheBlueMatt removed the request for review from arik-soMarch 4, 2025 13:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
// in with enough time left to fail the corresponding HTLC back to our inbound edge before they
// force-close on us.
// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

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.

s/after expiry/before expiry?

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.

No after. We FC a channel several blocks after an HTLC expires.

// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have
// 2*MAX_BLOCKS_FOR_CONF + ANTI_REORG_DELAY left to get two transactions on chain and the second
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

suggestion:

Suggested change
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the
// fully locked in before the inbound peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

That reads kinda confusing to me? Makes it sound like the channel was inbound from the peer, rather than the HTLC was relayed inbound from the peer?

Comment on lines 233 to 235
/// If an HTLC expires within this many blocks, force-close the channel to broadcast the
/// HTLC-Success transaction.

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.

"HTLC-Success transaction" phrasing seems to suggest this const is only used in the context of channels with inbound HTLC(s) where we have the preimage. But it seems to be used for inbounds where we don't have the preimage as well, and/or other contexts? I wonder if this could be clarified?

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.

Not directly? Its only used directly as !htlc_outbound && htlc.cltv_expiry <= height + CLTV_CLAIM_BUFFER && self.payment_preimages.contains_key(&htlc.payment_hash) and indirectly to calculate HTLC_FAIL_BACK_BUFFER which is the same concept.

The `CHECK_CLTV_EXPIRY_SANITY_2` check actually made no sense -
its use of `2*CLTV_CLAIM_BUFFER` implicitly assumed that we were
failing HTLCs `CLTV_CLAIM_BUFFER` after they expired, which is
nonsense.
Instead, we improve the readability of the docs on
`_CHECK_CLTV_EXPIRY_SANITY` and add a new
`_CHECK_CLTV_EXPIRY_OFFCHAIN` that correctly tests for what the
`CHECK_CLTV_EXPIRY_SANITY_2` check was supposed to look at.
Over the years we've built up a few tests which rely on block count
constants but without making direct references to those constants.
Here we fix three such tests to ensure changing block count
constants in the next commit do not break tests.
`test_duplicate_payment_hash_one_failure_one_success` makes a
number of assumptions which rely on our specific CLTV constants,
which we intend to change. Specifically, it relies on forwarding
two HTLCs, one which goes one hop longer, and that it can close
the channel with both HTLCs sitting on chain with enough time to
claim that it doesn't give up on them but also that they get
claimed in separate transactions.
Here we clean up, simplify, and better document the test such that
it is more resilient to future CLTV constant changes.
`CLTV_CLAIM_BUFFER`'s definition stated "this is an upper bound on
how many blocks we think it can take us to get a transaction
confirmed". This was mostly okay for pre-anchor channels, where we
broadcasted HTLC claim transactions at the same time as the
commitment transactions themselves, but for anchor channels we can
no longer do that - HTLC transactions are always CSV 1'd.
Further, when we do go to broadcast HTLC transactions, we start
the feerate estimate for them back at the users' feerate estimator,
rather than whatever feerate we ended up using to get the
commitment transaction confirmed. While we should maybe consider
changing that, for now that means that we really need to run the
whole "get a transaction confirmed" process from start to finish
*twice* in order to claim an HTLC.
Thus, `CLTV_CLAIM_BUFFER` is here redefined to be two times "the
upper bound on how many blocks we think it can take for us to get
a transaction confirmed", with a new `MAX_BLOCKS_FOR_CONF` constant
defining the expected max blocks.
In the previous commit it was observed that we actually have to run
the whole "get a transaction confirmed" process from start to
finish twice to claim an HTLC on an anchor channel. This leaves us
with only 9 blocks to get each transaction confirmed, which is
quite aggressive.
Here we double this threshold, force-closing channels which have an
expiring HTLC 36 blocks before expiry instead of 18. We also
increase the minimum CLTV expiry delta to 48 to ensure we have at
least a few blocks after the transactions get confirmed before we
need to fail the inbound edge of a forwarded HTLC back.
We do not change the default CLTV expiry delta of 72 blocks.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Cleaned up the commit history with the following additional diff, plus rebased.

diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 66f004356..d01d25bbc 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -2816,3 +2816,3 @@ pub(crate) const MAX_LOCAL_BREAKDOWN_TIMEOUT: u16 = 2 * 6 * 24 * 7;
/// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
-/// HTLC's CLTV. The current default represents roughly seven hours of blocks at six blocks/hour.+/// HTLC's CLTV. The current default represents roughly eight hours of blocks at six blocks/hour.
///
@@ -2845,3 +2845,3 @@ pub const MIN_FINAL_CLTV_EXPIRY_DELTA: u16 = HTLC_FAIL_BACK_BUFFER as u16 + 3;
// force-close on us.
-// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our+// In other words, if the next-hop peer fails HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from d078b10 to e7c2a61CompareMarch 5, 2025 19:23
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.

3 participants

@TheBlueMatt@wpaulino@valentinewallace
, '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('^' + ".*" + ' Correct and update confirmation target constant definitions by TheBlueMatt · Pull Request #3608 · lightningdevkit/rust-lightning · GitHub
Skip to content

Correct and update confirmation target constant definitions - #3608

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants
Mar 6, 2025
Merged

Correct and update confirmation target constant definitions#3608
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

In the process of #3340 I noticed a bunch of our confirmation target constants don't make sense anymore post-anchor (and one of our checks made no sense ever). So here we update them, taking this opportunity to also increase a few windows.

@wpaulinowpaulino 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.

CI has a few test failures that need to be fixed

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch 2 times, most recently from 5314c7d to dac2cc2CompareFebruary 24, 2025 20:29
@wpaulino

Copy link
Copy Markdown
Contributor

Feel free to squash

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from dac2cc2 to 84ce4f0CompareFebruary 24, 2025 21:40
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes.

@wpaulino

Copy link
Copy Markdown
Contributor

Needs rustfmt

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from 84ce4f0 to 7fb9ba1CompareFebruary 25, 2025 19:46
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grrr, done.

wpaulino
wpaulino previously approved these changes Feb 25, 2025
@TheBlueMatt
TheBlueMatt removed the request for review from arik-soMarch 4, 2025 13:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
// in with enough time left to fail the corresponding HTLC back to our inbound edge before they
// force-close on us.
// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

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.

s/after expiry/before expiry?

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.

No after. We FC a channel several blocks after an HTLC expires.

// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have
// 2*MAX_BLOCKS_FOR_CONF + ANTI_REORG_DELAY left to get two transactions on chain and the second
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

suggestion:

Suggested change
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the
// fully locked in before the inbound peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

That reads kinda confusing to me? Makes it sound like the channel was inbound from the peer, rather than the HTLC was relayed inbound from the peer?

Comment on lines 233 to 235
/// If an HTLC expires within this many blocks, force-close the channel to broadcast the
/// HTLC-Success transaction.

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.

"HTLC-Success transaction" phrasing seems to suggest this const is only used in the context of channels with inbound HTLC(s) where we have the preimage. But it seems to be used for inbounds where we don't have the preimage as well, and/or other contexts? I wonder if this could be clarified?

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.

Not directly? Its only used directly as !htlc_outbound && htlc.cltv_expiry <= height + CLTV_CLAIM_BUFFER && self.payment_preimages.contains_key(&htlc.payment_hash) and indirectly to calculate HTLC_FAIL_BACK_BUFFER which is the same concept.

The `CHECK_CLTV_EXPIRY_SANITY_2` check actually made no sense -
its use of `2*CLTV_CLAIM_BUFFER` implicitly assumed that we were
failing HTLCs `CLTV_CLAIM_BUFFER` after they expired, which is
nonsense.
Instead, we improve the readability of the docs on
`_CHECK_CLTV_EXPIRY_SANITY` and add a new
`_CHECK_CLTV_EXPIRY_OFFCHAIN` that correctly tests for what the
`CHECK_CLTV_EXPIRY_SANITY_2` check was supposed to look at.
Over the years we've built up a few tests which rely on block count
constants but without making direct references to those constants.
Here we fix three such tests to ensure changing block count
constants in the next commit do not break tests.
`test_duplicate_payment_hash_one_failure_one_success` makes a
number of assumptions which rely on our specific CLTV constants,
which we intend to change. Specifically, it relies on forwarding
two HTLCs, one which goes one hop longer, and that it can close
the channel with both HTLCs sitting on chain with enough time to
claim that it doesn't give up on them but also that they get
claimed in separate transactions.
Here we clean up, simplify, and better document the test such that
it is more resilient to future CLTV constant changes.
`CLTV_CLAIM_BUFFER`'s definition stated "this is an upper bound on
how many blocks we think it can take us to get a transaction
confirmed". This was mostly okay for pre-anchor channels, where we
broadcasted HTLC claim transactions at the same time as the
commitment transactions themselves, but for anchor channels we can
no longer do that - HTLC transactions are always CSV 1'd.
Further, when we do go to broadcast HTLC transactions, we start
the feerate estimate for them back at the users' feerate estimator,
rather than whatever feerate we ended up using to get the
commitment transaction confirmed. While we should maybe consider
changing that, for now that means that we really need to run the
whole "get a transaction confirmed" process from start to finish
*twice* in order to claim an HTLC.
Thus, `CLTV_CLAIM_BUFFER` is here redefined to be two times "the
upper bound on how many blocks we think it can take for us to get
a transaction confirmed", with a new `MAX_BLOCKS_FOR_CONF` constant
defining the expected max blocks.
In the previous commit it was observed that we actually have to run
the whole "get a transaction confirmed" process from start to
finish twice to claim an HTLC on an anchor channel. This leaves us
with only 9 blocks to get each transaction confirmed, which is
quite aggressive.
Here we double this threshold, force-closing channels which have an
expiring HTLC 36 blocks before expiry instead of 18. We also
increase the minimum CLTV expiry delta to 48 to ensure we have at
least a few blocks after the transactions get confirmed before we
need to fail the inbound edge of a forwarded HTLC back.
We do not change the default CLTV expiry delta of 72 blocks.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Cleaned up the commit history with the following additional diff, plus rebased.

diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 66f004356..d01d25bbc 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -2816,3 +2816,3 @@ pub(crate) const MAX_LOCAL_BREAKDOWN_TIMEOUT: u16 = 2 * 6 * 24 * 7;
/// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
-/// HTLC's CLTV. The current default represents roughly seven hours of blocks at six blocks/hour.+/// HTLC's CLTV. The current default represents roughly eight hours of blocks at six blocks/hour.
///
@@ -2845,3 +2845,3 @@ pub const MIN_FINAL_CLTV_EXPIRY_DELTA: u16 = HTLC_FAIL_BACK_BUFFER as u16 + 3;
// force-close on us.
-// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our+// In other words, if the next-hop peer fails HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from d078b10 to e7c2a61CompareMarch 5, 2025 19:23
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.

3 participants

@TheBlueMatt@wpaulino@valentinewallace
, '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" + ' Correct and update confirmation target constant definitions by TheBlueMatt · Pull Request #3608 · lightningdevkit/rust-lightning · GitHub
Skip to content

Correct and update confirmation target constant definitions - #3608

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants
Mar 6, 2025
Merged

Correct and update confirmation target constant definitions#3608
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

In the process of #3340 I noticed a bunch of our confirmation target constants don't make sense anymore post-anchor (and one of our checks made no sense ever). So here we update them, taking this opportunity to also increase a few windows.

@wpaulinowpaulino 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.

CI has a few test failures that need to be fixed

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch 2 times, most recently from 5314c7d to dac2cc2CompareFebruary 24, 2025 20:29
@wpaulino

Copy link
Copy Markdown
Contributor

Feel free to squash

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from dac2cc2 to 84ce4f0CompareFebruary 24, 2025 21:40
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes.

@wpaulino

Copy link
Copy Markdown
Contributor

Needs rustfmt

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from 84ce4f0 to 7fb9ba1CompareFebruary 25, 2025 19:46
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grrr, done.

wpaulino
wpaulino previously approved these changes Feb 25, 2025
@TheBlueMatt
TheBlueMatt removed the request for review from arik-soMarch 4, 2025 13:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
// in with enough time left to fail the corresponding HTLC back to our inbound edge before they
// force-close on us.
// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

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.

s/after expiry/before expiry?

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.

No after. We FC a channel several blocks after an HTLC expires.

// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have
// 2*MAX_BLOCKS_FOR_CONF + ANTI_REORG_DELAY left to get two transactions on chain and the second
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

suggestion:

Suggested change
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the
// fully locked in before the inbound peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

That reads kinda confusing to me? Makes it sound like the channel was inbound from the peer, rather than the HTLC was relayed inbound from the peer?

Comment on lines 233 to 235
/// If an HTLC expires within this many blocks, force-close the channel to broadcast the
/// HTLC-Success transaction.

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.

"HTLC-Success transaction" phrasing seems to suggest this const is only used in the context of channels with inbound HTLC(s) where we have the preimage. But it seems to be used for inbounds where we don't have the preimage as well, and/or other contexts? I wonder if this could be clarified?

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.

Not directly? Its only used directly as !htlc_outbound && htlc.cltv_expiry <= height + CLTV_CLAIM_BUFFER && self.payment_preimages.contains_key(&htlc.payment_hash) and indirectly to calculate HTLC_FAIL_BACK_BUFFER which is the same concept.

The `CHECK_CLTV_EXPIRY_SANITY_2` check actually made no sense -
its use of `2*CLTV_CLAIM_BUFFER` implicitly assumed that we were
failing HTLCs `CLTV_CLAIM_BUFFER` after they expired, which is
nonsense.
Instead, we improve the readability of the docs on
`_CHECK_CLTV_EXPIRY_SANITY` and add a new
`_CHECK_CLTV_EXPIRY_OFFCHAIN` that correctly tests for what the
`CHECK_CLTV_EXPIRY_SANITY_2` check was supposed to look at.
Over the years we've built up a few tests which rely on block count
constants but without making direct references to those constants.
Here we fix three such tests to ensure changing block count
constants in the next commit do not break tests.
`test_duplicate_payment_hash_one_failure_one_success` makes a
number of assumptions which rely on our specific CLTV constants,
which we intend to change. Specifically, it relies on forwarding
two HTLCs, one which goes one hop longer, and that it can close
the channel with both HTLCs sitting on chain with enough time to
claim that it doesn't give up on them but also that they get
claimed in separate transactions.
Here we clean up, simplify, and better document the test such that
it is more resilient to future CLTV constant changes.
`CLTV_CLAIM_BUFFER`'s definition stated "this is an upper bound on
how many blocks we think it can take us to get a transaction
confirmed". This was mostly okay for pre-anchor channels, where we
broadcasted HTLC claim transactions at the same time as the
commitment transactions themselves, but for anchor channels we can
no longer do that - HTLC transactions are always CSV 1'd.
Further, when we do go to broadcast HTLC transactions, we start
the feerate estimate for them back at the users' feerate estimator,
rather than whatever feerate we ended up using to get the
commitment transaction confirmed. While we should maybe consider
changing that, for now that means that we really need to run the
whole "get a transaction confirmed" process from start to finish
*twice* in order to claim an HTLC.
Thus, `CLTV_CLAIM_BUFFER` is here redefined to be two times "the
upper bound on how many blocks we think it can take for us to get
a transaction confirmed", with a new `MAX_BLOCKS_FOR_CONF` constant
defining the expected max blocks.
In the previous commit it was observed that we actually have to run
the whole "get a transaction confirmed" process from start to
finish twice to claim an HTLC on an anchor channel. This leaves us
with only 9 blocks to get each transaction confirmed, which is
quite aggressive.
Here we double this threshold, force-closing channels which have an
expiring HTLC 36 blocks before expiry instead of 18. We also
increase the minimum CLTV expiry delta to 48 to ensure we have at
least a few blocks after the transactions get confirmed before we
need to fail the inbound edge of a forwarded HTLC back.
We do not change the default CLTV expiry delta of 72 blocks.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Cleaned up the commit history with the following additional diff, plus rebased.

diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 66f004356..d01d25bbc 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -2816,3 +2816,3 @@ pub(crate) const MAX_LOCAL_BREAKDOWN_TIMEOUT: u16 = 2 * 6 * 24 * 7;
/// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
-/// HTLC's CLTV. The current default represents roughly seven hours of blocks at six blocks/hour.+/// HTLC's CLTV. The current default represents roughly eight hours of blocks at six blocks/hour.
///
@@ -2845,3 +2845,3 @@ pub const MIN_FINAL_CLTV_EXPIRY_DELTA: u16 = HTLC_FAIL_BACK_BUFFER as u16 + 3;
// force-close on us.
-// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our+// In other words, if the next-hop peer fails HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from d078b10 to e7c2a61CompareMarch 5, 2025 19:23
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.

3 participants

@TheBlueMatt@wpaulino@valentinewallace
, '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('^' + ".*" + ' Correct and update confirmation target constant definitions by TheBlueMatt · Pull Request #3608 · lightningdevkit/rust-lightning · GitHub
Skip to content

Correct and update confirmation target constant definitions - #3608

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants
Mar 6, 2025
Merged

Correct and update confirmation target constant definitions#3608
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

In the process of #3340 I noticed a bunch of our confirmation target constants don't make sense anymore post-anchor (and one of our checks made no sense ever). So here we update them, taking this opportunity to also increase a few windows.

@wpaulinowpaulino 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.

CI has a few test failures that need to be fixed

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch 2 times, most recently from 5314c7d to dac2cc2CompareFebruary 24, 2025 20:29
@wpaulino

Copy link
Copy Markdown
Contributor

Feel free to squash

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from dac2cc2 to 84ce4f0CompareFebruary 24, 2025 21:40
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes.

@wpaulino

Copy link
Copy Markdown
Contributor

Needs rustfmt

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from 84ce4f0 to 7fb9ba1CompareFebruary 25, 2025 19:46
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grrr, done.

wpaulino
wpaulino previously approved these changes Feb 25, 2025
@TheBlueMatt
TheBlueMatt removed the request for review from arik-soMarch 4, 2025 13:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
// in with enough time left to fail the corresponding HTLC back to our inbound edge before they
// force-close on us.
// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

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.

s/after expiry/before expiry?

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.

No after. We FC a channel several blocks after an HTLC expires.

// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have
// 2*MAX_BLOCKS_FOR_CONF + ANTI_REORG_DELAY left to get two transactions on chain and the second
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

suggestion:

Suggested change
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the
// fully locked in before the inbound peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

That reads kinda confusing to me? Makes it sound like the channel was inbound from the peer, rather than the HTLC was relayed inbound from the peer?

Comment on lines 233 to 235
/// If an HTLC expires within this many blocks, force-close the channel to broadcast the
/// HTLC-Success transaction.

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.

"HTLC-Success transaction" phrasing seems to suggest this const is only used in the context of channels with inbound HTLC(s) where we have the preimage. But it seems to be used for inbounds where we don't have the preimage as well, and/or other contexts? I wonder if this could be clarified?

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.

Not directly? Its only used directly as !htlc_outbound && htlc.cltv_expiry <= height + CLTV_CLAIM_BUFFER && self.payment_preimages.contains_key(&htlc.payment_hash) and indirectly to calculate HTLC_FAIL_BACK_BUFFER which is the same concept.

The `CHECK_CLTV_EXPIRY_SANITY_2` check actually made no sense -
its use of `2*CLTV_CLAIM_BUFFER` implicitly assumed that we were
failing HTLCs `CLTV_CLAIM_BUFFER` after they expired, which is
nonsense.
Instead, we improve the readability of the docs on
`_CHECK_CLTV_EXPIRY_SANITY` and add a new
`_CHECK_CLTV_EXPIRY_OFFCHAIN` that correctly tests for what the
`CHECK_CLTV_EXPIRY_SANITY_2` check was supposed to look at.
Over the years we've built up a few tests which rely on block count
constants but without making direct references to those constants.
Here we fix three such tests to ensure changing block count
constants in the next commit do not break tests.
`test_duplicate_payment_hash_one_failure_one_success` makes a
number of assumptions which rely on our specific CLTV constants,
which we intend to change. Specifically, it relies on forwarding
two HTLCs, one which goes one hop longer, and that it can close
the channel with both HTLCs sitting on chain with enough time to
claim that it doesn't give up on them but also that they get
claimed in separate transactions.
Here we clean up, simplify, and better document the test such that
it is more resilient to future CLTV constant changes.
`CLTV_CLAIM_BUFFER`'s definition stated "this is an upper bound on
how many blocks we think it can take us to get a transaction
confirmed". This was mostly okay for pre-anchor channels, where we
broadcasted HTLC claim transactions at the same time as the
commitment transactions themselves, but for anchor channels we can
no longer do that - HTLC transactions are always CSV 1'd.
Further, when we do go to broadcast HTLC transactions, we start
the feerate estimate for them back at the users' feerate estimator,
rather than whatever feerate we ended up using to get the
commitment transaction confirmed. While we should maybe consider
changing that, for now that means that we really need to run the
whole "get a transaction confirmed" process from start to finish
*twice* in order to claim an HTLC.
Thus, `CLTV_CLAIM_BUFFER` is here redefined to be two times "the
upper bound on how many blocks we think it can take for us to get
a transaction confirmed", with a new `MAX_BLOCKS_FOR_CONF` constant
defining the expected max blocks.
In the previous commit it was observed that we actually have to run
the whole "get a transaction confirmed" process from start to
finish twice to claim an HTLC on an anchor channel. This leaves us
with only 9 blocks to get each transaction confirmed, which is
quite aggressive.
Here we double this threshold, force-closing channels which have an
expiring HTLC 36 blocks before expiry instead of 18. We also
increase the minimum CLTV expiry delta to 48 to ensure we have at
least a few blocks after the transactions get confirmed before we
need to fail the inbound edge of a forwarded HTLC back.
We do not change the default CLTV expiry delta of 72 blocks.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Cleaned up the commit history with the following additional diff, plus rebased.

diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 66f004356..d01d25bbc 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -2816,3 +2816,3 @@ pub(crate) const MAX_LOCAL_BREAKDOWN_TIMEOUT: u16 = 2 * 6 * 24 * 7;
/// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
-/// HTLC's CLTV. The current default represents roughly seven hours of blocks at six blocks/hour.+/// HTLC's CLTV. The current default represents roughly eight hours of blocks at six blocks/hour.
///
@@ -2845,3 +2845,3 @@ pub const MIN_FINAL_CLTV_EXPIRY_DELTA: u16 = HTLC_FAIL_BACK_BUFFER as u16 + 3;
// force-close on us.
-// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our+// In other words, if the next-hop peer fails HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from d078b10 to e7c2a61CompareMarch 5, 2025 19:23
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.

3 participants

@TheBlueMatt@wpaulino@valentinewallace
, '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('^' + ".*" + ' Correct and update confirmation target constant definitions by TheBlueMatt · Pull Request #3608 · lightningdevkit/rust-lightning · GitHub
Skip to content

Correct and update confirmation target constant definitions - #3608

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants
Mar 6, 2025
Merged

Correct and update confirmation target constant definitions#3608
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

In the process of #3340 I noticed a bunch of our confirmation target constants don't make sense anymore post-anchor (and one of our checks made no sense ever). So here we update them, taking this opportunity to also increase a few windows.

@wpaulinowpaulino 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.

CI has a few test failures that need to be fixed

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch 2 times, most recently from 5314c7d to dac2cc2CompareFebruary 24, 2025 20:29
@wpaulino

Copy link
Copy Markdown
Contributor

Feel free to squash

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from dac2cc2 to 84ce4f0CompareFebruary 24, 2025 21:40
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes.

@wpaulino

Copy link
Copy Markdown
Contributor

Needs rustfmt

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from 84ce4f0 to 7fb9ba1CompareFebruary 25, 2025 19:46
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grrr, done.

wpaulino
wpaulino previously approved these changes Feb 25, 2025
@TheBlueMatt
TheBlueMatt removed the request for review from arik-soMarch 4, 2025 13:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
// in with enough time left to fail the corresponding HTLC back to our inbound edge before they
// force-close on us.
// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

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.

s/after expiry/before expiry?

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.

No after. We FC a channel several blocks after an HTLC expires.

// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have
// 2*MAX_BLOCKS_FOR_CONF + ANTI_REORG_DELAY left to get two transactions on chain and the second
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

suggestion:

Suggested change
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the
// fully locked in before the inbound peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

That reads kinda confusing to me? Makes it sound like the channel was inbound from the peer, rather than the HTLC was relayed inbound from the peer?

Comment on lines 233 to 235
/// If an HTLC expires within this many blocks, force-close the channel to broadcast the
/// HTLC-Success transaction.

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.

"HTLC-Success transaction" phrasing seems to suggest this const is only used in the context of channels with inbound HTLC(s) where we have the preimage. But it seems to be used for inbounds where we don't have the preimage as well, and/or other contexts? I wonder if this could be clarified?

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.

Not directly? Its only used directly as !htlc_outbound && htlc.cltv_expiry <= height + CLTV_CLAIM_BUFFER && self.payment_preimages.contains_key(&htlc.payment_hash) and indirectly to calculate HTLC_FAIL_BACK_BUFFER which is the same concept.

The `CHECK_CLTV_EXPIRY_SANITY_2` check actually made no sense -
its use of `2*CLTV_CLAIM_BUFFER` implicitly assumed that we were
failing HTLCs `CLTV_CLAIM_BUFFER` after they expired, which is
nonsense.
Instead, we improve the readability of the docs on
`_CHECK_CLTV_EXPIRY_SANITY` and add a new
`_CHECK_CLTV_EXPIRY_OFFCHAIN` that correctly tests for what the
`CHECK_CLTV_EXPIRY_SANITY_2` check was supposed to look at.
Over the years we've built up a few tests which rely on block count
constants but without making direct references to those constants.
Here we fix three such tests to ensure changing block count
constants in the next commit do not break tests.
`test_duplicate_payment_hash_one_failure_one_success` makes a
number of assumptions which rely on our specific CLTV constants,
which we intend to change. Specifically, it relies on forwarding
two HTLCs, one which goes one hop longer, and that it can close
the channel with both HTLCs sitting on chain with enough time to
claim that it doesn't give up on them but also that they get
claimed in separate transactions.
Here we clean up, simplify, and better document the test such that
it is more resilient to future CLTV constant changes.
`CLTV_CLAIM_BUFFER`'s definition stated "this is an upper bound on
how many blocks we think it can take us to get a transaction
confirmed". This was mostly okay for pre-anchor channels, where we
broadcasted HTLC claim transactions at the same time as the
commitment transactions themselves, but for anchor channels we can
no longer do that - HTLC transactions are always CSV 1'd.
Further, when we do go to broadcast HTLC transactions, we start
the feerate estimate for them back at the users' feerate estimator,
rather than whatever feerate we ended up using to get the
commitment transaction confirmed. While we should maybe consider
changing that, for now that means that we really need to run the
whole "get a transaction confirmed" process from start to finish
*twice* in order to claim an HTLC.
Thus, `CLTV_CLAIM_BUFFER` is here redefined to be two times "the
upper bound on how many blocks we think it can take for us to get
a transaction confirmed", with a new `MAX_BLOCKS_FOR_CONF` constant
defining the expected max blocks.
In the previous commit it was observed that we actually have to run
the whole "get a transaction confirmed" process from start to
finish twice to claim an HTLC on an anchor channel. This leaves us
with only 9 blocks to get each transaction confirmed, which is
quite aggressive.
Here we double this threshold, force-closing channels which have an
expiring HTLC 36 blocks before expiry instead of 18. We also
increase the minimum CLTV expiry delta to 48 to ensure we have at
least a few blocks after the transactions get confirmed before we
need to fail the inbound edge of a forwarded HTLC back.
We do not change the default CLTV expiry delta of 72 blocks.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Cleaned up the commit history with the following additional diff, plus rebased.

diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 66f004356..d01d25bbc 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -2816,3 +2816,3 @@ pub(crate) const MAX_LOCAL_BREAKDOWN_TIMEOUT: u16 = 2 * 6 * 24 * 7;
/// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
-/// HTLC's CLTV. The current default represents roughly seven hours of blocks at six blocks/hour.+/// HTLC's CLTV. The current default represents roughly eight hours of blocks at six blocks/hour.
///
@@ -2845,3 +2845,3 @@ pub const MIN_FINAL_CLTV_EXPIRY_DELTA: u16 = HTLC_FAIL_BACK_BUFFER as u16 + 3;
// force-close on us.
-// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our+// In other words, if the next-hop peer fails HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from d078b10 to e7c2a61CompareMarch 5, 2025 19:23
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.

3 participants

@TheBlueMatt@wpaulino@valentinewallace
, '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); } })(); })(); Correct and update confirmation target constant definitions by TheBlueMatt · Pull Request #3608 · lightningdevkit/rust-lightning · GitHub
Skip to content

Correct and update confirmation target constant definitions - #3608

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants
Mar 6, 2025
Merged

Correct and update confirmation target constant definitions#3608
TheBlueMatt merged 5 commits into
lightningdevkit:mainfrom
TheBlueMatt:2025-02-better-block-constants

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

In the process of #3340 I noticed a bunch of our confirmation target constants don't make sense anymore post-anchor (and one of our checks made no sense ever). So here we update them, taking this opportunity to also increase a few windows.

@wpaulinowpaulino 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.

CI has a few test failures that need to be fixed

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
Comment threadlightning/src/ln/functional_tests.rs Outdated
@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch 2 times, most recently from 5314c7d to dac2cc2CompareFebruary 24, 2025 20:29
@wpaulino

Copy link
Copy Markdown
Contributor

Feel free to squash

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from dac2cc2 to 84ce4f0CompareFebruary 24, 2025 21:40
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed without changes.

@wpaulino

Copy link
Copy Markdown
Contributor

Needs rustfmt

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from 84ce4f0 to 7fb9ba1CompareFebruary 25, 2025 19:46
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Grrr, done.

wpaulino
wpaulino previously approved these changes Feb 25, 2025
@TheBlueMatt
TheBlueMatt removed the request for review from arik-soMarch 4, 2025 13:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
// in with enough time left to fail the corresponding HTLC back to our inbound edge before they
// force-close on us.
// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

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.

s/after expiry/before expiry?

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.

No after. We FC a channel several blocks after an HTLC expires.

// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have
// 2*MAX_BLOCKS_FOR_CONF + ANTI_REORG_DELAY left to get two transactions on chain and the second
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

suggestion:

Suggested change
// fully locked in before the peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the
// fully locked in before the inbound peer force-closes on us (LATENCY_GRACE_PERIOD_BLOCKS before the

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.

That reads kinda confusing to me? Makes it sound like the channel was inbound from the peer, rather than the HTLC was relayed inbound from the peer?

Comment on lines 233 to 235
/// If an HTLC expires within this many blocks, force-close the channel to broadcast the
/// HTLC-Success transaction.

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.

"HTLC-Success transaction" phrasing seems to suggest this const is only used in the context of channels with inbound HTLC(s) where we have the preimage. But it seems to be used for inbounds where we don't have the preimage as well, and/or other contexts? I wonder if this could be clarified?

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.

Not directly? Its only used directly as !htlc_outbound && htlc.cltv_expiry <= height + CLTV_CLAIM_BUFFER && self.payment_preimages.contains_key(&htlc.payment_hash) and indirectly to calculate HTLC_FAIL_BACK_BUFFER which is the same concept.

The `CHECK_CLTV_EXPIRY_SANITY_2` check actually made no sense -
its use of `2*CLTV_CLAIM_BUFFER` implicitly assumed that we were
failing HTLCs `CLTV_CLAIM_BUFFER` after they expired, which is
nonsense.
Instead, we improve the readability of the docs on
`_CHECK_CLTV_EXPIRY_SANITY` and add a new
`_CHECK_CLTV_EXPIRY_OFFCHAIN` that correctly tests for what the
`CHECK_CLTV_EXPIRY_SANITY_2` check was supposed to look at.
Over the years we've built up a few tests which rely on block count
constants but without making direct references to those constants.
Here we fix three such tests to ensure changing block count
constants in the next commit do not break tests.
`test_duplicate_payment_hash_one_failure_one_success` makes a
number of assumptions which rely on our specific CLTV constants,
which we intend to change. Specifically, it relies on forwarding
two HTLCs, one which goes one hop longer, and that it can close
the channel with both HTLCs sitting on chain with enough time to
claim that it doesn't give up on them but also that they get
claimed in separate transactions.
Here we clean up, simplify, and better document the test such that
it is more resilient to future CLTV constant changes.
`CLTV_CLAIM_BUFFER`'s definition stated "this is an upper bound on
how many blocks we think it can take us to get a transaction
confirmed". This was mostly okay for pre-anchor channels, where we
broadcasted HTLC claim transactions at the same time as the
commitment transactions themselves, but for anchor channels we can
no longer do that - HTLC transactions are always CSV 1'd.
Further, when we do go to broadcast HTLC transactions, we start
the feerate estimate for them back at the users' feerate estimator,
rather than whatever feerate we ended up using to get the
commitment transaction confirmed. While we should maybe consider
changing that, for now that means that we really need to run the
whole "get a transaction confirmed" process from start to finish
*twice* in order to claim an HTLC.
Thus, `CLTV_CLAIM_BUFFER` is here redefined to be two times "the
upper bound on how many blocks we think it can take for us to get
a transaction confirmed", with a new `MAX_BLOCKS_FOR_CONF` constant
defining the expected max blocks.
In the previous commit it was observed that we actually have to run
the whole "get a transaction confirmed" process from start to
finish twice to claim an HTLC on an anchor channel. This leaves us
with only 9 blocks to get each transaction confirmed, which is
quite aggressive.
Here we double this threshold, force-closing channels which have an
expiring HTLC 36 blocks before expiry instead of 18. We also
increase the minimum CLTV expiry delta to 48 to ensure we have at
least a few blocks after the transactions get confirmed before we
need to fail the inbound edge of a forwarded HTLC back.
We do not change the default CLTV expiry delta of 72 blocks.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Cleaned up the commit history with the following additional diff, plus rebased.

diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index 66f004356..d01d25bbc 100644
--- a/lightning/src/ln/channelmanager.rs+++ b/lightning/src/ln/channelmanager.rs@@ -2816,3 +2816,3 @@ pub(crate) const MAX_LOCAL_BREAKDOWN_TIMEOUT: u16 = 2 * 6 * 24 * 7;
/// The minimum number of blocks between an inbound HTLC's CLTV and the corresponding outbound
-/// HTLC's CLTV. The current default represents roughly seven hours of blocks at six blocks/hour.+/// HTLC's CLTV. The current default represents roughly eight hours of blocks at six blocks/hour.
///
@@ -2845,3 +2845,3 @@ pub const MIN_FINAL_CLTV_EXPIRY_DELTA: u16 = HTLC_FAIL_BACK_BUFFER as u16 + 3;
// force-close on us.
-// In other words, if the next-hop peer fails the HTLC LATENCY_GRACE_PERIOD_BLOCKS after our+// In other words, if the next-hop peer fails HTLC LATENCY_GRACE_PERIOD_BLOCKS after our
// CLTV_CLAIM_BUFFER (because that's how many blocks we allow them after expiry), we'll still have

@TheBlueMatt
TheBlueMattforce-pushed the 2025-02-better-block-constants branch from d078b10 to e7c2a61CompareMarch 5, 2025 19:23
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.

3 participants

@TheBlueMatt@wpaulino@valentinewallace