[0.1] Backports for 0.1.4 - #3794

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports
May 23, 2025
Merged

[0.1] Backports for 0.1.4#3794
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented May 23, 2025

Copy link
Copy Markdown
Collaborator

Backport of #3772, two commits from #3584, and #3790. The two commits from #3584 are kinda awkward (testing upgrade from 0.1 to 0.1) but it seems weirder to drop the test in a backport and it exposes a few more methods as public (which may be helpful for later upgrade tests from 0.1 to git/0.2/etc).

EDIT: Plus #3796

When we begin claiming a payment, we move the tracking of it from
`claimable_payments` to `claiming_payments`. This ensures we only
ever have one payment which is in the process of being claimed with
a given payment hash at a time and lets us keep track of when all
parts have been claimed with their `ChannelMonitor`s.
However, on startup, we check that failing to move a payment from
`claimable_payments` to `claiming_payments` implies that it is not
present in `claiming_payments`. This is fine if the payment doesn't
exist, but if the payment has already started being claimed, this
will fail and we'll refuse to deserialize the `ChannelManager`
(with a `debug_assert` failure in debug mode).
Here we resolve this by checking if a payment is already being
claimed before we attempt to initiate claiming and skip the failing
check in that case.
@ldk-reviews-bot

ldk-reviews-bot commented May 23, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@wpaulino

Copy link
Copy Markdown
Contributor

Should probably fix the fuzz build before merging

@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from fe127cc to 5790a02CompareMay 23, 2025 17:57
The signer we use in tests tracks the state of the channel and
refuses to sign when the channel attempts an invalid state
transition. In the next commit, however, we'll add an upgrade test
which will fail these checks as the the state won't get copied from
previous versions of LDK to this version.
Thus, here, we add the ability to disable all state-based checks
in the signer.
One major hole in our test coverage historically has been tests
covering upgrades or downgrades across LDK versions. Luckily, these
aren't particularly hard to write as cargo lets us depend on
previous versions of the `lightning` crate directly, which we can
use in tests.
Here we add a simple initial test of upgrading from LDK 0.1 while
there's a pending payment to be claimed.
In 93b4479 we fixed an issue which
could cause a `ChannelMonitorUpdate` to get marked as blocked on
itself, leading to an eventual force-closure.
One potential side-effect of that issue, however, is that any
further `ChannelMonitorUpdate`s to the same channel while it is
blocked will not have any post-update actions processed (as there
is a pending blocked `ChannelMonitorUpdate` sitting in the
channel).
This can leave a dangling `MonitorUpdateCompletionAction` sitting
around even after the channel is closed.
In 0.1, because `ChannelMonitorUpdate`s to closed channels were
finally fully tracked, we started enforcing that any post-update
completion action we had on startup corresponded to a peer entry,
while at the same time no longer creating peer entries just because
we had serialized one in the data we were loading (only creating
them if we had channel(s) or a `ChannelMonitor`).
This can cause some `ChannelManager` to no longer deserialize on
0.1 as we might have a left-over dangling
`MonitorUpdateCompletionAction` and will no longer always have a
peer entry just because of it.
Here we fix this issue by specifically checking for dangling
`MonitorUpdateCompletionAction::PaymentClaim` entries and dropping
them if there is no corresponding channel or peer state entry. We
only check for `PaymentClaimed` actions rather than allowing for
any dangling actions as 93b4479
was only triggerable with MPP claims, so dangling
`MonitorUpdateCompletionAction`s for forwarded payments should be
exceedingly rare.
This also adds an upgrade test to test a slightly convoluted
version of this scenario.
Trivial conflicts addressed in:
* lightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from 5790a02 to bc9ffe4CompareMay 23, 2025 17:59
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, ugh, bad rebase, fixed:

$ git diff-tree -U1 fe127ccdc0 bc9ffe4433
diff --git a/fuzz/src/chanmon_consistency.rs b/fuzz/src/chanmon_consistency.rs
index df4cb27604..1f4e7c2415 100644
--- a/fuzz/src/chanmon_consistency.rs+++ b/fuzz/src/chanmon_consistency.rs@@ -393,3 +393,3 @@ impl SignerProvider for KeyProvider {
- Ok(TestChannelSigner::new_with_revoked(inner, state, false))+ Ok(TestChannelSigner::new_with_revoked(inner, state, false, false))
}
diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 88e9eadaf1..143f69f160 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -524,2 +524,3 @@ impl SignerProvider for KeyProvider {
false,
+ false,
)

At all times, the funder's balance should cover the commitment
transaction fee, any non-zero-value anchors, and the fundee-selected
channel reserve.
Prior to this commit, we would allow the funder to dip into its reserve
to pay for the two 330sat anchors.
LDK sets reserves to at least 1000sat, so two 330 sat anchors would
never overdraw this reserve.
We now prevent any such dips, and ensure that the funder can pay for the
complete sum of the transaction fee, the anchors, and the reserve.
Substantial conflicts resulted in the `channel.rs` parts of this
patch being rewriten. The `functional_tests.rs` changes also
conflicted but were re-applied to the proper file.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Also added a backport of #3796

@TheBlueMattTheBlueMatt mentioned this pull request May 23, 2025
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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@valentinewallace@tankyleo
, '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

