Avoid storing a full FinalOnionHopData in OnionPayload::Invoice - #1447

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData
May 2, 2022
Merged

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice#1447
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData

Conversation

@andozw

Copy link
Copy Markdown

Splits these commits from #1221 and #1445 because they should be separate.

See #1445 (review)

@codecov-commenter

codecov-commenter commented Apr 23, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1447 (fc77c57) into main (9bdce47) will decrease coverage by 0.00%.
The diff coverage is 80.55%.

@@ Coverage Diff @@## main #1447 +/- ##
==========================================
- Coverage 90.90% 90.89% -0.01% 
==========================================
Files 75 75 Lines 41616 41624 +8 Branches 41616 41624 +8 ==========================================
+ Hits 37829 37834 +5 - Misses 3787 3790 +3 
Impacted FilesCoverage Δ
lightning/src/ln/channelmanager.rs84.70% <80.00%> (-0.05%)⬇️
lightning/src/ln/inbound_payment.rs93.49% <100.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9bdce47...fc77c57. Read the comment docs.

vincenzopalazzo
vincenzopalazzo previously approved these changes Apr 25, 2022

@vincenzopalazzovincenzopalazzo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {
log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
log_bytes!(payment_hash.0), total_value, $payment_data_total_msat);
fail_htlc!(claimable_htlc);

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.

Gah, this is wrong and our test coverage is really lacking here. I'm working on some improved testing here but in the mean time the fail_htlc call has to stay and the htlcs.push calls need to go back in the branches instead of being unconditional.

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.

Do you intend to resolve it in this PR before merging it?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

Comment on lines 173 to +181
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
total_msat: u64,

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.

Could be nice to document the difference between value and total_msat

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.

Agreed; in fact, would be necessary imo

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Is this close to accurate?

/// HTLCs that are to us and can be failed/claimed by the user
struct ClaimableHTLC {
prev_hop: HTLCPreviousHopData,
cltv_expiry: u32,
/// The amount (in msats) of this MPP part
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
/// The sum total of all MPP parts
total_msat: u64,
}

It was not super clear to me, but I am going to walk through the code more and try to figure it out.

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.

That looks good to me!

@andozw

Copy link
Copy Markdown
Author

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

I'll give it a go

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from b4ba546 to d0cf6b8CompareApril 29, 2022 16:33
Comment threadlightning/src/ln/channelmanager.rs Outdated
}
}
if total_value >= msgs::MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@TheBlueMatt - should this be || total_value > $payment_data.total_msat ? The tests pass either way. I haven't rebased against #1451 yet but it looks like that one might be ready to merge?

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, its definitely more readable that way. That said I believe they're the same, though its a good bit of careful reading to see that, and I'm not even 100% confident of that after reading it five times.

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from d0cf6b8 to 4da7916CompareApril 29, 2022 17:18
@andozw

Copy link
Copy Markdown
Author

rebased

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

One comment but otherwise ACK with Matt's suggestion. Appreciate that these commits were separated out!

