Attributable failures prefactor - #3650

Merged
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor
Mar 11, 2025
Merged

Attributable failures prefactor#3650
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor

Conversation

@joostjager

Copy link
Copy Markdown
Contributor

Preparatory non-functional commits extracted from #3611

@ldk-reviews-bot

ldk-reviews-bot commented Mar 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @arik-so 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.

@joostjagerjoostjager added the weekly goal Someone wants to land this this week label Mar 6, 2025
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from 894c91e to f82cb5aCompareMarch 6, 2025 22:08
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Rebased

Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_utils.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from f82cb5a to 8d01eb9CompareMarch 7, 2025 07:33
@joostjager
joostjager requested a review from arik-soMarch 7, 2025 07:34
@codecov

codecovBot commented Mar 7, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 86.33540% with 22 lines in your changes missing coverage. Please review.

Project coverage is 89.22%. Comparing base (4c43a5b) to head (1426197).
Report is 5 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/channel.rs31.81%2 Missing and 13 partials ⚠️
lightning/src/ln/onion_utils.rs92.30%4 Missing and 2 partials ⚠️
lightning/src/ln/onion_payment.rs75.00%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3650 +/- ##
==========================================
- Coverage 89.24% 89.22% -0.02% 
==========================================
Files 155 155 Lines 119280 119314 +34 Branches 119280 119314 +34 ==========================================
+ Hits 106446 106463 +17 - Misses 10240 10248 +8 - Partials 2594 2603 +9 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @arik-so! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

arik-so
arik-so previously approved these changes Mar 10, 2025
Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_route_tests.rs
arik-so
arik-so previously approved these changes Mar 10, 2025

@arik-soarik-so 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.

re-acking

packet.hmac = Hmac::from_engine(hmac).to_byte_array();

packet
OnionErrorPacket { data: packet.encode() }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Bleh, it seems pretty weird that we now have OnionErrorPackets flying around (at least outside of onion_utils.rs) that are both decrypted and encrypted. I think the reason it was written the way it was previously was specifically to avoid that - holding the encoded bytes until we get around to encrypting, then making it an OnionErrorPacket. It seems much too easy now to double-en/decrypt or forget to en/decrypt.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think a similar situation already existed for intermediate nodes? In

encrypt_failure_packet(incoming_packet_shared_secret,&err.data)
, an OnionErrorPacket received from downstream is encrypted into again an OnionErrorPacket.