[0.1] Backports for 0.1.4 - #3794

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports
May 23, 2025
Merged

[0.1] Backports for 0.1.4#3794
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented May 23, 2025

Copy link
Copy Markdown
Collaborator

Backport of #3772, two commits from #3584, and #3790. The two commits from #3584 are kinda awkward (testing upgrade from 0.1 to 0.1) but it seems weirder to drop the test in a backport and it exposes a few more methods as public (which may be helpful for later upgrade tests from 0.1 to git/0.2/etc).

EDIT: Plus #3796

When we begin claiming a payment, we move the tracking of it from
`claimable_payments` to `claiming_payments`. This ensures we only
ever have one payment which is in the process of being claimed with
a given payment hash at a time and lets us keep track of when all
parts have been claimed with their `ChannelMonitor`s.
However, on startup, we check that failing to move a payment from
`claimable_payments` to `claiming_payments` implies that it is not
present in `claiming_payments`. This is fine if the payment doesn't
exist, but if the payment has already started being claimed, this
will fail and we'll refuse to deserialize the `ChannelManager`
(with a `debug_assert` failure in debug mode).
Here we resolve this by checking if a payment is already being
claimed before we attempt to initiate claiming and skip the failing
check in that case.
@ldk-reviews-bot

ldk-reviews-bot commented May 23, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@wpaulino

Copy link
Copy Markdown
Contributor

Should probably fix the fuzz build before merging

@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from fe127cc to 5790a02CompareMay 23, 2025 17:57
The signer we use in tests tracks the state of the channel and
refuses to sign when the channel attempts an invalid state
transition. In the next commit, however, we'll add an upgrade test
which will fail these checks as the the state won't get copied from
previous versions of LDK to this version.
Thus, here, we add the ability to disable all state-based checks
in the signer.
One major hole in our test coverage historically has been tests
covering upgrades or downgrades across LDK versions. Luckily, these
aren't particularly hard to write as cargo lets us depend on
previous versions of the `lightning` crate directly, which we can
use in tests.
Here we add a simple initial test of upgrading from LDK 0.1 while
there's a pending payment to be claimed.
In 93b4479 we fixed an issue which
could cause a `ChannelMonitorUpdate` to get marked as blocked on
itself, leading to an eventual force-closure.
One potential side-effect of that issue, however, is that any
further `ChannelMonitorUpdate`s to the same channel while it is
blocked will not have any post-update actions processed (as there
is a pending blocked `ChannelMonitorUpdate` sitting in the
channel).
This can leave a dangling `MonitorUpdateCompletionAction` sitting
around even after the channel is closed.
In 0.1, because `ChannelMonitorUpdate`s to closed channels were
finally fully tracked, we started enforcing that any post-update
completion action we had on startup corresponded to a peer entry,
while at the same time no longer creating peer entries just because
we had serialized one in the data we were loading (only creating
them if we had channel(s) or a `ChannelMonitor`).
This can cause some `ChannelManager` to no longer deserialize on
0.1 as we might have a left-over dangling
`MonitorUpdateCompletionAction` and will no longer always have a
peer entry just because of it.
Here we fix this issue by specifically checking for dangling
`MonitorUpdateCompletionAction::PaymentClaim` entries and dropping
them if there is no corresponding channel or peer state entry. We
only check for `PaymentClaimed` actions rather than allowing for
any dangling actions as 93b4479
was only triggerable with MPP claims, so dangling
`MonitorUpdateCompletionAction`s for forwarded payments should be
exceedingly rare.
This also adds an upgrade test to test a slightly convoluted
version of this scenario.
Trivial conflicts addressed in:
* lightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from 5790a02 to bc9ffe4CompareMay 23, 2025 17:59
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, ugh, bad rebase, fixed:

$ git diff-tree -U1 fe127ccdc0 bc9ffe4433
diff --git a/fuzz/src/chanmon_consistency.rs b/fuzz/src/chanmon_consistency.rs
index df4cb27604..1f4e7c2415 100644
--- a/fuzz/src/chanmon_consistency.rs+++ b/fuzz/src/chanmon_consistency.rs@@ -393,3 +393,3 @@ impl SignerProvider for KeyProvider {
- Ok(TestChannelSigner::new_with_revoked(inner, state, false))+ Ok(TestChannelSigner::new_with_revoked(inner, state, false, false))
}
diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 88e9eadaf1..143f69f160 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -524,2 +524,3 @@ impl SignerProvider for KeyProvider {
false,
+ false,
)

At all times, the funder's balance should cover the commitment
transaction fee, any non-zero-value anchors, and the fundee-selected
channel reserve.
Prior to this commit, we would allow the funder to dip into its reserve
to pay for the two 330sat anchors.
LDK sets reserves to at least 1000sat, so two 330 sat anchors would
never overdraw this reserve.
We now prevent any such dips, and ensure that the funder can pay for the
complete sum of the transaction fee, the anchors, and the reserve.
Substantial conflicts resulted in the `channel.rs` parts of this
patch being rewriten. The `functional_tests.rs` changes also
conflicted but were re-applied to the proper file.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Also added a backport of #3796

@TheBlueMattTheBlueMatt mentioned this pull request May 23, 2025
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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@valentinewallace@tankyleo
, '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