Comment threadlightning/src/ln/channelmanager.rs Outdated
return false;
}
if let OnionPayload::Invoice(ref final_hop_data) = htlcs[0].onion_payload {
if let OnionPayload::Invoice { _legacy_hop_data: ref final_hop_data } = htlcs[0].onion_payload {

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.

Not a blocker, but it looks like we can get rid of this usage as well by accessing htlcs[0].total_msat instead of final_hop_data? @TheBlueMatt

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

done!

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 4da7916 to 16a6ad2CompareApril 30, 2022 16:32

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

Okay, sorry for the delay on this one, LGTM modulo two trivial comments.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Invoice(msgs::FinalOnionHopData),
Invoice {
/// This is only here for backwards-compatibility in serialization, in the future it can be
/// removed, breaking clients running 0.0.104 and earlier.

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.

heh, well that's stale - should read "0.0.106", assuming this lands for 107, which it should.

Comment threadlightning/src/ln/channelmanager.rs Outdated
(incoming_cltv_expiry, OnionPayload::Invoice(payment_data), phantom_shared_secret),
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret) = match routing {
PendingHTLCRouting::Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } => {
let _legacy_hop_data = msgs::FinalOnionHopData {

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.

nit: replace the explicit instantiation with just let _legacy_hop_data = payment_data.clone(), given that's what we're doing anyway.

...instead of accessing it via the `OnionPayload::Invoice` form.
This may be useful if we add MPP keysend support, but is directly
useful to allow us to drop `FinalOnionHopData` from `OnionPayload`.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 16a6ad2 to 1973f1fCompareMay 2, 2022 16:37
@andozw

Copy link
Copy Markdown
Author

rebased

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 1973f1f to c611affCompareMay 2, 2022 16:49
@andozw

Copy link
Copy Markdown
Author

Addressed the 2 minor fixups as an amend on the last commit since they belong there and were trivial. Should be ready for another 👀

valentinewallace
valentinewallace previously approved these changes May 2, 2022
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines 162 to 164
/// Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a
/// payment_secret which prevents path-probing attacks and can associate different HTLCs which
/// are part of the same payment.

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.

Sorry should've seen this sooner, not a blocker but I think this can be removed and just say "Indicates this incoming onion payload is for the purpose of paying an invoice" or something like that

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

So replace Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a payment_secret which prevents path-probing attacks and can associate different HTLCs which are part of the same payment.
with:
Indicates this incoming onion payload is for the purpose of paying an invoice ?

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.

Yep, that sounds great.

We only use it to check the amount when processing MPP parts, but
store the full object (including new payment metadata) in it.
Because we now store the amount in the parent structure, there is
no need for it at all in the `OnionPayload`. Sadly, for
serialization compatibility, we need it to continue to exist, at
least temporarily, but we can avoid populating the new fields in
that case.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from c611aff to fc77c57CompareMay 2, 2022 18:41
@TheBlueMatt
TheBlueMatt merged commit e3a305c into lightningdevkit:mainMay 2, 2022
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.

6 participants

@andozw@codecov-commenter@TheBlueMatt@arik-so@valentinewallace@vincenzopalazzo
, '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

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice - #1447

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData
May 2, 2022
Merged

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice#1447
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData

Conversation

@andozw

Copy link
Copy Markdown

Splits these commits from #1221 and #1445 because they should be separate.

See #1445 (review)

@codecov-commenter

codecov-commenter commented Apr 23, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1447 (fc77c57) into main (9bdce47) will decrease coverage by 0.00%.
The diff coverage is 80.55%.

@@ Coverage Diff @@## main #1447 +/- ##
==========================================
- Coverage 90.90% 90.89% -0.01% 
==========================================
Files 75 75 Lines 41616 41624 +8 Branches 41616 41624 +8 ==========================================
+ Hits 37829 37834 +5 - Misses 3787 3790 +3 
Impacted FilesCoverage Δ
lightning/src/ln/channelmanager.rs84.70% <80.00%> (-0.05%)⬇️
lightning/src/ln/inbound_payment.rs93.49% <100.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9bdce47...fc77c57. Read the comment docs.

vincenzopalazzo
vincenzopalazzo previously approved these changes Apr 25, 2022

@vincenzopalazzovincenzopalazzo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {
log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
log_bytes!(payment_hash.0), total_value, $payment_data_total_msat);
fail_htlc!(claimable_htlc);

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.

Gah, this is wrong and our test coverage is really lacking here. I'm working on some improved testing here but in the mean time the fail_htlc call has to stay and the htlcs.push calls need to go back in the branches instead of being unconditional.

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.

Do you intend to resolve it in this PR before merging it?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

Comment on lines 173 to +181
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
total_msat: u64,

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.

Could be nice to document the difference between value and total_msat

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.

Agreed; in fact, would be necessary imo

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Is this close to accurate?

/// HTLCs that are to us and can be failed/claimed by the user
struct ClaimableHTLC {
prev_hop: HTLCPreviousHopData,
cltv_expiry: u32,
/// The amount (in msats) of this MPP part
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
/// The sum total of all MPP parts
total_msat: u64,
}

It was not super clear to me, but I am going to walk through the code more and try to figure it out.

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.

That looks good to me!

@andozw

Copy link
Copy Markdown
Author

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

I'll give it a go

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from b4ba546 to d0cf6b8CompareApril 29, 2022 16:33
Comment threadlightning/src/ln/channelmanager.rs Outdated
}
}
if total_value >= msgs::MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@TheBlueMatt - should this be || total_value > $payment_data.total_msat ? The tests pass either way. I haven't rebased against #1451 yet but it looks like that one might be ready to merge?

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, its definitely more readable that way. That said I believe they're the same, though its a good bit of careful reading to see that, and I'm not even 100% confident of that after reading it five times.

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from d0cf6b8 to 4da7916CompareApril 29, 2022 17:18
@andozw

Copy link
Copy Markdown
Author

rebased

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

One comment but otherwise ACK with Matt's suggestion. Appreciate that these commits were separated out!

Comment threadlightning/src/ln/channelmanager.rs Outdated
return false;
}
if let OnionPayload::Invoice(ref final_hop_data) = htlcs[0].onion_payload {
if let OnionPayload::Invoice { _legacy_hop_data: ref final_hop_data } = htlcs[0].onion_payload {

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.

Not a blocker, but it looks like we can get rid of this usage as well by accessing htlcs[0].total_msat instead of final_hop_data? @TheBlueMatt

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

done!

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 4da7916 to 16a6ad2CompareApril 30, 2022 16:32

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

Okay, sorry for the delay on this one, LGTM modulo two trivial comments.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Invoice(msgs::FinalOnionHopData),
Invoice {
/// This is only here for backwards-compatibility in serialization, in the future it can be
/// removed, breaking clients running 0.0.104 and earlier.

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.

heh, well that's stale - should read "0.0.106", assuming this lands for 107, which it should.

Comment threadlightning/src/ln/channelmanager.rs Outdated
(incoming_cltv_expiry, OnionPayload::Invoice(payment_data), phantom_shared_secret),
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret) = match routing {
PendingHTLCRouting::Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } => {
let _legacy_hop_data = msgs::FinalOnionHopData {

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.

nit: replace the explicit instantiation with just let _legacy_hop_data = payment_data.clone(), given that's what we're doing anyway.

...instead of accessing it via the `OnionPayload::Invoice` form.
This may be useful if we add MPP keysend support, but is directly
useful to allow us to drop `FinalOnionHopData` from `OnionPayload`.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 16a6ad2 to 1973f1fCompareMay 2, 2022 16:37
@andozw

Copy link
Copy Markdown
Author

rebased

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 1973f1f to c611affCompareMay 2, 2022 16:49
@andozw

Copy link
Copy Markdown
Author

Addressed the 2 minor fixups as an amend on the last commit since they belong there and were trivial. Should be ready for another 👀

valentinewallace
valentinewallace previously approved these changes May 2, 2022
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines 162 to 164
/// Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a
/// payment_secret which prevents path-probing attacks and can associate different HTLCs which
/// are part of the same payment.

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.

Sorry should've seen this sooner, not a blocker but I think this can be removed and just say "Indicates this incoming onion payload is for the purpose of paying an invoice" or something like that

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

So replace Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a payment_secret which prevents path-probing attacks and can associate different HTLCs which are part of the same payment.
with:
Indicates this incoming onion payload is for the purpose of paying an invoice ?

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.

Yep, that sounds great.

We only use it to check the amount when processing MPP parts, but
store the full object (including new payment metadata) in it.
Because we now store the amount in the parent structure, there is
no need for it at all in the `OnionPayload`. Sadly, for
serialization compatibility, we need it to continue to exist, at
least temporarily, but we can avoid populating the new fields in
that case.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from c611aff to fc77c57CompareMay 2, 2022 18:41
@TheBlueMatt
TheBlueMatt merged commit e3a305c into lightningdevkit:mainMay 2, 2022
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.

6 participants

@andozw@codecov-commenter@TheBlueMatt@arik-so@valentinewallace@vincenzopalazzo
, '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

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice - #1447

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData
May 2, 2022
Merged

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice#1447
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData

Conversation

@andozw

Copy link
Copy Markdown

Splits these commits from #1221 and #1445 because they should be separate.

See #1445 (review)

@codecov-commenter

codecov-commenter commented Apr 23, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1447 (fc77c57) into main (9bdce47) will decrease coverage by 0.00%.
The diff coverage is 80.55%.

@@ Coverage Diff @@## main #1447 +/- ##
==========================================
- Coverage 90.90% 90.89% -0.01% 
==========================================
Files 75 75 Lines 41616 41624 +8 Branches 41616 41624 +8 ==========================================
+ Hits 37829 37834 +5 - Misses 3787 3790 +3 
Impacted FilesCoverage Δ
lightning/src/ln/channelmanager.rs84.70% <80.00%> (-0.05%)⬇️
lightning/src/ln/inbound_payment.rs93.49% <100.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9bdce47...fc77c57. Read the comment docs.

vincenzopalazzo
vincenzopalazzo previously approved these changes Apr 25, 2022

@vincenzopalazzovincenzopalazzo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {
log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
log_bytes!(payment_hash.0), total_value, $payment_data_total_msat);
fail_htlc!(claimable_htlc);

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.

Gah, this is wrong and our test coverage is really lacking here. I'm working on some improved testing here but in the mean time the fail_htlc call has to stay and the htlcs.push calls need to go back in the branches instead of being unconditional.

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.

Do you intend to resolve it in this PR before merging it?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

Comment on lines 173 to +181
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
total_msat: u64,

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.

Could be nice to document the difference between value and total_msat

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.

Agreed; in fact, would be necessary imo

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Is this close to accurate?

/// HTLCs that are to us and can be failed/claimed by the user
struct ClaimableHTLC {
prev_hop: HTLCPreviousHopData,
cltv_expiry: u32,
/// The amount (in msats) of this MPP part
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
/// The sum total of all MPP parts
total_msat: u64,
}

It was not super clear to me, but I am going to walk through the code more and try to figure it out.

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.

That looks good to me!

@andozw

Copy link
Copy Markdown
Author

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

I'll give it a go

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from b4ba546 to d0cf6b8CompareApril 29, 2022 16:33
Comment threadlightning/src/ln/channelmanager.rs Outdated
}
}
if total_value >= msgs::MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@TheBlueMatt - should this be || total_value > $payment_data.total_msat ? The tests pass either way. I haven't rebased against #1451 yet but it looks like that one might be ready to merge?

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, its definitely more readable that way. That said I believe they're the same, though its a good bit of careful reading to see that, and I'm not even 100% confident of that after reading it five times.

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from d0cf6b8 to 4da7916CompareApril 29, 2022 17:18
@andozw

Copy link
Copy Markdown
Author

rebased

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

One comment but otherwise ACK with Matt's suggestion. Appreciate that these commits were separated out!

Comment threadlightning/src/ln/channelmanager.rs Outdated
return false;
}
if let OnionPayload::Invoice(ref final_hop_data) = htlcs[0].onion_payload {
if let OnionPayload::Invoice { _legacy_hop_data: ref final_hop_data } = htlcs[0].onion_payload {

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.

Not a blocker, but it looks like we can get rid of this usage as well by accessing htlcs[0].total_msat instead of final_hop_data? @TheBlueMatt

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

done!

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 4da7916 to 16a6ad2CompareApril 30, 2022 16:32

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

Okay, sorry for the delay on this one, LGTM modulo two trivial comments.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Invoice(msgs::FinalOnionHopData),
Invoice {
/// This is only here for backwards-compatibility in serialization, in the future it can be
/// removed, breaking clients running 0.0.104 and earlier.

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.

heh, well that's stale - should read "0.0.106", assuming this lands for 107, which it should.

Comment threadlightning/src/ln/channelmanager.rs Outdated
(incoming_cltv_expiry, OnionPayload::Invoice(payment_data), phantom_shared_secret),
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret) = match routing {
PendingHTLCRouting::Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } => {
let _legacy_hop_data = msgs::FinalOnionHopData {

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.

nit: replace the explicit instantiation with just let _legacy_hop_data = payment_data.clone(), given that's what we're doing anyway.

...instead of accessing it via the `OnionPayload::Invoice` form.
This may be useful if we add MPP keysend support, but is directly
useful to allow us to drop `FinalOnionHopData` from `OnionPayload`.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 16a6ad2 to 1973f1fCompareMay 2, 2022 16:37
@andozw

Copy link
Copy Markdown
Author

rebased

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 1973f1f to c611affCompareMay 2, 2022 16:49
@andozw

Copy link
Copy Markdown
Author

Addressed the 2 minor fixups as an amend on the last commit since they belong there and were trivial. Should be ready for another 👀

valentinewallace
valentinewallace previously approved these changes May 2, 2022
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines 162 to 164
/// Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a
/// payment_secret which prevents path-probing attacks and can associate different HTLCs which
/// are part of the same payment.

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.

Sorry should've seen this sooner, not a blocker but I think this can be removed and just say "Indicates this incoming onion payload is for the purpose of paying an invoice" or something like that

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

So replace Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a payment_secret which prevents path-probing attacks and can associate different HTLCs which are part of the same payment.
with:
Indicates this incoming onion payload is for the purpose of paying an invoice ?

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.

Yep, that sounds great.

We only use it to check the amount when processing MPP parts, but
store the full object (including new payment metadata) in it.
Because we now store the amount in the parent structure, there is
no need for it at all in the `OnionPayload`. Sadly, for
serialization compatibility, we need it to continue to exist, at
least temporarily, but we can avoid populating the new fields in
that case.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from c611aff to fc77c57CompareMay 2, 2022 18:41
@TheBlueMatt
TheBlueMatt merged commit e3a305c into lightningdevkit:mainMay 2, 2022
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.

6 participants

@andozw@codecov-commenter@TheBlueMatt@arik-so@valentinewallace@vincenzopalazzo
, '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

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice - #1447

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData
May 2, 2022
Merged

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice#1447
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData

Conversation

@andozw

Copy link
Copy Markdown

Splits these commits from #1221 and #1445 because they should be separate.

See #1445 (review)

@codecov-commenter

codecov-commenter commented Apr 23, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1447 (fc77c57) into main (9bdce47) will decrease coverage by 0.00%.
The diff coverage is 80.55%.

@@ Coverage Diff @@## main #1447 +/- ##
==========================================
- Coverage 90.90% 90.89% -0.01% 
==========================================
Files 75 75 Lines 41616 41624 +8 Branches 41616 41624 +8 ==========================================
+ Hits 37829 37834 +5 - Misses 3787 3790 +3 
Impacted FilesCoverage Δ
lightning/src/ln/channelmanager.rs84.70% <80.00%> (-0.05%)⬇️
lightning/src/ln/inbound_payment.rs93.49% <100.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9bdce47...fc77c57. Read the comment docs.

vincenzopalazzo
vincenzopalazzo previously approved these changes Apr 25, 2022

@vincenzopalazzovincenzopalazzo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {
log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
log_bytes!(payment_hash.0), total_value, $payment_data_total_msat);
fail_htlc!(claimable_htlc);

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.

Gah, this is wrong and our test coverage is really lacking here. I'm working on some improved testing here but in the mean time the fail_htlc call has to stay and the htlcs.push calls need to go back in the branches instead of being unconditional.

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.

Do you intend to resolve it in this PR before merging it?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

Comment on lines 173 to +181
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
total_msat: u64,

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.

Could be nice to document the difference between value and total_msat

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.

Agreed; in fact, would be necessary imo

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Is this close to accurate?

/// HTLCs that are to us and can be failed/claimed by the user
struct ClaimableHTLC {
prev_hop: HTLCPreviousHopData,
cltv_expiry: u32,
/// The amount (in msats) of this MPP part
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
/// The sum total of all MPP parts
total_msat: u64,
}

It was not super clear to me, but I am going to walk through the code more and try to figure it out.

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.

That looks good to me!

@andozw

Copy link
Copy Markdown
Author

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

I'll give it a go

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from b4ba546 to d0cf6b8CompareApril 29, 2022 16:33
Comment threadlightning/src/ln/channelmanager.rs Outdated
}
}
if total_value >= msgs::MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@TheBlueMatt - should this be || total_value > $payment_data.total_msat ? The tests pass either way. I haven't rebased against #1451 yet but it looks like that one might be ready to merge?

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, its definitely more readable that way. That said I believe they're the same, though its a good bit of careful reading to see that, and I'm not even 100% confident of that after reading it five times.

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from d0cf6b8 to 4da7916CompareApril 29, 2022 17:18
@andozw

Copy link
Copy Markdown
Author

rebased

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

One comment but otherwise ACK with Matt's suggestion. Appreciate that these commits were separated out!

Comment threadlightning/src/ln/channelmanager.rs Outdated
return false;
}
if let OnionPayload::Invoice(ref final_hop_data) = htlcs[0].onion_payload {
if let OnionPayload::Invoice { _legacy_hop_data: ref final_hop_data } = htlcs[0].onion_payload {

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.

Not a blocker, but it looks like we can get rid of this usage as well by accessing htlcs[0].total_msat instead of final_hop_data? @TheBlueMatt

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

done!

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 4da7916 to 16a6ad2CompareApril 30, 2022 16:32

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

Okay, sorry for the delay on this one, LGTM modulo two trivial comments.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Invoice(msgs::FinalOnionHopData),
Invoice {
/// This is only here for backwards-compatibility in serialization, in the future it can be
/// removed, breaking clients running 0.0.104 and earlier.

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.

heh, well that's stale - should read "0.0.106", assuming this lands for 107, which it should.

Comment threadlightning/src/ln/channelmanager.rs Outdated
(incoming_cltv_expiry, OnionPayload::Invoice(payment_data), phantom_shared_secret),
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret) = match routing {
PendingHTLCRouting::Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } => {
let _legacy_hop_data = msgs::FinalOnionHopData {

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.

nit: replace the explicit instantiation with just let _legacy_hop_data = payment_data.clone(), given that's what we're doing anyway.

...instead of accessing it via the `OnionPayload::Invoice` form.
This may be useful if we add MPP keysend support, but is directly
useful to allow us to drop `FinalOnionHopData` from `OnionPayload`.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 16a6ad2 to 1973f1fCompareMay 2, 2022 16:37
@andozw

Copy link
Copy Markdown
Author

rebased

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 1973f1f to c611affCompareMay 2, 2022 16:49
@andozw

Copy link
Copy Markdown
Author

Addressed the 2 minor fixups as an amend on the last commit since they belong there and were trivial. Should be ready for another 👀

valentinewallace
valentinewallace previously approved these changes May 2, 2022
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines 162 to 164
/// Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a
/// payment_secret which prevents path-probing attacks and can associate different HTLCs which
/// are part of the same payment.

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.

Sorry should've seen this sooner, not a blocker but I think this can be removed and just say "Indicates this incoming onion payload is for the purpose of paying an invoice" or something like that

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

So replace Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a payment_secret which prevents path-probing attacks and can associate different HTLCs which are part of the same payment.
with:
Indicates this incoming onion payload is for the purpose of paying an invoice ?

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.

Yep, that sounds great.

We only use it to check the amount when processing MPP parts, but
store the full object (including new payment metadata) in it.
Because we now store the amount in the parent structure, there is
no need for it at all in the `OnionPayload`. Sadly, for
serialization compatibility, we need it to continue to exist, at
least temporarily, but we can avoid populating the new fields in
that case.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from c611aff to fc77c57CompareMay 2, 2022 18:41
@TheBlueMatt
TheBlueMatt merged commit e3a305c into lightningdevkit:mainMay 2, 2022
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.

6 participants

@andozw@codecov-commenter@TheBlueMatt@arik-so@valentinewallace@vincenzopalazzo
, '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

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice - #1447

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData
May 2, 2022
Merged

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice#1447
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData

Conversation

@andozw

Copy link
Copy Markdown

Splits these commits from #1221 and #1445 because they should be separate.

See #1445 (review)

@codecov-commenter

codecov-commenter commented Apr 23, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1447 (fc77c57) into main (9bdce47) will decrease coverage by 0.00%.
The diff coverage is 80.55%.

@@ Coverage Diff @@## main #1447 +/- ##
==========================================
- Coverage 90.90% 90.89% -0.01% 
==========================================
Files 75 75 Lines 41616 41624 +8 Branches 41616 41624 +8 ==========================================
+ Hits 37829 37834 +5 - Misses 3787 3790 +3 
Impacted FilesCoverage Δ
lightning/src/ln/channelmanager.rs84.70% <80.00%> (-0.05%)⬇️
lightning/src/ln/inbound_payment.rs93.49% <100.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9bdce47...fc77c57. Read the comment docs.

vincenzopalazzo
vincenzopalazzo previously approved these changes Apr 25, 2022

@vincenzopalazzovincenzopalazzo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {
log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
log_bytes!(payment_hash.0), total_value, $payment_data_total_msat);
fail_htlc!(claimable_htlc);

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.

Gah, this is wrong and our test coverage is really lacking here. I'm working on some improved testing here but in the mean time the fail_htlc call has to stay and the htlcs.push calls need to go back in the branches instead of being unconditional.

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.

Do you intend to resolve it in this PR before merging it?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

Comment on lines 173 to +181
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
total_msat: u64,

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.

Could be nice to document the difference between value and total_msat

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.

Agreed; in fact, would be necessary imo

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Is this close to accurate?

/// HTLCs that are to us and can be failed/claimed by the user
struct ClaimableHTLC {
prev_hop: HTLCPreviousHopData,
cltv_expiry: u32,
/// The amount (in msats) of this MPP part
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
/// The sum total of all MPP parts
total_msat: u64,
}

It was not super clear to me, but I am going to walk through the code more and try to figure it out.

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.

That looks good to me!

@andozw

Copy link
Copy Markdown
Author

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

I'll give it a go

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from b4ba546 to d0cf6b8CompareApril 29, 2022 16:33
Comment threadlightning/src/ln/channelmanager.rs Outdated
}
}
if total_value >= msgs::MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@TheBlueMatt - should this be || total_value > $payment_data.total_msat ? The tests pass either way. I haven't rebased against #1451 yet but it looks like that one might be ready to merge?

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, its definitely more readable that way. That said I believe they're the same, though its a good bit of careful reading to see that, and I'm not even 100% confident of that after reading it five times.

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from d0cf6b8 to 4da7916CompareApril 29, 2022 17:18
@andozw

Copy link
Copy Markdown
Author

rebased

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

One comment but otherwise ACK with Matt's suggestion. Appreciate that these commits were separated out!

Comment threadlightning/src/ln/channelmanager.rs Outdated
return false;
}
if let OnionPayload::Invoice(ref final_hop_data) = htlcs[0].onion_payload {
if let OnionPayload::Invoice { _legacy_hop_data: ref final_hop_data } = htlcs[0].onion_payload {

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.

Not a blocker, but it looks like we can get rid of this usage as well by accessing htlcs[0].total_msat instead of final_hop_data? @TheBlueMatt

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

done!

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 4da7916 to 16a6ad2CompareApril 30, 2022 16:32

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

Okay, sorry for the delay on this one, LGTM modulo two trivial comments.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Invoice(msgs::FinalOnionHopData),
Invoice {
/// This is only here for backwards-compatibility in serialization, in the future it can be
/// removed, breaking clients running 0.0.104 and earlier.

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.

heh, well that's stale - should read "0.0.106", assuming this lands for 107, which it should.

Comment threadlightning/src/ln/channelmanager.rs Outdated
(incoming_cltv_expiry, OnionPayload::Invoice(payment_data), phantom_shared_secret),
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret) = match routing {
PendingHTLCRouting::Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } => {
let _legacy_hop_data = msgs::FinalOnionHopData {

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.

nit: replace the explicit instantiation with just let _legacy_hop_data = payment_data.clone(), given that's what we're doing anyway.

...instead of accessing it via the `OnionPayload::Invoice` form.
This may be useful if we add MPP keysend support, but is directly
useful to allow us to drop `FinalOnionHopData` from `OnionPayload`.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 16a6ad2 to 1973f1fCompareMay 2, 2022 16:37
@andozw

Copy link
Copy Markdown
Author

rebased

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 1973f1f to c611affCompareMay 2, 2022 16:49
@andozw

Copy link
Copy Markdown
Author

Addressed the 2 minor fixups as an amend on the last commit since they belong there and were trivial. Should be ready for another 👀

valentinewallace
valentinewallace previously approved these changes May 2, 2022
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines 162 to 164
/// Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a
/// payment_secret which prevents path-probing attacks and can associate different HTLCs which
/// are part of the same payment.

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.

Sorry should've seen this sooner, not a blocker but I think this can be removed and just say "Indicates this incoming onion payload is for the purpose of paying an invoice" or something like that

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

So replace Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a payment_secret which prevents path-probing attacks and can associate different HTLCs which are part of the same payment.
with:
Indicates this incoming onion payload is for the purpose of paying an invoice ?

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.

Yep, that sounds great.

We only use it to check the amount when processing MPP parts, but
store the full object (including new payment metadata) in it.
Because we now store the amount in the parent structure, there is
no need for it at all in the `OnionPayload`. Sadly, for
serialization compatibility, we need it to continue to exist, at
least temporarily, but we can avoid populating the new fields in
that case.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from c611aff to fc77c57CompareMay 2, 2022 18:41
@TheBlueMatt
TheBlueMatt merged commit e3a305c into lightningdevkit:mainMay 2, 2022
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.

6 participants

@andozw@codecov-commenter@TheBlueMatt@arik-so@valentinewallace@vincenzopalazzo
, '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

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice - #1447

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData
May 2, 2022
Merged

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice#1447
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData

Conversation

@andozw

Copy link
Copy Markdown

Splits these commits from #1221 and #1445 because they should be separate.

See #1445 (review)

@codecov-commenter

codecov-commenter commented Apr 23, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1447 (fc77c57) into main (9bdce47) will decrease coverage by 0.00%.
The diff coverage is 80.55%.

@@ Coverage Diff @@## main #1447 +/- ##
==========================================
- Coverage 90.90% 90.89% -0.01% 
==========================================
Files 75 75 Lines 41616 41624 +8 Branches 41616 41624 +8 ==========================================
+ Hits 37829 37834 +5 - Misses 3787 3790 +3 
Impacted FilesCoverage Δ
lightning/src/ln/channelmanager.rs84.70% <80.00%> (-0.05%)⬇️
lightning/src/ln/inbound_payment.rs93.49% <100.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9bdce47...fc77c57. Read the comment docs.

vincenzopalazzo
vincenzopalazzo previously approved these changes Apr 25, 2022

@vincenzopalazzovincenzopalazzo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {
log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
log_bytes!(payment_hash.0), total_value, $payment_data_total_msat);
fail_htlc!(claimable_htlc);

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.

Gah, this is wrong and our test coverage is really lacking here. I'm working on some improved testing here but in the mean time the fail_htlc call has to stay and the htlcs.push calls need to go back in the branches instead of being unconditional.

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.

Do you intend to resolve it in this PR before merging it?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

Comment on lines 173 to +181
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
total_msat: u64,

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.

Could be nice to document the difference between value and total_msat

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.

Agreed; in fact, would be necessary imo

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Is this close to accurate?

/// HTLCs that are to us and can be failed/claimed by the user
struct ClaimableHTLC {
prev_hop: HTLCPreviousHopData,
cltv_expiry: u32,
/// The amount (in msats) of this MPP part
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
/// The sum total of all MPP parts
total_msat: u64,
}

It was not super clear to me, but I am going to walk through the code more and try to figure it out.

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.

That looks good to me!

@andozw

Copy link
Copy Markdown
Author

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

I'll give it a go

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from b4ba546 to d0cf6b8CompareApril 29, 2022 16:33
Comment threadlightning/src/ln/channelmanager.rs Outdated
}
}
if total_value >= msgs::MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@TheBlueMatt - should this be || total_value > $payment_data.total_msat ? The tests pass either way. I haven't rebased against #1451 yet but it looks like that one might be ready to merge?

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, its definitely more readable that way. That said I believe they're the same, though its a good bit of careful reading to see that, and I'm not even 100% confident of that after reading it five times.

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from d0cf6b8 to 4da7916CompareApril 29, 2022 17:18
@andozw

Copy link
Copy Markdown
Author

rebased

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

One comment but otherwise ACK with Matt's suggestion. Appreciate that these commits were separated out!

Comment threadlightning/src/ln/channelmanager.rs Outdated
return false;
}
if let OnionPayload::Invoice(ref final_hop_data) = htlcs[0].onion_payload {
if let OnionPayload::Invoice { _legacy_hop_data: ref final_hop_data } = htlcs[0].onion_payload {

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.

Not a blocker, but it looks like we can get rid of this usage as well by accessing htlcs[0].total_msat instead of final_hop_data? @TheBlueMatt

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

done!

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 4da7916 to 16a6ad2CompareApril 30, 2022 16:32

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

Okay, sorry for the delay on this one, LGTM modulo two trivial comments.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Invoice(msgs::FinalOnionHopData),
Invoice {
/// This is only here for backwards-compatibility in serialization, in the future it can be
/// removed, breaking clients running 0.0.104 and earlier.

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.

heh, well that's stale - should read "0.0.106", assuming this lands for 107, which it should.

Comment threadlightning/src/ln/channelmanager.rs Outdated
(incoming_cltv_expiry, OnionPayload::Invoice(payment_data), phantom_shared_secret),
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret) = match routing {
PendingHTLCRouting::Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } => {
let _legacy_hop_data = msgs::FinalOnionHopData {

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.

nit: replace the explicit instantiation with just let _legacy_hop_data = payment_data.clone(), given that's what we're doing anyway.

...instead of accessing it via the `OnionPayload::Invoice` form.
This may be useful if we add MPP keysend support, but is directly
useful to allow us to drop `FinalOnionHopData` from `OnionPayload`.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 16a6ad2 to 1973f1fCompareMay 2, 2022 16:37
@andozw

Copy link
Copy Markdown
Author

rebased

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 1973f1f to c611affCompareMay 2, 2022 16:49
@andozw

Copy link
Copy Markdown
Author

Addressed the 2 minor fixups as an amend on the last commit since they belong there and were trivial. Should be ready for another 👀

valentinewallace
valentinewallace previously approved these changes May 2, 2022
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines 162 to 164
/// Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a
/// payment_secret which prevents path-probing attacks and can associate different HTLCs which
/// are part of the same payment.

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.

Sorry should've seen this sooner, not a blocker but I think this can be removed and just say "Indicates this incoming onion payload is for the purpose of paying an invoice" or something like that

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

So replace Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a payment_secret which prevents path-probing attacks and can associate different HTLCs which are part of the same payment.
with:
Indicates this incoming onion payload is for the purpose of paying an invoice ?

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.

Yep, that sounds great.

We only use it to check the amount when processing MPP parts, but
store the full object (including new payment metadata) in it.
Because we now store the amount in the parent structure, there is
no need for it at all in the `OnionPayload`. Sadly, for
serialization compatibility, we need it to continue to exist, at
least temporarily, but we can avoid populating the new fields in
that case.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from c611aff to fc77c57CompareMay 2, 2022 18:41
@TheBlueMatt
TheBlueMatt merged commit e3a305c into lightningdevkit:mainMay 2, 2022
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.

6 participants

@andozw@codecov-commenter@TheBlueMatt@arik-so@valentinewallace@vincenzopalazzo
, '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

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice - #1447

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData
May 2, 2022
Merged

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice#1447
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData

Conversation

@andozw

Copy link
Copy Markdown

Splits these commits from #1221 and #1445 because they should be separate.

See #1445 (review)

@codecov-commenter

codecov-commenter commented Apr 23, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1447 (fc77c57) into main (9bdce47) will decrease coverage by 0.00%.
The diff coverage is 80.55%.

@@ Coverage Diff @@## main #1447 +/- ##
==========================================
- Coverage 90.90% 90.89% -0.01% 
==========================================
Files 75 75 Lines 41616 41624 +8 Branches 41616 41624 +8 ==========================================
+ Hits 37829 37834 +5 - Misses 3787 3790 +3 
Impacted FilesCoverage Δ
lightning/src/ln/channelmanager.rs84.70% <80.00%> (-0.05%)⬇️
lightning/src/ln/inbound_payment.rs93.49% <100.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9bdce47...fc77c57. Read the comment docs.

vincenzopalazzo
vincenzopalazzo previously approved these changes Apr 25, 2022

@vincenzopalazzovincenzopalazzo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {
log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
log_bytes!(payment_hash.0), total_value, $payment_data_total_msat);
fail_htlc!(claimable_htlc);

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.

Gah, this is wrong and our test coverage is really lacking here. I'm working on some improved testing here but in the mean time the fail_htlc call has to stay and the htlcs.push calls need to go back in the branches instead of being unconditional.

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.

Do you intend to resolve it in this PR before merging it?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

Comment on lines 173 to +181
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
total_msat: u64,

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.

Could be nice to document the difference between value and total_msat

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.

Agreed; in fact, would be necessary imo

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Is this close to accurate?

/// HTLCs that are to us and can be failed/claimed by the user
struct ClaimableHTLC {
prev_hop: HTLCPreviousHopData,
cltv_expiry: u32,
/// The amount (in msats) of this MPP part
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
/// The sum total of all MPP parts
total_msat: u64,
}

It was not super clear to me, but I am going to walk through the code more and try to figure it out.

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.

That looks good to me!

@andozw

Copy link
Copy Markdown
Author

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

I'll give it a go

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from b4ba546 to d0cf6b8CompareApril 29, 2022 16:33
Comment threadlightning/src/ln/channelmanager.rs Outdated
}
}
if total_value >= msgs::MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@TheBlueMatt - should this be || total_value > $payment_data.total_msat ? The tests pass either way. I haven't rebased against #1451 yet but it looks like that one might be ready to merge?

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, its definitely more readable that way. That said I believe they're the same, though its a good bit of careful reading to see that, and I'm not even 100% confident of that after reading it five times.

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from d0cf6b8 to 4da7916CompareApril 29, 2022 17:18
@andozw

Copy link
Copy Markdown
Author

rebased

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

One comment but otherwise ACK with Matt's suggestion. Appreciate that these commits were separated out!

Comment threadlightning/src/ln/channelmanager.rs Outdated
return false;
}
if let OnionPayload::Invoice(ref final_hop_data) = htlcs[0].onion_payload {
if let OnionPayload::Invoice { _legacy_hop_data: ref final_hop_data } = htlcs[0].onion_payload {

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.

Not a blocker, but it looks like we can get rid of this usage as well by accessing htlcs[0].total_msat instead of final_hop_data? @TheBlueMatt

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

done!

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 4da7916 to 16a6ad2CompareApril 30, 2022 16:32

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

Okay, sorry for the delay on this one, LGTM modulo two trivial comments.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Invoice(msgs::FinalOnionHopData),
Invoice {
/// This is only here for backwards-compatibility in serialization, in the future it can be
/// removed, breaking clients running 0.0.104 and earlier.

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.

heh, well that's stale - should read "0.0.106", assuming this lands for 107, which it should.

Comment threadlightning/src/ln/channelmanager.rs Outdated
(incoming_cltv_expiry, OnionPayload::Invoice(payment_data), phantom_shared_secret),
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret) = match routing {
PendingHTLCRouting::Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } => {
let _legacy_hop_data = msgs::FinalOnionHopData {

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.

nit: replace the explicit instantiation with just let _legacy_hop_data = payment_data.clone(), given that's what we're doing anyway.

...instead of accessing it via the `OnionPayload::Invoice` form.
This may be useful if we add MPP keysend support, but is directly
useful to allow us to drop `FinalOnionHopData` from `OnionPayload`.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 16a6ad2 to 1973f1fCompareMay 2, 2022 16:37
@andozw

Copy link
Copy Markdown
Author

rebased

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 1973f1f to c611affCompareMay 2, 2022 16:49
@andozw

Copy link
Copy Markdown
Author

Addressed the 2 minor fixups as an amend on the last commit since they belong there and were trivial. Should be ready for another 👀

valentinewallace
valentinewallace previously approved these changes May 2, 2022
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines 162 to 164
/// Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a
/// payment_secret which prevents path-probing attacks and can associate different HTLCs which
/// are part of the same payment.

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.

Sorry should've seen this sooner, not a blocker but I think this can be removed and just say "Indicates this incoming onion payload is for the purpose of paying an invoice" or something like that

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

So replace Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a payment_secret which prevents path-probing attacks and can associate different HTLCs which are part of the same payment.
with:
Indicates this incoming onion payload is for the purpose of paying an invoice ?

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.

Yep, that sounds great.

We only use it to check the amount when processing MPP parts, but
store the full object (including new payment metadata) in it.
Because we now store the amount in the parent structure, there is
no need for it at all in the `OnionPayload`. Sadly, for
serialization compatibility, we need it to continue to exist, at
least temporarily, but we can avoid populating the new fields in
that case.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from c611aff to fc77c57CompareMay 2, 2022 18:41
@TheBlueMatt
TheBlueMatt merged commit e3a305c into lightningdevkit:mainMay 2, 2022
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.

6 participants

@andozw@codecov-commenter@TheBlueMatt@arik-so@valentinewallace@vincenzopalazzo
, '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

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice - #1447

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData
May 2, 2022
Merged

Avoid storing a full FinalOnionHopData in OnionPayload::Invoice#1447
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
andozw:seana.20220422.avoid-storing-FinalOnionHopData

Conversation

@andozw

Copy link
Copy Markdown

Splits these commits from #1221 and #1445 because they should be separate.

See #1445 (review)

@codecov-commenter

codecov-commenter commented Apr 23, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1447 (fc77c57) into main (9bdce47) will decrease coverage by 0.00%.
The diff coverage is 80.55%.

@@ Coverage Diff @@## main #1447 +/- ##
==========================================
- Coverage 90.90% 90.89% -0.01% 
==========================================
Files 75 75 Lines 41616 41624 +8 Branches 41616 41624 +8 ==========================================
+ Hits 37829 37834 +5 - Misses 3787 3790 +3 
Impacted FilesCoverage Δ
lightning/src/ln/channelmanager.rs84.70% <80.00%> (-0.05%)⬇️
lightning/src/ln/inbound_payment.rs93.49% <100.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9bdce47...fc77c57. Read the comment docs.

vincenzopalazzo
vincenzopalazzo previously approved these changes Apr 25, 2022

@vincenzopalazzovincenzopalazzo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {
log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
log_bytes!(payment_hash.0), total_value, $payment_data_total_msat);
fail_htlc!(claimable_htlc);

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.

Gah, this is wrong and our test coverage is really lacking here. I'm working on some improved testing here but in the mean time the fail_htlc call has to stay and the htlcs.push calls need to go back in the branches instead of being unconditional.

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.

Do you intend to resolve it in this PR before merging it?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

Comment on lines 173 to +181
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
total_msat: u64,

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.

Could be nice to document the difference between value and total_msat

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.

Agreed; in fact, would be necessary imo

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Is this close to accurate?

/// HTLCs that are to us and can be failed/claimed by the user
struct ClaimableHTLC {
prev_hop: HTLCPreviousHopData,
cltv_expiry: u32,
/// The amount (in msats) of this MPP part
value: u64,
onion_payload: OnionPayload,
timer_ticks: u8,
/// The sum total of all MPP parts
total_msat: u64,
}

It was not super clear to me, but I am going to walk through the code more and try to figure it out.

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.

That looks good to me!

@andozw

Copy link
Copy Markdown
Author

Looks pretty good! Do we wanna rebase it on #1451 to get the test coverage there?

I'll give it a go

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from b4ba546 to d0cf6b8CompareApril 29, 2022 16:33
Comment threadlightning/src/ln/channelmanager.rs Outdated
}
}
if total_value >= msgs::MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
if total_value >= msgs::MAX_VALUE_MSAT || total_value > claimable_htlc.total_msat {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@TheBlueMatt - should this be || total_value > $payment_data.total_msat ? The tests pass either way. I haven't rebased against #1451 yet but it looks like that one might be ready to merge?

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, its definitely more readable that way. That said I believe they're the same, though its a good bit of careful reading to see that, and I'm not even 100% confident of that after reading it five times.

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from d0cf6b8 to 4da7916CompareApril 29, 2022 17:18
@andozw

Copy link
Copy Markdown
Author

rebased

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

One comment but otherwise ACK with Matt's suggestion. Appreciate that these commits were separated out!

Comment threadlightning/src/ln/channelmanager.rs Outdated
return false;
}
if let OnionPayload::Invoice(ref final_hop_data) = htlcs[0].onion_payload {
if let OnionPayload::Invoice { _legacy_hop_data: ref final_hop_data } = htlcs[0].onion_payload {

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.

Not a blocker, but it looks like we can get rid of this usage as well by accessing htlcs[0].total_msat instead of final_hop_data? @TheBlueMatt

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

done!

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 4da7916 to 16a6ad2CompareApril 30, 2022 16:32

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

Okay, sorry for the delay on this one, LGTM modulo two trivial comments.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Invoice(msgs::FinalOnionHopData),
Invoice {
/// This is only here for backwards-compatibility in serialization, in the future it can be
/// removed, breaking clients running 0.0.104 and earlier.

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.

heh, well that's stale - should read "0.0.106", assuming this lands for 107, which it should.

Comment threadlightning/src/ln/channelmanager.rs Outdated
(incoming_cltv_expiry, OnionPayload::Invoice(payment_data), phantom_shared_secret),
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret) = match routing {
PendingHTLCRouting::Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } => {
let _legacy_hop_data = msgs::FinalOnionHopData {

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.

nit: replace the explicit instantiation with just let _legacy_hop_data = payment_data.clone(), given that's what we're doing anyway.

...instead of accessing it via the `OnionPayload::Invoice` form.
This may be useful if we add MPP keysend support, but is directly
useful to allow us to drop `FinalOnionHopData` from `OnionPayload`.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 16a6ad2 to 1973f1fCompareMay 2, 2022 16:37
@andozw

Copy link
Copy Markdown
Author

rebased

@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from 1973f1f to c611affCompareMay 2, 2022 16:49
@andozw

Copy link
Copy Markdown
Author

Addressed the 2 minor fixups as an amend on the last commit since they belong there and were trivial. Should be ready for another 👀

valentinewallace
valentinewallace previously approved these changes May 2, 2022
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines 162 to 164
/// Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a
/// payment_secret which prevents path-probing attacks and can associate different HTLCs which
/// are part of the same payment.

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.

Sorry should've seen this sooner, not a blocker but I think this can be removed and just say "Indicates this incoming onion payload is for the purpose of paying an invoice" or something like that

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

So replace Contains a total_msat (which may differ from value if this is a Multi-Path Payment) and a payment_secret which prevents path-probing attacks and can associate different HTLCs which are part of the same payment.
with:
Indicates this incoming onion payload is for the purpose of paying an invoice ?

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.

Yep, that sounds great.

We only use it to check the amount when processing MPP parts, but
store the full object (including new payment metadata) in it.
Because we now store the amount in the parent structure, there is
no need for it at all in the `OnionPayload`. Sadly, for
serialization compatibility, we need it to continue to exist, at
least temporarily, but we can avoid populating the new fields in
that case.
@andozw
andozwforce-pushed the seana.20220422.avoid-storing-FinalOnionHopData branch from c611aff to fc77c57CompareMay 2, 2022 18:41
@TheBlueMatt
TheBlueMatt merged commit e3a305c into lightningdevkit:mainMay 2, 2022
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.

6 participants

@andozw@codecov-commenter@TheBlueMatt@arik-so@valentinewallace@vincenzopalazzo