The way I see it is that there's "data" in the packet that needs to be encrypted, and it doesn't matter whether that data is 0, 1, 2, etc times encrypted already.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Open to alternatives of course. Were you thinking of pulling the encrypt step into build_failure_packet too?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Yea, certainly not saying the old code was perfect and indeed its already the case that things are encrypted multiple times. I guess I just saw OnionErrorPacket as "encrypted thing ready to go over the wire/received on the wire". Certainly stuff internal to onion_utils doesn't matter quite as much, but once it leaves onion_utils.rs it looks like it'd be really easy to have code that just forgets to encrypt/decrypt (ie the callsite would just read build_failure_packet and the fact that its unencrypted isn't obvious).

Pulling the encrypt step into build_failure_packet seems like one perfectly good way to address it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done. Just kept a non-public unencrypted version of build_failure_packet for the bolt test vector test.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/msgs.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch 3 times, most recently from fe6cd21 to baffc82CompareMarch 10, 2025 15:36
Comment threadlightning/src/ln/onion_utils.rs Outdated
shared_secret: &[u8], raw_packet: &[u8],
) -> msgs::OnionErrorPacket {
/// Encrypts/decrypts a failure packet.
pub(super) fn crypt_failure_packet(shared_secret: &[u8], packet: &mut OnionErrorPacket) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Does this need to remain public now?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's used in onion_route_tests.rs - I think there is no other way to make it available there, or is there?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Often we do a test wrapper like the below. For four LoC we could even just copy them into the tests, though.

#[cfg(test)]
pub fn test_crypt_failure_packet(shared_secret, packet) { crypt_failure_packet(shared_secret, packet) }

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Well, it's about testing that function also, so wouldn't want to copy it.

Created the test wrapper.

Comment threadlightning/src/ln/onion_utils.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from baffc82 to 9fbbcdcCompareMarch 10, 2025 19:29

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This LGTM once fixups are squashed.

joostjagerand others added 2 commits March 10, 2025 23:22
Prepares for extending OnionErrorPacket with attribution data.
This commits prepares the persistence layer for the addition of
attribution data. Changes:
- Expand InboundHTLCRemovalReason serialization instead of using the
macro. When attribution data is added, it can't just be serialized
along with the existing fields because it would break backwards
compatibility. Instead the new field needs to go into the tlv block.
- Stop using OnionErrorPacket in the UpdateFailHTLC message. When
attribution data is added to OnionErrorPacket, it would not be
serialized for the wire properly because also here the new field needs
to go in the tlv extension of the message.
- Prepare HTLCFailReasonRepr serialization for that addition of
attribution data.
Co-authored-by: Matt Corallo <git@bluematt.me>
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from db221e2 to 1426197CompareMarch 10, 2025 22:26
@joostjager
joostjager merged commit 0e1bbc4 into lightningdevkit:mainMar 11, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

weekly goalSomeone wants to land this this week

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@joostjager@ldk-reviews-bot@TheBlueMatt@arik-so
, '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

Attributable failures prefactor - #3650

Merged
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor
Mar 11, 2025
Merged

Attributable failures prefactor#3650
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor

Conversation

@joostjager

Copy link
Copy Markdown
Contributor

Preparatory non-functional commits extracted from #3611

@ldk-reviews-bot

ldk-reviews-bot commented Mar 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @arik-so 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.

@joostjagerjoostjager added the weekly goal Someone wants to land this this week label Mar 6, 2025
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from 894c91e to f82cb5aCompareMarch 6, 2025 22:08
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Rebased

Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_utils.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from f82cb5a to 8d01eb9CompareMarch 7, 2025 07:33
@joostjager
joostjager requested a review from arik-soMarch 7, 2025 07:34
@codecov

codecovBot commented Mar 7, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 86.33540% with 22 lines in your changes missing coverage. Please review.

Project coverage is 89.22%. Comparing base (4c43a5b) to head (1426197).
Report is 5 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/channel.rs31.81%2 Missing and 13 partials ⚠️
lightning/src/ln/onion_utils.rs92.30%4 Missing and 2 partials ⚠️
lightning/src/ln/onion_payment.rs75.00%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3650 +/- ##
==========================================
- Coverage 89.24% 89.22% -0.02% 
==========================================
Files 155 155 Lines 119280 119314 +34 Branches 119280 119314 +34 ==========================================
+ Hits 106446 106463 +17 - Misses 10240 10248 +8 - Partials 2594 2603 +9 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @arik-so! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

arik-so
arik-so previously approved these changes Mar 10, 2025
Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_route_tests.rs
arik-so
arik-so previously approved these changes Mar 10, 2025

@arik-soarik-so 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.

re-acking

packet.hmac = Hmac::from_engine(hmac).to_byte_array();

packet
OnionErrorPacket { data: packet.encode() }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Bleh, it seems pretty weird that we now have OnionErrorPackets flying around (at least outside of onion_utils.rs) that are both decrypted and encrypted. I think the reason it was written the way it was previously was specifically to avoid that - holding the encoded bytes until we get around to encrypting, then making it an OnionErrorPacket. It seems much too easy now to double-en/decrypt or forget to en/decrypt.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think a similar situation already existed for intermediate nodes? In

encrypt_failure_packet(incoming_packet_shared_secret,&err.data)
, an OnionErrorPacket received from downstream is encrypted into again an OnionErrorPacket.

The way I see it is that there's "data" in the packet that needs to be encrypted, and it doesn't matter whether that data is 0, 1, 2, etc times encrypted already.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Open to alternatives of course. Were you thinking of pulling the encrypt step into build_failure_packet too?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Yea, certainly not saying the old code was perfect and indeed its already the case that things are encrypted multiple times. I guess I just saw OnionErrorPacket as "encrypted thing ready to go over the wire/received on the wire". Certainly stuff internal to onion_utils doesn't matter quite as much, but once it leaves onion_utils.rs it looks like it'd be really easy to have code that just forgets to encrypt/decrypt (ie the callsite would just read build_failure_packet and the fact that its unencrypted isn't obvious).

Pulling the encrypt step into build_failure_packet seems like one perfectly good way to address it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done. Just kept a non-public unencrypted version of build_failure_packet for the bolt test vector test.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/msgs.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch 3 times, most recently from fe6cd21 to baffc82CompareMarch 10, 2025 15:36
Comment threadlightning/src/ln/onion_utils.rs Outdated
shared_secret: &[u8], raw_packet: &[u8],
) -> msgs::OnionErrorPacket {
/// Encrypts/decrypts a failure packet.
pub(super) fn crypt_failure_packet(shared_secret: &[u8], packet: &mut OnionErrorPacket) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Does this need to remain public now?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's used in onion_route_tests.rs - I think there is no other way to make it available there, or is there?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Often we do a test wrapper like the below. For four LoC we could even just copy them into the tests, though.

#[cfg(test)]
pub fn test_crypt_failure_packet(shared_secret, packet) { crypt_failure_packet(shared_secret, packet) }

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Well, it's about testing that function also, so wouldn't want to copy it.

Created the test wrapper.

Comment threadlightning/src/ln/onion_utils.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from baffc82 to 9fbbcdcCompareMarch 10, 2025 19:29

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This LGTM once fixups are squashed.

joostjagerand others added 2 commits March 10, 2025 23:22
Prepares for extending OnionErrorPacket with attribution data.
This commits prepares the persistence layer for the addition of
attribution data. Changes:
- Expand InboundHTLCRemovalReason serialization instead of using the
macro. When attribution data is added, it can't just be serialized
along with the existing fields because it would break backwards
compatibility. Instead the new field needs to go into the tlv block.
- Stop using OnionErrorPacket in the UpdateFailHTLC message. When
attribution data is added to OnionErrorPacket, it would not be
serialized for the wire properly because also here the new field needs
to go in the tlv extension of the message.
- Prepare HTLCFailReasonRepr serialization for that addition of
attribution data.
Co-authored-by: Matt Corallo <git@bluematt.me>
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from db221e2 to 1426197CompareMarch 10, 2025 22:26
@joostjager
joostjager merged commit 0e1bbc4 into lightningdevkit:mainMar 11, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

weekly goalSomeone wants to land this this week

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@joostjager@ldk-reviews-bot@TheBlueMatt@arik-so
, '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

Attributable failures prefactor - #3650

Merged
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor
Mar 11, 2025
Merged

Attributable failures prefactor#3650
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor

Conversation

@joostjager

Copy link
Copy Markdown
Contributor

Preparatory non-functional commits extracted from #3611

@ldk-reviews-bot

ldk-reviews-bot commented Mar 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @arik-so 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.

@joostjagerjoostjager added the weekly goal Someone wants to land this this week label Mar 6, 2025
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from 894c91e to f82cb5aCompareMarch 6, 2025 22:08
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Rebased

Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_utils.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from f82cb5a to 8d01eb9CompareMarch 7, 2025 07:33
@joostjager
joostjager requested a review from arik-soMarch 7, 2025 07:34
@codecov

codecovBot commented Mar 7, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 86.33540% with 22 lines in your changes missing coverage. Please review.

Project coverage is 89.22%. Comparing base (4c43a5b) to head (1426197).
Report is 5 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/channel.rs31.81%2 Missing and 13 partials ⚠️
lightning/src/ln/onion_utils.rs92.30%4 Missing and 2 partials ⚠️
lightning/src/ln/onion_payment.rs75.00%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3650 +/- ##
==========================================
- Coverage 89.24% 89.22% -0.02% 
==========================================
Files 155 155 Lines 119280 119314 +34 Branches 119280 119314 +34 ==========================================
+ Hits 106446 106463 +17 - Misses 10240 10248 +8 - Partials 2594 2603 +9 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @arik-so! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

arik-so
arik-so previously approved these changes Mar 10, 2025
Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_route_tests.rs
arik-so
arik-so previously approved these changes Mar 10, 2025

@arik-soarik-so 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.

re-acking

packet.hmac = Hmac::from_engine(hmac).to_byte_array();

packet
OnionErrorPacket { data: packet.encode() }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Bleh, it seems pretty weird that we now have OnionErrorPackets flying around (at least outside of onion_utils.rs) that are both decrypted and encrypted. I think the reason it was written the way it was previously was specifically to avoid that - holding the encoded bytes until we get around to encrypting, then making it an OnionErrorPacket. It seems much too easy now to double-en/decrypt or forget to en/decrypt.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think a similar situation already existed for intermediate nodes? In

encrypt_failure_packet(incoming_packet_shared_secret,&err.data)
, an OnionErrorPacket received from downstream is encrypted into again an OnionErrorPacket.

The way I see it is that there's "data" in the packet that needs to be encrypted, and it doesn't matter whether that data is 0, 1, 2, etc times encrypted already.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Open to alternatives of course. Were you thinking of pulling the encrypt step into build_failure_packet too?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Yea, certainly not saying the old code was perfect and indeed its already the case that things are encrypted multiple times. I guess I just saw OnionErrorPacket as "encrypted thing ready to go over the wire/received on the wire". Certainly stuff internal to onion_utils doesn't matter quite as much, but once it leaves onion_utils.rs it looks like it'd be really easy to have code that just forgets to encrypt/decrypt (ie the callsite would just read build_failure_packet and the fact that its unencrypted isn't obvious).

Pulling the encrypt step into build_failure_packet seems like one perfectly good way to address it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done. Just kept a non-public unencrypted version of build_failure_packet for the bolt test vector test.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/msgs.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch 3 times, most recently from fe6cd21 to baffc82CompareMarch 10, 2025 15:36
Comment threadlightning/src/ln/onion_utils.rs Outdated
shared_secret: &[u8], raw_packet: &[u8],
) -> msgs::OnionErrorPacket {
/// Encrypts/decrypts a failure packet.
pub(super) fn crypt_failure_packet(shared_secret: &[u8], packet: &mut OnionErrorPacket) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Does this need to remain public now?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's used in onion_route_tests.rs - I think there is no other way to make it available there, or is there?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Often we do a test wrapper like the below. For four LoC we could even just copy them into the tests, though.

#[cfg(test)]
pub fn test_crypt_failure_packet(shared_secret, packet) { crypt_failure_packet(shared_secret, packet) }

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Well, it's about testing that function also, so wouldn't want to copy it.

Created the test wrapper.

Comment threadlightning/src/ln/onion_utils.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from baffc82 to 9fbbcdcCompareMarch 10, 2025 19:29

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This LGTM once fixups are squashed.

joostjagerand others added 2 commits March 10, 2025 23:22
Prepares for extending OnionErrorPacket with attribution data.
This commits prepares the persistence layer for the addition of
attribution data. Changes:
- Expand InboundHTLCRemovalReason serialization instead of using the
macro. When attribution data is added, it can't just be serialized
along with the existing fields because it would break backwards
compatibility. Instead the new field needs to go into the tlv block.
- Stop using OnionErrorPacket in the UpdateFailHTLC message. When
attribution data is added to OnionErrorPacket, it would not be
serialized for the wire properly because also here the new field needs
to go in the tlv extension of the message.
- Prepare HTLCFailReasonRepr serialization for that addition of
attribution data.
Co-authored-by: Matt Corallo <git@bluematt.me>
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from db221e2 to 1426197CompareMarch 10, 2025 22:26
@joostjager
joostjager merged commit 0e1bbc4 into lightningdevkit:mainMar 11, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

weekly goalSomeone wants to land this this week

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@joostjager@ldk-reviews-bot@TheBlueMatt@arik-so
, '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

Attributable failures prefactor - #3650

Merged
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor
Mar 11, 2025
Merged

Attributable failures prefactor#3650
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor

Conversation

@joostjager

Copy link
Copy Markdown
Contributor

Preparatory non-functional commits extracted from #3611

@ldk-reviews-bot

ldk-reviews-bot commented Mar 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @arik-so 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.

@joostjagerjoostjager added the weekly goal Someone wants to land this this week label Mar 6, 2025
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from 894c91e to f82cb5aCompareMarch 6, 2025 22:08
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Rebased

Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_utils.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from f82cb5a to 8d01eb9CompareMarch 7, 2025 07:33
@joostjager
joostjager requested a review from arik-soMarch 7, 2025 07:34
@codecov

codecovBot commented Mar 7, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 86.33540% with 22 lines in your changes missing coverage. Please review.

Project coverage is 89.22%. Comparing base (4c43a5b) to head (1426197).
Report is 5 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/channel.rs31.81%2 Missing and 13 partials ⚠️
lightning/src/ln/onion_utils.rs92.30%4 Missing and 2 partials ⚠️
lightning/src/ln/onion_payment.rs75.00%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3650 +/- ##
==========================================
- Coverage 89.24% 89.22% -0.02% 
==========================================
Files 155 155 Lines 119280 119314 +34 Branches 119280 119314 +34 ==========================================
+ Hits 106446 106463 +17 - Misses 10240 10248 +8 - Partials 2594 2603 +9 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @arik-so! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

arik-so
arik-so previously approved these changes Mar 10, 2025
Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_route_tests.rs
arik-so
arik-so previously approved these changes Mar 10, 2025

@arik-soarik-so 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.

re-acking

packet.hmac = Hmac::from_engine(hmac).to_byte_array();

packet
OnionErrorPacket { data: packet.encode() }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Bleh, it seems pretty weird that we now have OnionErrorPackets flying around (at least outside of onion_utils.rs) that are both decrypted and encrypted. I think the reason it was written the way it was previously was specifically to avoid that - holding the encoded bytes until we get around to encrypting, then making it an OnionErrorPacket. It seems much too easy now to double-en/decrypt or forget to en/decrypt.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think a similar situation already existed for intermediate nodes? In

encrypt_failure_packet(incoming_packet_shared_secret,&err.data)
, an OnionErrorPacket received from downstream is encrypted into again an OnionErrorPacket.

The way I see it is that there's "data" in the packet that needs to be encrypted, and it doesn't matter whether that data is 0, 1, 2, etc times encrypted already.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Open to alternatives of course. Were you thinking of pulling the encrypt step into build_failure_packet too?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Yea, certainly not saying the old code was perfect and indeed its already the case that things are encrypted multiple times. I guess I just saw OnionErrorPacket as "encrypted thing ready to go over the wire/received on the wire". Certainly stuff internal to onion_utils doesn't matter quite as much, but once it leaves onion_utils.rs it looks like it'd be really easy to have code that just forgets to encrypt/decrypt (ie the callsite would just read build_failure_packet and the fact that its unencrypted isn't obvious).

Pulling the encrypt step into build_failure_packet seems like one perfectly good way to address it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done. Just kept a non-public unencrypted version of build_failure_packet for the bolt test vector test.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/msgs.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch 3 times, most recently from fe6cd21 to baffc82CompareMarch 10, 2025 15:36
Comment threadlightning/src/ln/onion_utils.rs Outdated
shared_secret: &[u8], raw_packet: &[u8],
) -> msgs::OnionErrorPacket {
/// Encrypts/decrypts a failure packet.
pub(super) fn crypt_failure_packet(shared_secret: &[u8], packet: &mut OnionErrorPacket) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Does this need to remain public now?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's used in onion_route_tests.rs - I think there is no other way to make it available there, or is there?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Often we do a test wrapper like the below. For four LoC we could even just copy them into the tests, though.

#[cfg(test)]
pub fn test_crypt_failure_packet(shared_secret, packet) { crypt_failure_packet(shared_secret, packet) }

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Well, it's about testing that function also, so wouldn't want to copy it.

Created the test wrapper.

Comment threadlightning/src/ln/onion_utils.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from baffc82 to 9fbbcdcCompareMarch 10, 2025 19:29

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This LGTM once fixups are squashed.

joostjagerand others added 2 commits March 10, 2025 23:22
Prepares for extending OnionErrorPacket with attribution data.
This commits prepares the persistence layer for the addition of
attribution data. Changes:
- Expand InboundHTLCRemovalReason serialization instead of using the
macro. When attribution data is added, it can't just be serialized
along with the existing fields because it would break backwards
compatibility. Instead the new field needs to go into the tlv block.
- Stop using OnionErrorPacket in the UpdateFailHTLC message. When
attribution data is added to OnionErrorPacket, it would not be
serialized for the wire properly because also here the new field needs
to go in the tlv extension of the message.
- Prepare HTLCFailReasonRepr serialization for that addition of
attribution data.
Co-authored-by: Matt Corallo <git@bluematt.me>
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from db221e2 to 1426197CompareMarch 10, 2025 22:26
@joostjager
joostjager merged commit 0e1bbc4 into lightningdevkit:mainMar 11, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

weekly goalSomeone wants to land this this week

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@joostjager@ldk-reviews-bot@TheBlueMatt@arik-so
, '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

Attributable failures prefactor - #3650

Merged
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor
Mar 11, 2025
Merged

Attributable failures prefactor#3650
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor

Conversation

@joostjager

Copy link
Copy Markdown
Contributor

Preparatory non-functional commits extracted from #3611

@ldk-reviews-bot

ldk-reviews-bot commented Mar 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @arik-so 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.

@joostjagerjoostjager added the weekly goal Someone wants to land this this week label Mar 6, 2025
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from 894c91e to f82cb5aCompareMarch 6, 2025 22:08
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Rebased

Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_utils.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from f82cb5a to 8d01eb9CompareMarch 7, 2025 07:33
@joostjager
joostjager requested a review from arik-soMarch 7, 2025 07:34
@codecov

codecovBot commented Mar 7, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 86.33540% with 22 lines in your changes missing coverage. Please review.

Project coverage is 89.22%. Comparing base (4c43a5b) to head (1426197).
Report is 5 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/channel.rs31.81%2 Missing and 13 partials ⚠️
lightning/src/ln/onion_utils.rs92.30%4 Missing and 2 partials ⚠️
lightning/src/ln/onion_payment.rs75.00%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3650 +/- ##
==========================================
- Coverage 89.24% 89.22% -0.02% 
==========================================
Files 155 155 Lines 119280 119314 +34 Branches 119280 119314 +34 ==========================================
+ Hits 106446 106463 +17 - Misses 10240 10248 +8 - Partials 2594 2603 +9 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @arik-so! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

arik-so
arik-so previously approved these changes Mar 10, 2025
Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_route_tests.rs
arik-so
arik-so previously approved these changes Mar 10, 2025

@arik-soarik-so 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.

re-acking

packet.hmac = Hmac::from_engine(hmac).to_byte_array();

packet
OnionErrorPacket { data: packet.encode() }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Bleh, it seems pretty weird that we now have OnionErrorPackets flying around (at least outside of onion_utils.rs) that are both decrypted and encrypted. I think the reason it was written the way it was previously was specifically to avoid that - holding the encoded bytes until we get around to encrypting, then making it an OnionErrorPacket. It seems much too easy now to double-en/decrypt or forget to en/decrypt.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think a similar situation already existed for intermediate nodes? In

encrypt_failure_packet(incoming_packet_shared_secret,&err.data)
, an OnionErrorPacket received from downstream is encrypted into again an OnionErrorPacket.

The way I see it is that there's "data" in the packet that needs to be encrypted, and it doesn't matter whether that data is 0, 1, 2, etc times encrypted already.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Open to alternatives of course. Were you thinking of pulling the encrypt step into build_failure_packet too?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Yea, certainly not saying the old code was perfect and indeed its already the case that things are encrypted multiple times. I guess I just saw OnionErrorPacket as "encrypted thing ready to go over the wire/received on the wire". Certainly stuff internal to onion_utils doesn't matter quite as much, but once it leaves onion_utils.rs it looks like it'd be really easy to have code that just forgets to encrypt/decrypt (ie the callsite would just read build_failure_packet and the fact that its unencrypted isn't obvious).

Pulling the encrypt step into build_failure_packet seems like one perfectly good way to address it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done. Just kept a non-public unencrypted version of build_failure_packet for the bolt test vector test.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/msgs.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch 3 times, most recently from fe6cd21 to baffc82CompareMarch 10, 2025 15:36
Comment threadlightning/src/ln/onion_utils.rs Outdated
shared_secret: &[u8], raw_packet: &[u8],
) -> msgs::OnionErrorPacket {
/// Encrypts/decrypts a failure packet.
pub(super) fn crypt_failure_packet(shared_secret: &[u8], packet: &mut OnionErrorPacket) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Does this need to remain public now?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's used in onion_route_tests.rs - I think there is no other way to make it available there, or is there?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Often we do a test wrapper like the below. For four LoC we could even just copy them into the tests, though.

#[cfg(test)]
pub fn test_crypt_failure_packet(shared_secret, packet) { crypt_failure_packet(shared_secret, packet) }

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Well, it's about testing that function also, so wouldn't want to copy it.

Created the test wrapper.

Comment threadlightning/src/ln/onion_utils.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from baffc82 to 9fbbcdcCompareMarch 10, 2025 19:29

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This LGTM once fixups are squashed.

joostjagerand others added 2 commits March 10, 2025 23:22
Prepares for extending OnionErrorPacket with attribution data.
This commits prepares the persistence layer for the addition of
attribution data. Changes:
- Expand InboundHTLCRemovalReason serialization instead of using the
macro. When attribution data is added, it can't just be serialized
along with the existing fields because it would break backwards
compatibility. Instead the new field needs to go into the tlv block.
- Stop using OnionErrorPacket in the UpdateFailHTLC message. When
attribution data is added to OnionErrorPacket, it would not be
serialized for the wire properly because also here the new field needs
to go in the tlv extension of the message.
- Prepare HTLCFailReasonRepr serialization for that addition of
attribution data.
Co-authored-by: Matt Corallo <git@bluematt.me>
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from db221e2 to 1426197CompareMarch 10, 2025 22:26
@joostjager
joostjager merged commit 0e1bbc4 into lightningdevkit:mainMar 11, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

weekly goalSomeone wants to land this this week

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@joostjager@ldk-reviews-bot@TheBlueMatt@arik-so
, '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

Attributable failures prefactor - #3650

Merged
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor
Mar 11, 2025
Merged

Attributable failures prefactor#3650
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor

Conversation

@joostjager

Copy link
Copy Markdown
Contributor

Preparatory non-functional commits extracted from #3611

@ldk-reviews-bot

ldk-reviews-bot commented Mar 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @arik-so 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.

@joostjagerjoostjager added the weekly goal Someone wants to land this this week label Mar 6, 2025
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from 894c91e to f82cb5aCompareMarch 6, 2025 22:08
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Rebased

Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_utils.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from f82cb5a to 8d01eb9CompareMarch 7, 2025 07:33
@joostjager
joostjager requested a review from arik-soMarch 7, 2025 07:34
@codecov

codecovBot commented Mar 7, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 86.33540% with 22 lines in your changes missing coverage. Please review.

Project coverage is 89.22%. Comparing base (4c43a5b) to head (1426197).
Report is 5 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/channel.rs31.81%2 Missing and 13 partials ⚠️
lightning/src/ln/onion_utils.rs92.30%4 Missing and 2 partials ⚠️
lightning/src/ln/onion_payment.rs75.00%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3650 +/- ##
==========================================
- Coverage 89.24% 89.22% -0.02% 
==========================================
Files 155 155 Lines 119280 119314 +34 Branches 119280 119314 +34 ==========================================
+ Hits 106446 106463 +17 - Misses 10240 10248 +8 - Partials 2594 2603 +9 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @arik-so! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

arik-so
arik-so previously approved these changes Mar 10, 2025
Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_route_tests.rs
arik-so
arik-so previously approved these changes Mar 10, 2025

@arik-soarik-so 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.

re-acking

packet.hmac = Hmac::from_engine(hmac).to_byte_array();

packet
OnionErrorPacket { data: packet.encode() }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Bleh, it seems pretty weird that we now have OnionErrorPackets flying around (at least outside of onion_utils.rs) that are both decrypted and encrypted. I think the reason it was written the way it was previously was specifically to avoid that - holding the encoded bytes until we get around to encrypting, then making it an OnionErrorPacket. It seems much too easy now to double-en/decrypt or forget to en/decrypt.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think a similar situation already existed for intermediate nodes? In

encrypt_failure_packet(incoming_packet_shared_secret,&err.data)
, an OnionErrorPacket received from downstream is encrypted into again an OnionErrorPacket.

The way I see it is that there's "data" in the packet that needs to be encrypted, and it doesn't matter whether that data is 0, 1, 2, etc times encrypted already.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Open to alternatives of course. Were you thinking of pulling the encrypt step into build_failure_packet too?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Yea, certainly not saying the old code was perfect and indeed its already the case that things are encrypted multiple times. I guess I just saw OnionErrorPacket as "encrypted thing ready to go over the wire/received on the wire". Certainly stuff internal to onion_utils doesn't matter quite as much, but once it leaves onion_utils.rs it looks like it'd be really easy to have code that just forgets to encrypt/decrypt (ie the callsite would just read build_failure_packet and the fact that its unencrypted isn't obvious).

Pulling the encrypt step into build_failure_packet seems like one perfectly good way to address it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done. Just kept a non-public unencrypted version of build_failure_packet for the bolt test vector test.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/msgs.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch 3 times, most recently from fe6cd21 to baffc82CompareMarch 10, 2025 15:36
Comment threadlightning/src/ln/onion_utils.rs Outdated
shared_secret: &[u8], raw_packet: &[u8],
) -> msgs::OnionErrorPacket {
/// Encrypts/decrypts a failure packet.
pub(super) fn crypt_failure_packet(shared_secret: &[u8], packet: &mut OnionErrorPacket) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Does this need to remain public now?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's used in onion_route_tests.rs - I think there is no other way to make it available there, or is there?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Often we do a test wrapper like the below. For four LoC we could even just copy them into the tests, though.

#[cfg(test)]
pub fn test_crypt_failure_packet(shared_secret, packet) { crypt_failure_packet(shared_secret, packet) }

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Well, it's about testing that function also, so wouldn't want to copy it.

Created the test wrapper.

Comment threadlightning/src/ln/onion_utils.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from baffc82 to 9fbbcdcCompareMarch 10, 2025 19:29

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This LGTM once fixups are squashed.

joostjagerand others added 2 commits March 10, 2025 23:22
Prepares for extending OnionErrorPacket with attribution data.
This commits prepares the persistence layer for the addition of
attribution data. Changes:
- Expand InboundHTLCRemovalReason serialization instead of using the
macro. When attribution data is added, it can't just be serialized
along with the existing fields because it would break backwards
compatibility. Instead the new field needs to go into the tlv block.
- Stop using OnionErrorPacket in the UpdateFailHTLC message. When
attribution data is added to OnionErrorPacket, it would not be
serialized for the wire properly because also here the new field needs
to go in the tlv extension of the message.
- Prepare HTLCFailReasonRepr serialization for that addition of
attribution data.
Co-authored-by: Matt Corallo <git@bluematt.me>
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from db221e2 to 1426197CompareMarch 10, 2025 22:26
@joostjager
joostjager merged commit 0e1bbc4 into lightningdevkit:mainMar 11, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

weekly goalSomeone wants to land this this week

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@joostjager@ldk-reviews-bot@TheBlueMatt@arik-so
, '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

Attributable failures prefactor - #3650

Merged
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor
Mar 11, 2025
Merged

Attributable failures prefactor#3650
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor

Conversation

@joostjager

Copy link
Copy Markdown
Contributor

Preparatory non-functional commits extracted from #3611

@ldk-reviews-bot

ldk-reviews-bot commented Mar 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @arik-so 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.

@joostjagerjoostjager added the weekly goal Someone wants to land this this week label Mar 6, 2025
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from 894c91e to f82cb5aCompareMarch 6, 2025 22:08
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Rebased

Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_utils.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from f82cb5a to 8d01eb9CompareMarch 7, 2025 07:33
@joostjager
joostjager requested a review from arik-soMarch 7, 2025 07:34
@codecov

codecovBot commented Mar 7, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 86.33540% with 22 lines in your changes missing coverage. Please review.

Project coverage is 89.22%. Comparing base (4c43a5b) to head (1426197).
Report is 5 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/channel.rs31.81%2 Missing and 13 partials ⚠️
lightning/src/ln/onion_utils.rs92.30%4 Missing and 2 partials ⚠️
lightning/src/ln/onion_payment.rs75.00%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3650 +/- ##
==========================================
- Coverage 89.24% 89.22% -0.02% 
==========================================
Files 155 155 Lines 119280 119314 +34 Branches 119280 119314 +34 ==========================================
+ Hits 106446 106463 +17 - Misses 10240 10248 +8 - Partials 2594 2603 +9 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @arik-so! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

arik-so
arik-so previously approved these changes Mar 10, 2025
Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_route_tests.rs
arik-so
arik-so previously approved these changes Mar 10, 2025

@arik-soarik-so 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.

re-acking

packet.hmac = Hmac::from_engine(hmac).to_byte_array();

packet
OnionErrorPacket { data: packet.encode() }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Bleh, it seems pretty weird that we now have OnionErrorPackets flying around (at least outside of onion_utils.rs) that are both decrypted and encrypted. I think the reason it was written the way it was previously was specifically to avoid that - holding the encoded bytes until we get around to encrypting, then making it an OnionErrorPacket. It seems much too easy now to double-en/decrypt or forget to en/decrypt.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think a similar situation already existed for intermediate nodes? In

encrypt_failure_packet(incoming_packet_shared_secret,&err.data)
, an OnionErrorPacket received from downstream is encrypted into again an OnionErrorPacket.

The way I see it is that there's "data" in the packet that needs to be encrypted, and it doesn't matter whether that data is 0, 1, 2, etc times encrypted already.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Open to alternatives of course. Were you thinking of pulling the encrypt step into build_failure_packet too?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Yea, certainly not saying the old code was perfect and indeed its already the case that things are encrypted multiple times. I guess I just saw OnionErrorPacket as "encrypted thing ready to go over the wire/received on the wire". Certainly stuff internal to onion_utils doesn't matter quite as much, but once it leaves onion_utils.rs it looks like it'd be really easy to have code that just forgets to encrypt/decrypt (ie the callsite would just read build_failure_packet and the fact that its unencrypted isn't obvious).

Pulling the encrypt step into build_failure_packet seems like one perfectly good way to address it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done. Just kept a non-public unencrypted version of build_failure_packet for the bolt test vector test.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/msgs.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch 3 times, most recently from fe6cd21 to baffc82CompareMarch 10, 2025 15:36
Comment threadlightning/src/ln/onion_utils.rs Outdated
shared_secret: &[u8], raw_packet: &[u8],
) -> msgs::OnionErrorPacket {
/// Encrypts/decrypts a failure packet.
pub(super) fn crypt_failure_packet(shared_secret: &[u8], packet: &mut OnionErrorPacket) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Does this need to remain public now?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's used in onion_route_tests.rs - I think there is no other way to make it available there, or is there?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Often we do a test wrapper like the below. For four LoC we could even just copy them into the tests, though.

#[cfg(test)]
pub fn test_crypt_failure_packet(shared_secret, packet) { crypt_failure_packet(shared_secret, packet) }

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Well, it's about testing that function also, so wouldn't want to copy it.

Created the test wrapper.

Comment threadlightning/src/ln/onion_utils.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from baffc82 to 9fbbcdcCompareMarch 10, 2025 19:29

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This LGTM once fixups are squashed.

joostjagerand others added 2 commits March 10, 2025 23:22
Prepares for extending OnionErrorPacket with attribution data.
This commits prepares the persistence layer for the addition of
attribution data. Changes:
- Expand InboundHTLCRemovalReason serialization instead of using the
macro. When attribution data is added, it can't just be serialized
along with the existing fields because it would break backwards
compatibility. Instead the new field needs to go into the tlv block.
- Stop using OnionErrorPacket in the UpdateFailHTLC message. When
attribution data is added to OnionErrorPacket, it would not be
serialized for the wire properly because also here the new field needs
to go in the tlv extension of the message.
- Prepare HTLCFailReasonRepr serialization for that addition of
attribution data.
Co-authored-by: Matt Corallo <git@bluematt.me>
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from db221e2 to 1426197CompareMarch 10, 2025 22:26
@joostjager
joostjager merged commit 0e1bbc4 into lightningdevkit:mainMar 11, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

weekly goalSomeone wants to land this this week

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@joostjager@ldk-reviews-bot@TheBlueMatt@arik-so
, '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

Attributable failures prefactor - #3650

Merged
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor
Mar 11, 2025
Merged

Attributable failures prefactor#3650
joostjager merged 2 commits into
lightningdevkit:mainfrom
joostjager:attributable-failures-prefactor

Conversation

@joostjager

Copy link
Copy Markdown
Contributor

Preparatory non-functional commits extracted from #3611

@ldk-reviews-bot

ldk-reviews-bot commented Mar 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @arik-so 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.

@joostjagerjoostjager added the weekly goal Someone wants to land this this week label Mar 6, 2025
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from 894c91e to f82cb5aCompareMarch 6, 2025 22:08
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Rebased

Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_utils.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from f82cb5a to 8d01eb9CompareMarch 7, 2025 07:33
@joostjager
joostjager requested a review from arik-soMarch 7, 2025 07:34
@codecov

codecovBot commented Mar 7, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 86.33540% with 22 lines in your changes missing coverage. Please review.

Project coverage is 89.22%. Comparing base (4c43a5b) to head (1426197).
Report is 5 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/channel.rs31.81%2 Missing and 13 partials ⚠️
lightning/src/ln/onion_utils.rs92.30%4 Missing and 2 partials ⚠️
lightning/src/ln/onion_payment.rs75.00%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3650 +/- ##
==========================================
- Coverage 89.24% 89.22% -0.02% 
==========================================
Files 155 155 Lines 119280 119314 +34 Branches 119280 119314 +34 ==========================================
+ Hits 106446 106463 +17 - Misses 10240 10248 +8 - Partials 2594 2603 +9 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @arik-so! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

arik-so
arik-so previously approved these changes Mar 10, 2025
Comment threadlightning/src/ln/onion_route_tests.rs
Comment threadlightning/src/ln/onion_route_tests.rs
arik-so
arik-so previously approved these changes Mar 10, 2025

@arik-soarik-so 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.

re-acking

packet.hmac = Hmac::from_engine(hmac).to_byte_array();

packet
OnionErrorPacket { data: packet.encode() }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Bleh, it seems pretty weird that we now have OnionErrorPackets flying around (at least outside of onion_utils.rs) that are both decrypted and encrypted. I think the reason it was written the way it was previously was specifically to avoid that - holding the encoded bytes until we get around to encrypting, then making it an OnionErrorPacket. It seems much too easy now to double-en/decrypt or forget to en/decrypt.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think a similar situation already existed for intermediate nodes? In

encrypt_failure_packet(incoming_packet_shared_secret,&err.data)
, an OnionErrorPacket received from downstream is encrypted into again an OnionErrorPacket.

The way I see it is that there's "data" in the packet that needs to be encrypted, and it doesn't matter whether that data is 0, 1, 2, etc times encrypted already.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Open to alternatives of course. Were you thinking of pulling the encrypt step into build_failure_packet too?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Yea, certainly not saying the old code was perfect and indeed its already the case that things are encrypted multiple times. I guess I just saw OnionErrorPacket as "encrypted thing ready to go over the wire/received on the wire". Certainly stuff internal to onion_utils doesn't matter quite as much, but once it leaves onion_utils.rs it looks like it'd be really easy to have code that just forgets to encrypt/decrypt (ie the callsite would just read build_failure_packet and the fact that its unencrypted isn't obvious).

Pulling the encrypt step into build_failure_packet seems like one perfectly good way to address it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done. Just kept a non-public unencrypted version of build_failure_packet for the bolt test vector test.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/msgs.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch 3 times, most recently from fe6cd21 to baffc82CompareMarch 10, 2025 15:36
Comment threadlightning/src/ln/onion_utils.rs Outdated
shared_secret: &[u8], raw_packet: &[u8],
) -> msgs::OnionErrorPacket {
/// Encrypts/decrypts a failure packet.
pub(super) fn crypt_failure_packet(shared_secret: &[u8], packet: &mut OnionErrorPacket) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Does this need to remain public now?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's used in onion_route_tests.rs - I think there is no other way to make it available there, or is there?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Often we do a test wrapper like the below. For four LoC we could even just copy them into the tests, though.

#[cfg(test)]
pub fn test_crypt_failure_packet(shared_secret, packet) { crypt_failure_packet(shared_secret, packet) }

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Well, it's about testing that function also, so wouldn't want to copy it.

Created the test wrapper.

Comment threadlightning/src/ln/onion_utils.rs Outdated
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from baffc82 to 9fbbcdcCompareMarch 10, 2025 19:29

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This LGTM once fixups are squashed.

joostjagerand others added 2 commits March 10, 2025 23:22
Prepares for extending OnionErrorPacket with attribution data.
This commits prepares the persistence layer for the addition of
attribution data. Changes:
- Expand InboundHTLCRemovalReason serialization instead of using the
macro. When attribution data is added, it can't just be serialized
along with the existing fields because it would break backwards
compatibility. Instead the new field needs to go into the tlv block.
- Stop using OnionErrorPacket in the UpdateFailHTLC message. When
attribution data is added to OnionErrorPacket, it would not be
serialized for the wire properly because also here the new field needs
to go in the tlv extension of the message.
- Prepare HTLCFailReasonRepr serialization for that addition of
attribution data.
Co-authored-by: Matt Corallo <git@bluematt.me>
@joostjager
joostjagerforce-pushed the attributable-failures-prefactor branch from db221e2 to 1426197CompareMarch 10, 2025 22:26
@joostjager
joostjager merged commit 0e1bbc4 into lightningdevkit:mainMar 11, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

weekly goalSomeone wants to land this this week

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@joostjager@ldk-reviews-bot@TheBlueMatt@arik-so