[0.1] Backports for 0.1.4 - #3794

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports
May 23, 2025
Merged

[0.1] Backports for 0.1.4#3794
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented May 23, 2025

Copy link
Copy Markdown
Collaborator

Backport of #3772, two commits from #3584, and #3790. The two commits from #3584 are kinda awkward (testing upgrade from 0.1 to 0.1) but it seems weirder to drop the test in a backport and it exposes a few more methods as public (which may be helpful for later upgrade tests from 0.1 to git/0.2/etc).

EDIT: Plus #3796

When we begin claiming a payment, we move the tracking of it from
`claimable_payments` to `claiming_payments`. This ensures we only
ever have one payment which is in the process of being claimed with
a given payment hash at a time and lets us keep track of when all
parts have been claimed with their `ChannelMonitor`s.
However, on startup, we check that failing to move a payment from
`claimable_payments` to `claiming_payments` implies that it is not
present in `claiming_payments`. This is fine if the payment doesn't
exist, but if the payment has already started being claimed, this
will fail and we'll refuse to deserialize the `ChannelManager`
(with a `debug_assert` failure in debug mode).
Here we resolve this by checking if a payment is already being
claimed before we attempt to initiate claiming and skip the failing
check in that case.
@ldk-reviews-bot

ldk-reviews-bot commented May 23, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@wpaulino

Copy link
Copy Markdown
Contributor

Should probably fix the fuzz build before merging

@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from fe127cc to 5790a02CompareMay 23, 2025 17:57
The signer we use in tests tracks the state of the channel and
refuses to sign when the channel attempts an invalid state
transition. In the next commit, however, we'll add an upgrade test
which will fail these checks as the the state won't get copied from
previous versions of LDK to this version.
Thus, here, we add the ability to disable all state-based checks
in the signer.
One major hole in our test coverage historically has been tests
covering upgrades or downgrades across LDK versions. Luckily, these
aren't particularly hard to write as cargo lets us depend on
previous versions of the `lightning` crate directly, which we can
use in tests.
Here we add a simple initial test of upgrading from LDK 0.1 while
there's a pending payment to be claimed.
In 93b4479 we fixed an issue which
could cause a `ChannelMonitorUpdate` to get marked as blocked on
itself, leading to an eventual force-closure.
One potential side-effect of that issue, however, is that any
further `ChannelMonitorUpdate`s to the same channel while it is
blocked will not have any post-update actions processed (as there
is a pending blocked `ChannelMonitorUpdate` sitting in the
channel).
This can leave a dangling `MonitorUpdateCompletionAction` sitting
around even after the channel is closed.
In 0.1, because `ChannelMonitorUpdate`s to closed channels were
finally fully tracked, we started enforcing that any post-update
completion action we had on startup corresponded to a peer entry,
while at the same time no longer creating peer entries just because
we had serialized one in the data we were loading (only creating
them if we had channel(s) or a `ChannelMonitor`).
This can cause some `ChannelManager` to no longer deserialize on
0.1 as we might have a left-over dangling
`MonitorUpdateCompletionAction` and will no longer always have a
peer entry just because of it.
Here we fix this issue by specifically checking for dangling
`MonitorUpdateCompletionAction::PaymentClaim` entries and dropping
them if there is no corresponding channel or peer state entry. We
only check for `PaymentClaimed` actions rather than allowing for
any dangling actions as 93b4479
was only triggerable with MPP claims, so dangling
`MonitorUpdateCompletionAction`s for forwarded payments should be
exceedingly rare.
This also adds an upgrade test to test a slightly convoluted
version of this scenario.
Trivial conflicts addressed in:
* lightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from 5790a02 to bc9ffe4CompareMay 23, 2025 17:59
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, ugh, bad rebase, fixed:

$ git diff-tree -U1 fe127ccdc0 bc9ffe4433
diff --git a/fuzz/src/chanmon_consistency.rs b/fuzz/src/chanmon_consistency.rs
index df4cb27604..1f4e7c2415 100644
--- a/fuzz/src/chanmon_consistency.rs+++ b/fuzz/src/chanmon_consistency.rs@@ -393,3 +393,3 @@ impl SignerProvider for KeyProvider {
- Ok(TestChannelSigner::new_with_revoked(inner, state, false))+ Ok(TestChannelSigner::new_with_revoked(inner, state, false, false))
}
diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 88e9eadaf1..143f69f160 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -524,2 +524,3 @@ impl SignerProvider for KeyProvider {
false,
+ false,
)

At all times, the funder's balance should cover the commitment
transaction fee, any non-zero-value anchors, and the fundee-selected
channel reserve.
Prior to this commit, we would allow the funder to dip into its reserve
to pay for the two 330sat anchors.
LDK sets reserves to at least 1000sat, so two 330 sat anchors would
never overdraw this reserve.
We now prevent any such dips, and ensure that the funder can pay for the
complete sum of the transaction fee, the anchors, and the reserve.
Substantial conflicts resulted in the `channel.rs` parts of this
patch being rewriten. The `functional_tests.rs` changes also
conflicted but were re-applied to the proper file.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Also added a backport of #3796

@TheBlueMattTheBlueMatt mentioned this pull request May 23, 2025
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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@valentinewallace@tankyleo
, '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

[0.1] Backports for 0.1.4 - #3794

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports
May 23, 2025
Merged

[0.1] Backports for 0.1.4#3794
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented May 23, 2025

Copy link
Copy Markdown
Collaborator

Backport of #3772, two commits from #3584, and #3790. The two commits from #3584 are kinda awkward (testing upgrade from 0.1 to 0.1) but it seems weirder to drop the test in a backport and it exposes a few more methods as public (which may be helpful for later upgrade tests from 0.1 to git/0.2/etc).

EDIT: Plus #3796

When we begin claiming a payment, we move the tracking of it from
`claimable_payments` to `claiming_payments`. This ensures we only
ever have one payment which is in the process of being claimed with
a given payment hash at a time and lets us keep track of when all
parts have been claimed with their `ChannelMonitor`s.
However, on startup, we check that failing to move a payment from
`claimable_payments` to `claiming_payments` implies that it is not
present in `claiming_payments`. This is fine if the payment doesn't
exist, but if the payment has already started being claimed, this
will fail and we'll refuse to deserialize the `ChannelManager`
(with a `debug_assert` failure in debug mode).
Here we resolve this by checking if a payment is already being
claimed before we attempt to initiate claiming and skip the failing
check in that case.
@ldk-reviews-bot

ldk-reviews-bot commented May 23, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@wpaulino

Copy link
Copy Markdown
Contributor

Should probably fix the fuzz build before merging

@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from fe127cc to 5790a02CompareMay 23, 2025 17:57
The signer we use in tests tracks the state of the channel and
refuses to sign when the channel attempts an invalid state
transition. In the next commit, however, we'll add an upgrade test
which will fail these checks as the the state won't get copied from
previous versions of LDK to this version.
Thus, here, we add the ability to disable all state-based checks
in the signer.
One major hole in our test coverage historically has been tests
covering upgrades or downgrades across LDK versions. Luckily, these
aren't particularly hard to write as cargo lets us depend on
previous versions of the `lightning` crate directly, which we can
use in tests.
Here we add a simple initial test of upgrading from LDK 0.1 while
there's a pending payment to be claimed.
In 93b4479 we fixed an issue which
could cause a `ChannelMonitorUpdate` to get marked as blocked on
itself, leading to an eventual force-closure.
One potential side-effect of that issue, however, is that any
further `ChannelMonitorUpdate`s to the same channel while it is
blocked will not have any post-update actions processed (as there
is a pending blocked `ChannelMonitorUpdate` sitting in the
channel).
This can leave a dangling `MonitorUpdateCompletionAction` sitting
around even after the channel is closed.
In 0.1, because `ChannelMonitorUpdate`s to closed channels were
finally fully tracked, we started enforcing that any post-update
completion action we had on startup corresponded to a peer entry,
while at the same time no longer creating peer entries just because
we had serialized one in the data we were loading (only creating
them if we had channel(s) or a `ChannelMonitor`).
This can cause some `ChannelManager` to no longer deserialize on
0.1 as we might have a left-over dangling
`MonitorUpdateCompletionAction` and will no longer always have a
peer entry just because of it.
Here we fix this issue by specifically checking for dangling
`MonitorUpdateCompletionAction::PaymentClaim` entries and dropping
them if there is no corresponding channel or peer state entry. We
only check for `PaymentClaimed` actions rather than allowing for
any dangling actions as 93b4479
was only triggerable with MPP claims, so dangling
`MonitorUpdateCompletionAction`s for forwarded payments should be
exceedingly rare.
This also adds an upgrade test to test a slightly convoluted
version of this scenario.
Trivial conflicts addressed in:
* lightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from 5790a02 to bc9ffe4CompareMay 23, 2025 17:59
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, ugh, bad rebase, fixed:

$ git diff-tree -U1 fe127ccdc0 bc9ffe4433
diff --git a/fuzz/src/chanmon_consistency.rs b/fuzz/src/chanmon_consistency.rs
index df4cb27604..1f4e7c2415 100644
--- a/fuzz/src/chanmon_consistency.rs+++ b/fuzz/src/chanmon_consistency.rs@@ -393,3 +393,3 @@ impl SignerProvider for KeyProvider {
- Ok(TestChannelSigner::new_with_revoked(inner, state, false))+ Ok(TestChannelSigner::new_with_revoked(inner, state, false, false))
}
diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 88e9eadaf1..143f69f160 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -524,2 +524,3 @@ impl SignerProvider for KeyProvider {
false,
+ false,
)

At all times, the funder's balance should cover the commitment
transaction fee, any non-zero-value anchors, and the fundee-selected
channel reserve.
Prior to this commit, we would allow the funder to dip into its reserve
to pay for the two 330sat anchors.
LDK sets reserves to at least 1000sat, so two 330 sat anchors would
never overdraw this reserve.
We now prevent any such dips, and ensure that the funder can pay for the
complete sum of the transaction fee, the anchors, and the reserve.
Substantial conflicts resulted in the `channel.rs` parts of this
patch being rewriten. The `functional_tests.rs` changes also
conflicted but were re-applied to the proper file.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Also added a backport of #3796

@TheBlueMattTheBlueMatt mentioned this pull request May 23, 2025
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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@valentinewallace@tankyleo
, '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

[0.1] Backports for 0.1.4 - #3794

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports
May 23, 2025
Merged

[0.1] Backports for 0.1.4#3794
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented May 23, 2025

Copy link
Copy Markdown
Collaborator

Backport of #3772, two commits from #3584, and #3790. The two commits from #3584 are kinda awkward (testing upgrade from 0.1 to 0.1) but it seems weirder to drop the test in a backport and it exposes a few more methods as public (which may be helpful for later upgrade tests from 0.1 to git/0.2/etc).

EDIT: Plus #3796

When we begin claiming a payment, we move the tracking of it from
`claimable_payments` to `claiming_payments`. This ensures we only
ever have one payment which is in the process of being claimed with
a given payment hash at a time and lets us keep track of when all
parts have been claimed with their `ChannelMonitor`s.
However, on startup, we check that failing to move a payment from
`claimable_payments` to `claiming_payments` implies that it is not
present in `claiming_payments`. This is fine if the payment doesn't
exist, but if the payment has already started being claimed, this
will fail and we'll refuse to deserialize the `ChannelManager`
(with a `debug_assert` failure in debug mode).
Here we resolve this by checking if a payment is already being
claimed before we attempt to initiate claiming and skip the failing
check in that case.
@ldk-reviews-bot

ldk-reviews-bot commented May 23, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@wpaulino

Copy link
Copy Markdown
Contributor

Should probably fix the fuzz build before merging

@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from fe127cc to 5790a02CompareMay 23, 2025 17:57
The signer we use in tests tracks the state of the channel and
refuses to sign when the channel attempts an invalid state
transition. In the next commit, however, we'll add an upgrade test
which will fail these checks as the the state won't get copied from
previous versions of LDK to this version.
Thus, here, we add the ability to disable all state-based checks
in the signer.
One major hole in our test coverage historically has been tests
covering upgrades or downgrades across LDK versions. Luckily, these
aren't particularly hard to write as cargo lets us depend on
previous versions of the `lightning` crate directly, which we can
use in tests.
Here we add a simple initial test of upgrading from LDK 0.1 while
there's a pending payment to be claimed.
In 93b4479 we fixed an issue which
could cause a `ChannelMonitorUpdate` to get marked as blocked on
itself, leading to an eventual force-closure.
One potential side-effect of that issue, however, is that any
further `ChannelMonitorUpdate`s to the same channel while it is
blocked will not have any post-update actions processed (as there
is a pending blocked `ChannelMonitorUpdate` sitting in the
channel).
This can leave a dangling `MonitorUpdateCompletionAction` sitting
around even after the channel is closed.
In 0.1, because `ChannelMonitorUpdate`s to closed channels were
finally fully tracked, we started enforcing that any post-update
completion action we had on startup corresponded to a peer entry,
while at the same time no longer creating peer entries just because
we had serialized one in the data we were loading (only creating
them if we had channel(s) or a `ChannelMonitor`).
This can cause some `ChannelManager` to no longer deserialize on
0.1 as we might have a left-over dangling
`MonitorUpdateCompletionAction` and will no longer always have a
peer entry just because of it.
Here we fix this issue by specifically checking for dangling
`MonitorUpdateCompletionAction::PaymentClaim` entries and dropping
them if there is no corresponding channel or peer state entry. We
only check for `PaymentClaimed` actions rather than allowing for
any dangling actions as 93b4479
was only triggerable with MPP claims, so dangling
`MonitorUpdateCompletionAction`s for forwarded payments should be
exceedingly rare.
This also adds an upgrade test to test a slightly convoluted
version of this scenario.
Trivial conflicts addressed in:
* lightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from 5790a02 to bc9ffe4CompareMay 23, 2025 17:59
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, ugh, bad rebase, fixed:

$ git diff-tree -U1 fe127ccdc0 bc9ffe4433
diff --git a/fuzz/src/chanmon_consistency.rs b/fuzz/src/chanmon_consistency.rs
index df4cb27604..1f4e7c2415 100644
--- a/fuzz/src/chanmon_consistency.rs+++ b/fuzz/src/chanmon_consistency.rs@@ -393,3 +393,3 @@ impl SignerProvider for KeyProvider {
- Ok(TestChannelSigner::new_with_revoked(inner, state, false))+ Ok(TestChannelSigner::new_with_revoked(inner, state, false, false))
}
diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 88e9eadaf1..143f69f160 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -524,2 +524,3 @@ impl SignerProvider for KeyProvider {
false,
+ false,
)

At all times, the funder's balance should cover the commitment
transaction fee, any non-zero-value anchors, and the fundee-selected
channel reserve.
Prior to this commit, we would allow the funder to dip into its reserve
to pay for the two 330sat anchors.
LDK sets reserves to at least 1000sat, so two 330 sat anchors would
never overdraw this reserve.
We now prevent any such dips, and ensure that the funder can pay for the
complete sum of the transaction fee, the anchors, and the reserve.
Substantial conflicts resulted in the `channel.rs` parts of this
patch being rewriten. The `functional_tests.rs` changes also
conflicted but were re-applied to the proper file.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Also added a backport of #3796

@TheBlueMattTheBlueMatt mentioned this pull request May 23, 2025
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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@valentinewallace@tankyleo
, '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

[0.1] Backports for 0.1.4 - #3794

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports
May 23, 2025
Merged

[0.1] Backports for 0.1.4#3794
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented May 23, 2025

Copy link
Copy Markdown
Collaborator

Backport of #3772, two commits from #3584, and #3790. The two commits from #3584 are kinda awkward (testing upgrade from 0.1 to 0.1) but it seems weirder to drop the test in a backport and it exposes a few more methods as public (which may be helpful for later upgrade tests from 0.1 to git/0.2/etc).

EDIT: Plus #3796

When we begin claiming a payment, we move the tracking of it from
`claimable_payments` to `claiming_payments`. This ensures we only
ever have one payment which is in the process of being claimed with
a given payment hash at a time and lets us keep track of when all
parts have been claimed with their `ChannelMonitor`s.
However, on startup, we check that failing to move a payment from
`claimable_payments` to `claiming_payments` implies that it is not
present in `claiming_payments`. This is fine if the payment doesn't
exist, but if the payment has already started being claimed, this
will fail and we'll refuse to deserialize the `ChannelManager`
(with a `debug_assert` failure in debug mode).
Here we resolve this by checking if a payment is already being
claimed before we attempt to initiate claiming and skip the failing
check in that case.
@ldk-reviews-bot

ldk-reviews-bot commented May 23, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@wpaulino

Copy link
Copy Markdown
Contributor

Should probably fix the fuzz build before merging

@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from fe127cc to 5790a02CompareMay 23, 2025 17:57
The signer we use in tests tracks the state of the channel and
refuses to sign when the channel attempts an invalid state
transition. In the next commit, however, we'll add an upgrade test
which will fail these checks as the the state won't get copied from
previous versions of LDK to this version.
Thus, here, we add the ability to disable all state-based checks
in the signer.
One major hole in our test coverage historically has been tests
covering upgrades or downgrades across LDK versions. Luckily, these
aren't particularly hard to write as cargo lets us depend on
previous versions of the `lightning` crate directly, which we can
use in tests.
Here we add a simple initial test of upgrading from LDK 0.1 while
there's a pending payment to be claimed.
In 93b4479 we fixed an issue which
could cause a `ChannelMonitorUpdate` to get marked as blocked on
itself, leading to an eventual force-closure.
One potential side-effect of that issue, however, is that any
further `ChannelMonitorUpdate`s to the same channel while it is
blocked will not have any post-update actions processed (as there
is a pending blocked `ChannelMonitorUpdate` sitting in the
channel).
This can leave a dangling `MonitorUpdateCompletionAction` sitting
around even after the channel is closed.
In 0.1, because `ChannelMonitorUpdate`s to closed channels were
finally fully tracked, we started enforcing that any post-update
completion action we had on startup corresponded to a peer entry,
while at the same time no longer creating peer entries just because
we had serialized one in the data we were loading (only creating
them if we had channel(s) or a `ChannelMonitor`).
This can cause some `ChannelManager` to no longer deserialize on
0.1 as we might have a left-over dangling
`MonitorUpdateCompletionAction` and will no longer always have a
peer entry just because of it.
Here we fix this issue by specifically checking for dangling
`MonitorUpdateCompletionAction::PaymentClaim` entries and dropping
them if there is no corresponding channel or peer state entry. We
only check for `PaymentClaimed` actions rather than allowing for
any dangling actions as 93b4479
was only triggerable with MPP claims, so dangling
`MonitorUpdateCompletionAction`s for forwarded payments should be
exceedingly rare.
This also adds an upgrade test to test a slightly convoluted
version of this scenario.
Trivial conflicts addressed in:
* lightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from 5790a02 to bc9ffe4CompareMay 23, 2025 17:59
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, ugh, bad rebase, fixed:

$ git diff-tree -U1 fe127ccdc0 bc9ffe4433
diff --git a/fuzz/src/chanmon_consistency.rs b/fuzz/src/chanmon_consistency.rs
index df4cb27604..1f4e7c2415 100644
--- a/fuzz/src/chanmon_consistency.rs+++ b/fuzz/src/chanmon_consistency.rs@@ -393,3 +393,3 @@ impl SignerProvider for KeyProvider {
- Ok(TestChannelSigner::new_with_revoked(inner, state, false))+ Ok(TestChannelSigner::new_with_revoked(inner, state, false, false))
}
diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 88e9eadaf1..143f69f160 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -524,2 +524,3 @@ impl SignerProvider for KeyProvider {
false,
+ false,
)

At all times, the funder's balance should cover the commitment
transaction fee, any non-zero-value anchors, and the fundee-selected
channel reserve.
Prior to this commit, we would allow the funder to dip into its reserve
to pay for the two 330sat anchors.
LDK sets reserves to at least 1000sat, so two 330 sat anchors would
never overdraw this reserve.
We now prevent any such dips, and ensure that the funder can pay for the
complete sum of the transaction fee, the anchors, and the reserve.
Substantial conflicts resulted in the `channel.rs` parts of this
patch being rewriten. The `functional_tests.rs` changes also
conflicted but were re-applied to the proper file.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Also added a backport of #3796

@TheBlueMattTheBlueMatt mentioned this pull request May 23, 2025
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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@valentinewallace@tankyleo
, '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

[0.1] Backports for 0.1.4 - #3794

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports
May 23, 2025
Merged

[0.1] Backports for 0.1.4#3794
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented May 23, 2025

Copy link
Copy Markdown
Collaborator

Backport of #3772, two commits from #3584, and #3790. The two commits from #3584 are kinda awkward (testing upgrade from 0.1 to 0.1) but it seems weirder to drop the test in a backport and it exposes a few more methods as public (which may be helpful for later upgrade tests from 0.1 to git/0.2/etc).

EDIT: Plus #3796

When we begin claiming a payment, we move the tracking of it from
`claimable_payments` to `claiming_payments`. This ensures we only
ever have one payment which is in the process of being claimed with
a given payment hash at a time and lets us keep track of when all
parts have been claimed with their `ChannelMonitor`s.
However, on startup, we check that failing to move a payment from
`claimable_payments` to `claiming_payments` implies that it is not
present in `claiming_payments`. This is fine if the payment doesn't
exist, but if the payment has already started being claimed, this
will fail and we'll refuse to deserialize the `ChannelManager`
(with a `debug_assert` failure in debug mode).
Here we resolve this by checking if a payment is already being
claimed before we attempt to initiate claiming and skip the failing
check in that case.
@ldk-reviews-bot

ldk-reviews-bot commented May 23, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@wpaulino

Copy link
Copy Markdown
Contributor

Should probably fix the fuzz build before merging

@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from fe127cc to 5790a02CompareMay 23, 2025 17:57
The signer we use in tests tracks the state of the channel and
refuses to sign when the channel attempts an invalid state
transition. In the next commit, however, we'll add an upgrade test
which will fail these checks as the the state won't get copied from
previous versions of LDK to this version.
Thus, here, we add the ability to disable all state-based checks
in the signer.
One major hole in our test coverage historically has been tests
covering upgrades or downgrades across LDK versions. Luckily, these
aren't particularly hard to write as cargo lets us depend on
previous versions of the `lightning` crate directly, which we can
use in tests.
Here we add a simple initial test of upgrading from LDK 0.1 while
there's a pending payment to be claimed.
In 93b4479 we fixed an issue which
could cause a `ChannelMonitorUpdate` to get marked as blocked on
itself, leading to an eventual force-closure.
One potential side-effect of that issue, however, is that any
further `ChannelMonitorUpdate`s to the same channel while it is
blocked will not have any post-update actions processed (as there
is a pending blocked `ChannelMonitorUpdate` sitting in the
channel).
This can leave a dangling `MonitorUpdateCompletionAction` sitting
around even after the channel is closed.
In 0.1, because `ChannelMonitorUpdate`s to closed channels were
finally fully tracked, we started enforcing that any post-update
completion action we had on startup corresponded to a peer entry,
while at the same time no longer creating peer entries just because
we had serialized one in the data we were loading (only creating
them if we had channel(s) or a `ChannelMonitor`).
This can cause some `ChannelManager` to no longer deserialize on
0.1 as we might have a left-over dangling
`MonitorUpdateCompletionAction` and will no longer always have a
peer entry just because of it.
Here we fix this issue by specifically checking for dangling
`MonitorUpdateCompletionAction::PaymentClaim` entries and dropping
them if there is no corresponding channel or peer state entry. We
only check for `PaymentClaimed` actions rather than allowing for
any dangling actions as 93b4479
was only triggerable with MPP claims, so dangling
`MonitorUpdateCompletionAction`s for forwarded payments should be
exceedingly rare.
This also adds an upgrade test to test a slightly convoluted
version of this scenario.
Trivial conflicts addressed in:
* lightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from 5790a02 to bc9ffe4CompareMay 23, 2025 17:59
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, ugh, bad rebase, fixed:

$ git diff-tree -U1 fe127ccdc0 bc9ffe4433
diff --git a/fuzz/src/chanmon_consistency.rs b/fuzz/src/chanmon_consistency.rs
index df4cb27604..1f4e7c2415 100644
--- a/fuzz/src/chanmon_consistency.rs+++ b/fuzz/src/chanmon_consistency.rs@@ -393,3 +393,3 @@ impl SignerProvider for KeyProvider {
- Ok(TestChannelSigner::new_with_revoked(inner, state, false))+ Ok(TestChannelSigner::new_with_revoked(inner, state, false, false))
}
diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 88e9eadaf1..143f69f160 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -524,2 +524,3 @@ impl SignerProvider for KeyProvider {
false,
+ false,
)

At all times, the funder's balance should cover the commitment
transaction fee, any non-zero-value anchors, and the fundee-selected
channel reserve.
Prior to this commit, we would allow the funder to dip into its reserve
to pay for the two 330sat anchors.
LDK sets reserves to at least 1000sat, so two 330 sat anchors would
never overdraw this reserve.
We now prevent any such dips, and ensure that the funder can pay for the
complete sum of the transaction fee, the anchors, and the reserve.
Substantial conflicts resulted in the `channel.rs` parts of this
patch being rewriten. The `functional_tests.rs` changes also
conflicted but were re-applied to the proper file.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Also added a backport of #3796

@TheBlueMattTheBlueMatt mentioned this pull request May 23, 2025
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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@valentinewallace@tankyleo
, '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

[0.1] Backports for 0.1.4 - #3794

Merged
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports
May 23, 2025
Merged

[0.1] Backports for 0.1.4#3794
TheBlueMatt merged 5 commits into
lightningdevkit:0.1from
TheBlueMatt:2025-05-0.1.4-backports

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented May 23, 2025

Copy link
Copy Markdown
Collaborator

Backport of #3772, two commits from #3584, and #3790. The two commits from #3584 are kinda awkward (testing upgrade from 0.1 to 0.1) but it seems weirder to drop the test in a backport and it exposes a few more methods as public (which may be helpful for later upgrade tests from 0.1 to git/0.2/etc).

EDIT: Plus #3796

When we begin claiming a payment, we move the tracking of it from
`claimable_payments` to `claiming_payments`. This ensures we only
ever have one payment which is in the process of being claimed with
a given payment hash at a time and lets us keep track of when all
parts have been claimed with their `ChannelMonitor`s.
However, on startup, we check that failing to move a payment from
`claimable_payments` to `claiming_payments` implies that it is not
present in `claiming_payments`. This is fine if the payment doesn't
exist, but if the payment has already started being claimed, this
will fail and we'll refuse to deserialize the `ChannelManager`
(with a `debug_assert` failure in debug mode).
Here we resolve this by checking if a payment is already being
claimed before we attempt to initiate claiming and skip the failing
check in that case.
@ldk-reviews-bot

ldk-reviews-bot commented May 23, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@wpaulino

Copy link
Copy Markdown
Contributor

Should probably fix the fuzz build before merging

@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from fe127cc to 5790a02CompareMay 23, 2025 17:57
The signer we use in tests tracks the state of the channel and
refuses to sign when the channel attempts an invalid state
transition. In the next commit, however, we'll add an upgrade test
which will fail these checks as the the state won't get copied from
previous versions of LDK to this version.
Thus, here, we add the ability to disable all state-based checks
in the signer.
One major hole in our test coverage historically has been tests
covering upgrades or downgrades across LDK versions. Luckily, these
aren't particularly hard to write as cargo lets us depend on
previous versions of the `lightning` crate directly, which we can
use in tests.
Here we add a simple initial test of upgrading from LDK 0.1 while
there's a pending payment to be claimed.
In 93b4479 we fixed an issue which
could cause a `ChannelMonitorUpdate` to get marked as blocked on
itself, leading to an eventual force-closure.
One potential side-effect of that issue, however, is that any
further `ChannelMonitorUpdate`s to the same channel while it is
blocked will not have any post-update actions processed (as there
is a pending blocked `ChannelMonitorUpdate` sitting in the
channel).
This can leave a dangling `MonitorUpdateCompletionAction` sitting
around even after the channel is closed.
In 0.1, because `ChannelMonitorUpdate`s to closed channels were
finally fully tracked, we started enforcing that any post-update
completion action we had on startup corresponded to a peer entry,
while at the same time no longer creating peer entries just because
we had serialized one in the data we were loading (only creating
them if we had channel(s) or a `ChannelMonitor`).
This can cause some `ChannelManager` to no longer deserialize on
0.1 as we might have a left-over dangling
`MonitorUpdateCompletionAction` and will no longer always have a
peer entry just because of it.
Here we fix this issue by specifically checking for dangling
`MonitorUpdateCompletionAction::PaymentClaim` entries and dropping
them if there is no corresponding channel or peer state entry. We
only check for `PaymentClaimed` actions rather than allowing for
any dangling actions as 93b4479
was only triggerable with MPP claims, so dangling
`MonitorUpdateCompletionAction`s for forwarded payments should be
exceedingly rare.
This also adds an upgrade test to test a slightly convoluted
version of this scenario.
Trivial conflicts addressed in:
* lightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2025-05-0.1.4-backports branch from 5790a02 to bc9ffe4CompareMay 23, 2025 17:59
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, ugh, bad rebase, fixed:

$ git diff-tree -U1 fe127ccdc0 bc9ffe4433
diff --git a/fuzz/src/chanmon_consistency.rs b/fuzz/src/chanmon_consistency.rs
index df4cb27604..1f4e7c2415 100644
--- a/fuzz/src/chanmon_consistency.rs+++ b/fuzz/src/chanmon_consistency.rs@@ -393,3 +393,3 @@ impl SignerProvider for KeyProvider {
- Ok(TestChannelSigner::new_with_revoked(inner, state, false))+ Ok(TestChannelSigner::new_with_revoked(inner, state, false, false))
}
diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 88e9eadaf1..143f69f160 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -524,2 +524,3 @@ impl SignerProvider for KeyProvider {
false,
+ false,
)

At all times, the funder's balance should cover the commitment
transaction fee, any non-zero-value anchors, and the fundee-selected
channel reserve.
Prior to this commit, we would allow the funder to dip into its reserve
to pay for the two 330sat anchors.
LDK sets reserves to at least 1000sat, so two 330 sat anchors would
never overdraw this reserve.
We now prevent any such dips, and ensure that the funder can pay for the
complete sum of the transaction fee, the anchors, and the reserve.
Substantial conflicts resulted in the `channel.rs` parts of this
patch being rewriten. The `functional_tests.rs` changes also
conflicted but were re-applied to the proper file.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Also added a backport of #3796

@TheBlueMattTheBlueMatt mentioned this pull request May 23, 2025
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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@valentinewallace@tankyleo