Skip to content

peel_payment_onion static fn in channelmanager - #2700

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing
Nov 16, 2023
Merged

peel_payment_onion static fn in channelmanager#2700
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Contributor

Adds a public peel_payment_onion function that takes msgs::UpdateAddHTLC and returns PendingHTLCInfo.

I separated the internals of decode_update_add_htlc_onion, construct_recv_pending_htlc_info, and construct_fwd_pending_htlc_info into static functions, and used them to make the PendingHTLCInfo. There are two validation closures passed to peel_payment_onion... some of the outbound channel checking is done in these closures, so its up to the caller to validate against current channel state.

I am unsure about phantom_shared_secret and allow_underpay in create_recv_pending_htlc_info so i left them None/false when called from peel_payment_onion

Not sure if this is the best approach! But its much better than #2677

Comment threadlightning/src/ln/channelmanager.rs Outdated
}
};

let validate_peer_chan = |

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.

Rather than making these lambdas and passing them into decode_incoming_update_add_htlc_onion, can we just check them after running decode_incoming_update_add_htlc_onion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, its much cleaner now. I repeated the CLTV checks in the peel_payment_onion fn though, but I guess that's fine.

Also added a test for peel_payment_onion

@codecov-commenter

codecov-commenter commented Nov 1, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 44 lines in your changes are missing coverage. Please review.

Comparison is base (1f399b0) 88.71% compared to head (192fe05) 88.72%.
Report is 63 commits behind head on main.

FilesPatch %Lines
lightning/src/ln/channelmanager.rs89.21%37 Missing and 7 partials ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2700 +/- ##
=========================================
Coverage 88.71% 88.72% =========================================
Files 112 113 +1 Lines 88502 89533 +1031 Branches 88502 89533 +1031 =========================================
+ Hits 78517 79434 +917 - Misses 7752 7839 +87 - Partials 2233 2260 +27 

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

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

Nice! This turned out pretty good. I think we'll basically be able to use this for LSP 4 too.

Comment threadlightning/src/ln/channelmanager.rs Outdated
if msg.cltv_expiry > cur_height + CLTV_FAR_FAR_AWAY as u32 { // expiry_too_far
return Err("CLTV expiry is too far in the future");
}
if (outgoing_cltv_value) as u64 <= (cur_height + LATENCY_GRACE_PERIOD_BLOCKS) as u64 {

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.

Why keep the redundant one in decode_update_add_htlc_onion, can we just drop the redundant checks and leave it only doing the next-hop-channels-is-real checks.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Trying to figure out how to do this... the ChannelManager::decode_update_add_htlc_onion CLTV checks may generate a chan_update, while the checks in peel_payment_onion are simpler (since peel_payment_onion is called externally, without the context).

Are you saying we should move the checks inside the inner decode_incoming_update_add_htlc_onion fn?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok! got it figured out so there is no redundancy

Comment threadlightning/src/ln/channelmanager.rs Outdated
}

/// Peel one layer off an incoming onion, returning PendingHTLCInfo (either Forward or Receive).
/// Validates the outgoing CLTV value against the cur_height.

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.

Docs should describe some amount of "this does all the relevant context-free checks that LDK requires for payment relay or acceptance. If the payment is to be received, and the amount matches the expected amount for a given invoice, this indicates the UpdateAddHTLC, once fully committed in the channel, will generate an Event::PaymentReceived".

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Oops, needs a small rebase after the other PR.

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

Still making my way through

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 1a37835 to 98bc9a9CompareNovember 9, 2023 00:56

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

Almost there!

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs

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

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.
pub incoming_shared_secret: [u8; 32],
payment_hash: PaymentHash,

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.

Why leave this as the only unexposed field?

@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

OK, happy to do a follow-up on these items as soon as it gets merged

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 3a9fe46 to 3ddb6aaCompareNovember 14, 2023 19:50
@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

Oh, thanks for the tip. I reverted the merge commit. Also reverted the PeelOnionError stuff for a follow-up PR instead, per @valentinewallace's suggestion

valentinewallace
valentinewallace previously approved these changes Nov 14, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Having done more research into CLN and LND's htlc interception APIs, I don't think we need to follow-up adding PeelOnionError.

Both APIs take either an error code or a decoded onion error packet, so our current error should be sufficient for that.

I was also thinking the LSPS4 spec may need better error info, but from talking to @TheBlueMatt it sounds like the LSP would always just error with "unknown next channel."

So excuse the misleading direction, I think this PR is fine as-is.

Comment threadlightning/src/ln/channelmanager.rs Outdated

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

LGTM, though the docs on newly-public fields and structs really need to communicate a lot more information. Generally, any public field or struct needs docs that explain (a) what it is (often in terms of how we calculated it) and (b) what its used for, often how a user would use it (if there's no reason for them to use it, it shouldn't be public).

incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.
incoming_cltv_expiry: u32,
/// Optional shared secret for phantom node.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This tells a user almost nothing about what this is or what its used for.

/// generated using `get_fake_scid` from the scid_utils::fake_scid module.
short_channel_id: u64, // This should be NonZero<u64> eventually when we bump MSRV
},
/// An HTLC paid to an invoice we generated.

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: might be worth noting that, at this point, we have not checked that the invoice being paid was actually generated by us, but rather its claiming to pay an invoice of ours.

/// See [`RecipientOnionFields::custom_tlvs`] for more info.
custom_tlvs: Vec<(u64, Vec<u8>)>,
},
/// Incoming keysend (sender provided the preimage in a TLV).

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.

Only kinda specific to this PR, but the public interface is now kinda confused between keysend and spontaneous payments. We originally tried to use "spontaneous payments" for this publicly, but some keysend references slipped in, and now we're adding more. We should make everything consistent in a followup rename.

/// See [`RecipientOnionFields::payment_metadata`] for more info.
payment_metadata: Option<Vec<u8>>,
incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.

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: would be nice to also repeat what it is, not just what its used for.

pub struct PendingHTLCInfo {
/// Further routing details based on whether the HTLC is being forwarded or received.
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This doesn't really say much about what this is used for/why its here.

}
}

fn create_fwd_pending_htlc_info(

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.

Now that these are all freestanding functions, they (and the associated return/error structs) should probably move to some other file, if only to make channelmanager.rs slightly less huge.

@TheBlueMatt
TheBlueMatt merged commit 870a0f1 into lightningdevkit:mainNov 16, 2023
tnull added a commit that referenced this pull request Dec 6, 2023
Improve docs on newly-public structs after #2700
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evanfeenstra@codecov-commenter@TheBlueMatt@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
peel_payment_onion static fn in channelmanager by Evanfeenstra · Pull Request #2700 · lightningdevkit/rust-lightning · GitHub
Skip to content

peel_payment_onion static fn in channelmanager - #2700

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing
Nov 16, 2023
Merged

peel_payment_onion static fn in channelmanager#2700
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Contributor

Adds a public peel_payment_onion function that takes msgs::UpdateAddHTLC and returns PendingHTLCInfo.

I separated the internals of decode_update_add_htlc_onion, construct_recv_pending_htlc_info, and construct_fwd_pending_htlc_info into static functions, and used them to make the PendingHTLCInfo. There are two validation closures passed to peel_payment_onion... some of the outbound channel checking is done in these closures, so its up to the caller to validate against current channel state.

I am unsure about phantom_shared_secret and allow_underpay in create_recv_pending_htlc_info so i left them None/false when called from peel_payment_onion

Not sure if this is the best approach! But its much better than #2677

Comment threadlightning/src/ln/channelmanager.rs Outdated
}
};

let validate_peer_chan = |

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.

Rather than making these lambdas and passing them into decode_incoming_update_add_htlc_onion, can we just check them after running decode_incoming_update_add_htlc_onion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, its much cleaner now. I repeated the CLTV checks in the peel_payment_onion fn though, but I guess that's fine.

Also added a test for peel_payment_onion

@codecov-commenter

codecov-commenter commented Nov 1, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 44 lines in your changes are missing coverage. Please review.

Comparison is base (1f399b0) 88.71% compared to head (192fe05) 88.72%.
Report is 63 commits behind head on main.

FilesPatch %Lines
lightning/src/ln/channelmanager.rs89.21%37 Missing and 7 partials ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2700 +/- ##
=========================================
Coverage 88.71% 88.72% =========================================
Files 112 113 +1 Lines 88502 89533 +1031 Branches 88502 89533 +1031 =========================================
+ Hits 78517 79434 +917 - Misses 7752 7839 +87 - Partials 2233 2260 +27 

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

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

Nice! This turned out pretty good. I think we'll basically be able to use this for LSP 4 too.

Comment threadlightning/src/ln/channelmanager.rs Outdated
if msg.cltv_expiry > cur_height + CLTV_FAR_FAR_AWAY as u32 { // expiry_too_far
return Err("CLTV expiry is too far in the future");
}
if (outgoing_cltv_value) as u64 <= (cur_height + LATENCY_GRACE_PERIOD_BLOCKS) as u64 {

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.

Why keep the redundant one in decode_update_add_htlc_onion, can we just drop the redundant checks and leave it only doing the next-hop-channels-is-real checks.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Trying to figure out how to do this... the ChannelManager::decode_update_add_htlc_onion CLTV checks may generate a chan_update, while the checks in peel_payment_onion are simpler (since peel_payment_onion is called externally, without the context).

Are you saying we should move the checks inside the inner decode_incoming_update_add_htlc_onion fn?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok! got it figured out so there is no redundancy

Comment threadlightning/src/ln/channelmanager.rs Outdated
}

/// Peel one layer off an incoming onion, returning PendingHTLCInfo (either Forward or Receive).
/// Validates the outgoing CLTV value against the cur_height.

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.

Docs should describe some amount of "this does all the relevant context-free checks that LDK requires for payment relay or acceptance. If the payment is to be received, and the amount matches the expected amount for a given invoice, this indicates the UpdateAddHTLC, once fully committed in the channel, will generate an Event::PaymentReceived".

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Oops, needs a small rebase after the other PR.

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

Still making my way through

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 1a37835 to 98bc9a9CompareNovember 9, 2023 00:56

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

Almost there!

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs

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

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.
pub incoming_shared_secret: [u8; 32],
payment_hash: PaymentHash,

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.

Why leave this as the only unexposed field?

@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

OK, happy to do a follow-up on these items as soon as it gets merged

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 3a9fe46 to 3ddb6aaCompareNovember 14, 2023 19:50
@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

Oh, thanks for the tip. I reverted the merge commit. Also reverted the PeelOnionError stuff for a follow-up PR instead, per @valentinewallace's suggestion

valentinewallace
valentinewallace previously approved these changes Nov 14, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Having done more research into CLN and LND's htlc interception APIs, I don't think we need to follow-up adding PeelOnionError.

Both APIs take either an error code or a decoded onion error packet, so our current error should be sufficient for that.

I was also thinking the LSPS4 spec may need better error info, but from talking to @TheBlueMatt it sounds like the LSP would always just error with "unknown next channel."

So excuse the misleading direction, I think this PR is fine as-is.

Comment threadlightning/src/ln/channelmanager.rs Outdated

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

LGTM, though the docs on newly-public fields and structs really need to communicate a lot more information. Generally, any public field or struct needs docs that explain (a) what it is (often in terms of how we calculated it) and (b) what its used for, often how a user would use it (if there's no reason for them to use it, it shouldn't be public).

incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.
incoming_cltv_expiry: u32,
/// Optional shared secret for phantom node.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This tells a user almost nothing about what this is or what its used for.

/// generated using `get_fake_scid` from the scid_utils::fake_scid module.
short_channel_id: u64, // This should be NonZero<u64> eventually when we bump MSRV
},
/// An HTLC paid to an invoice we generated.

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: might be worth noting that, at this point, we have not checked that the invoice being paid was actually generated by us, but rather its claiming to pay an invoice of ours.

/// See [`RecipientOnionFields::custom_tlvs`] for more info.
custom_tlvs: Vec<(u64, Vec<u8>)>,
},
/// Incoming keysend (sender provided the preimage in a TLV).

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.

Only kinda specific to this PR, but the public interface is now kinda confused between keysend and spontaneous payments. We originally tried to use "spontaneous payments" for this publicly, but some keysend references slipped in, and now we're adding more. We should make everything consistent in a followup rename.

/// See [`RecipientOnionFields::payment_metadata`] for more info.
payment_metadata: Option<Vec<u8>>,
incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.

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: would be nice to also repeat what it is, not just what its used for.

pub struct PendingHTLCInfo {
/// Further routing details based on whether the HTLC is being forwarded or received.
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This doesn't really say much about what this is used for/why its here.

}
}

fn create_fwd_pending_htlc_info(

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.

Now that these are all freestanding functions, they (and the associated return/error structs) should probably move to some other file, if only to make channelmanager.rs slightly less huge.

@TheBlueMatt
TheBlueMatt merged commit 870a0f1 into lightningdevkit:mainNov 16, 2023
tnull added a commit that referenced this pull request Dec 6, 2023
Improve docs on newly-public structs after #2700
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evanfeenstra@codecov-commenter@TheBlueMatt@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' peel_payment_onion static fn in channelmanager by Evanfeenstra · Pull Request #2700 · lightningdevkit/rust-lightning · GitHub
Skip to content

peel_payment_onion static fn in channelmanager - #2700

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing
Nov 16, 2023
Merged

peel_payment_onion static fn in channelmanager#2700
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Contributor

Adds a public peel_payment_onion function that takes msgs::UpdateAddHTLC and returns PendingHTLCInfo.

I separated the internals of decode_update_add_htlc_onion, construct_recv_pending_htlc_info, and construct_fwd_pending_htlc_info into static functions, and used them to make the PendingHTLCInfo. There are two validation closures passed to peel_payment_onion... some of the outbound channel checking is done in these closures, so its up to the caller to validate against current channel state.

I am unsure about phantom_shared_secret and allow_underpay in create_recv_pending_htlc_info so i left them None/false when called from peel_payment_onion

Not sure if this is the best approach! But its much better than #2677

Comment threadlightning/src/ln/channelmanager.rs Outdated
}
};

let validate_peer_chan = |

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.

Rather than making these lambdas and passing them into decode_incoming_update_add_htlc_onion, can we just check them after running decode_incoming_update_add_htlc_onion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, its much cleaner now. I repeated the CLTV checks in the peel_payment_onion fn though, but I guess that's fine.

Also added a test for peel_payment_onion

@codecov-commenter

codecov-commenter commented Nov 1, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 44 lines in your changes are missing coverage. Please review.

Comparison is base (1f399b0) 88.71% compared to head (192fe05) 88.72%.
Report is 63 commits behind head on main.

FilesPatch %Lines
lightning/src/ln/channelmanager.rs89.21%37 Missing and 7 partials ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2700 +/- ##
=========================================
Coverage 88.71% 88.72% =========================================
Files 112 113 +1 Lines 88502 89533 +1031 Branches 88502 89533 +1031 =========================================
+ Hits 78517 79434 +917 - Misses 7752 7839 +87 - Partials 2233 2260 +27 

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

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

Nice! This turned out pretty good. I think we'll basically be able to use this for LSP 4 too.

Comment threadlightning/src/ln/channelmanager.rs Outdated
if msg.cltv_expiry > cur_height + CLTV_FAR_FAR_AWAY as u32 { // expiry_too_far
return Err("CLTV expiry is too far in the future");
}
if (outgoing_cltv_value) as u64 <= (cur_height + LATENCY_GRACE_PERIOD_BLOCKS) as u64 {

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.

Why keep the redundant one in decode_update_add_htlc_onion, can we just drop the redundant checks and leave it only doing the next-hop-channels-is-real checks.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Trying to figure out how to do this... the ChannelManager::decode_update_add_htlc_onion CLTV checks may generate a chan_update, while the checks in peel_payment_onion are simpler (since peel_payment_onion is called externally, without the context).

Are you saying we should move the checks inside the inner decode_incoming_update_add_htlc_onion fn?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok! got it figured out so there is no redundancy

Comment threadlightning/src/ln/channelmanager.rs Outdated
}

/// Peel one layer off an incoming onion, returning PendingHTLCInfo (either Forward or Receive).
/// Validates the outgoing CLTV value against the cur_height.

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.

Docs should describe some amount of "this does all the relevant context-free checks that LDK requires for payment relay or acceptance. If the payment is to be received, and the amount matches the expected amount for a given invoice, this indicates the UpdateAddHTLC, once fully committed in the channel, will generate an Event::PaymentReceived".

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Oops, needs a small rebase after the other PR.

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

Still making my way through

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 1a37835 to 98bc9a9CompareNovember 9, 2023 00:56

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

Almost there!

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs

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

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.
pub incoming_shared_secret: [u8; 32],
payment_hash: PaymentHash,

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.

Why leave this as the only unexposed field?

@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

OK, happy to do a follow-up on these items as soon as it gets merged

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 3a9fe46 to 3ddb6aaCompareNovember 14, 2023 19:50
@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

Oh, thanks for the tip. I reverted the merge commit. Also reverted the PeelOnionError stuff for a follow-up PR instead, per @valentinewallace's suggestion

valentinewallace
valentinewallace previously approved these changes Nov 14, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Having done more research into CLN and LND's htlc interception APIs, I don't think we need to follow-up adding PeelOnionError.

Both APIs take either an error code or a decoded onion error packet, so our current error should be sufficient for that.

I was also thinking the LSPS4 spec may need better error info, but from talking to @TheBlueMatt it sounds like the LSP would always just error with "unknown next channel."

So excuse the misleading direction, I think this PR is fine as-is.

Comment threadlightning/src/ln/channelmanager.rs Outdated

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

LGTM, though the docs on newly-public fields and structs really need to communicate a lot more information. Generally, any public field or struct needs docs that explain (a) what it is (often in terms of how we calculated it) and (b) what its used for, often how a user would use it (if there's no reason for them to use it, it shouldn't be public).

incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.
incoming_cltv_expiry: u32,
/// Optional shared secret for phantom node.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This tells a user almost nothing about what this is or what its used for.

/// generated using `get_fake_scid` from the scid_utils::fake_scid module.
short_channel_id: u64, // This should be NonZero<u64> eventually when we bump MSRV
},
/// An HTLC paid to an invoice we generated.

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: might be worth noting that, at this point, we have not checked that the invoice being paid was actually generated by us, but rather its claiming to pay an invoice of ours.

/// See [`RecipientOnionFields::custom_tlvs`] for more info.
custom_tlvs: Vec<(u64, Vec<u8>)>,
},
/// Incoming keysend (sender provided the preimage in a TLV).

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.

Only kinda specific to this PR, but the public interface is now kinda confused between keysend and spontaneous payments. We originally tried to use "spontaneous payments" for this publicly, but some keysend references slipped in, and now we're adding more. We should make everything consistent in a followup rename.

/// See [`RecipientOnionFields::payment_metadata`] for more info.
payment_metadata: Option<Vec<u8>>,
incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.

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: would be nice to also repeat what it is, not just what its used for.

pub struct PendingHTLCInfo {
/// Further routing details based on whether the HTLC is being forwarded or received.
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This doesn't really say much about what this is used for/why its here.

}
}

fn create_fwd_pending_htlc_info(

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.

Now that these are all freestanding functions, they (and the associated return/error structs) should probably move to some other file, if only to make channelmanager.rs slightly less huge.

@TheBlueMatt
TheBlueMatt merged commit 870a0f1 into lightningdevkit:mainNov 16, 2023
tnull added a commit that referenced this pull request Dec 6, 2023
Improve docs on newly-public structs after #2700
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

peel_payment_onion static fn in channelmanager - #2700

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing
Nov 16, 2023
Merged

peel_payment_onion static fn in channelmanager#2700
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Contributor

Adds a public peel_payment_onion function that takes msgs::UpdateAddHTLC and returns PendingHTLCInfo.

I separated the internals of decode_update_add_htlc_onion, construct_recv_pending_htlc_info, and construct_fwd_pending_htlc_info into static functions, and used them to make the PendingHTLCInfo. There are two validation closures passed to peel_payment_onion... some of the outbound channel checking is done in these closures, so its up to the caller to validate against current channel state.

I am unsure about phantom_shared_secret and allow_underpay in create_recv_pending_htlc_info so i left them None/false when called from peel_payment_onion

Not sure if this is the best approach! But its much better than #2677

Comment threadlightning/src/ln/channelmanager.rs Outdated
}
};

let validate_peer_chan = |

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.

Rather than making these lambdas and passing them into decode_incoming_update_add_htlc_onion, can we just check them after running decode_incoming_update_add_htlc_onion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, its much cleaner now. I repeated the CLTV checks in the peel_payment_onion fn though, but I guess that's fine.

Also added a test for peel_payment_onion

@codecov-commenter

codecov-commenter commented Nov 1, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 44 lines in your changes are missing coverage. Please review.

Comparison is base (1f399b0) 88.71% compared to head (192fe05) 88.72%.
Report is 63 commits behind head on main.

FilesPatch %Lines
lightning/src/ln/channelmanager.rs89.21%37 Missing and 7 partials ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2700 +/- ##
=========================================
Coverage 88.71% 88.72% =========================================
Files 112 113 +1 Lines 88502 89533 +1031 Branches 88502 89533 +1031 =========================================
+ Hits 78517 79434 +917 - Misses 7752 7839 +87 - Partials 2233 2260 +27 

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

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

Nice! This turned out pretty good. I think we'll basically be able to use this for LSP 4 too.

Comment threadlightning/src/ln/channelmanager.rs Outdated
if msg.cltv_expiry > cur_height + CLTV_FAR_FAR_AWAY as u32 { // expiry_too_far
return Err("CLTV expiry is too far in the future");
}
if (outgoing_cltv_value) as u64 <= (cur_height + LATENCY_GRACE_PERIOD_BLOCKS) as u64 {

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.

Why keep the redundant one in decode_update_add_htlc_onion, can we just drop the redundant checks and leave it only doing the next-hop-channels-is-real checks.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Trying to figure out how to do this... the ChannelManager::decode_update_add_htlc_onion CLTV checks may generate a chan_update, while the checks in peel_payment_onion are simpler (since peel_payment_onion is called externally, without the context).

Are you saying we should move the checks inside the inner decode_incoming_update_add_htlc_onion fn?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok! got it figured out so there is no redundancy

Comment threadlightning/src/ln/channelmanager.rs Outdated
}

/// Peel one layer off an incoming onion, returning PendingHTLCInfo (either Forward or Receive).
/// Validates the outgoing CLTV value against the cur_height.

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.

Docs should describe some amount of "this does all the relevant context-free checks that LDK requires for payment relay or acceptance. If the payment is to be received, and the amount matches the expected amount for a given invoice, this indicates the UpdateAddHTLC, once fully committed in the channel, will generate an Event::PaymentReceived".

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Oops, needs a small rebase after the other PR.

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

Still making my way through

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 1a37835 to 98bc9a9CompareNovember 9, 2023 00:56

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

Almost there!

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs

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

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.
pub incoming_shared_secret: [u8; 32],
payment_hash: PaymentHash,

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.

Why leave this as the only unexposed field?

@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

OK, happy to do a follow-up on these items as soon as it gets merged

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 3a9fe46 to 3ddb6aaCompareNovember 14, 2023 19:50
@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

Oh, thanks for the tip. I reverted the merge commit. Also reverted the PeelOnionError stuff for a follow-up PR instead, per @valentinewallace's suggestion

valentinewallace
valentinewallace previously approved these changes Nov 14, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Having done more research into CLN and LND's htlc interception APIs, I don't think we need to follow-up adding PeelOnionError.

Both APIs take either an error code or a decoded onion error packet, so our current error should be sufficient for that.

I was also thinking the LSPS4 spec may need better error info, but from talking to @TheBlueMatt it sounds like the LSP would always just error with "unknown next channel."

So excuse the misleading direction, I think this PR is fine as-is.

Comment threadlightning/src/ln/channelmanager.rs Outdated

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

LGTM, though the docs on newly-public fields and structs really need to communicate a lot more information. Generally, any public field or struct needs docs that explain (a) what it is (often in terms of how we calculated it) and (b) what its used for, often how a user would use it (if there's no reason for them to use it, it shouldn't be public).

incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.
incoming_cltv_expiry: u32,
/// Optional shared secret for phantom node.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This tells a user almost nothing about what this is or what its used for.

/// generated using `get_fake_scid` from the scid_utils::fake_scid module.
short_channel_id: u64, // This should be NonZero<u64> eventually when we bump MSRV
},
/// An HTLC paid to an invoice we generated.

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: might be worth noting that, at this point, we have not checked that the invoice being paid was actually generated by us, but rather its claiming to pay an invoice of ours.

/// See [`RecipientOnionFields::custom_tlvs`] for more info.
custom_tlvs: Vec<(u64, Vec<u8>)>,
},
/// Incoming keysend (sender provided the preimage in a TLV).

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.

Only kinda specific to this PR, but the public interface is now kinda confused between keysend and spontaneous payments. We originally tried to use "spontaneous payments" for this publicly, but some keysend references slipped in, and now we're adding more. We should make everything consistent in a followup rename.

/// See [`RecipientOnionFields::payment_metadata`] for more info.
payment_metadata: Option<Vec<u8>>,
incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.

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: would be nice to also repeat what it is, not just what its used for.

pub struct PendingHTLCInfo {
/// Further routing details based on whether the HTLC is being forwarded or received.
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This doesn't really say much about what this is used for/why its here.

}
}

fn create_fwd_pending_htlc_info(

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.

Now that these are all freestanding functions, they (and the associated return/error structs) should probably move to some other file, if only to make channelmanager.rs slightly less huge.

@TheBlueMatt
TheBlueMatt merged commit 870a0f1 into lightningdevkit:mainNov 16, 2023
tnull added a commit that referenced this pull request Dec 6, 2023
Improve docs on newly-public structs after #2700
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evanfeenstra@codecov-commenter@TheBlueMatt@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' peel_payment_onion static fn in channelmanager by Evanfeenstra · Pull Request #2700 · lightningdevkit/rust-lightning · GitHub
Skip to content

peel_payment_onion static fn in channelmanager - #2700

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing
Nov 16, 2023
Merged

peel_payment_onion static fn in channelmanager#2700
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Contributor

Adds a public peel_payment_onion function that takes msgs::UpdateAddHTLC and returns PendingHTLCInfo.

I separated the internals of decode_update_add_htlc_onion, construct_recv_pending_htlc_info, and construct_fwd_pending_htlc_info into static functions, and used them to make the PendingHTLCInfo. There are two validation closures passed to peel_payment_onion... some of the outbound channel checking is done in these closures, so its up to the caller to validate against current channel state.

I am unsure about phantom_shared_secret and allow_underpay in create_recv_pending_htlc_info so i left them None/false when called from peel_payment_onion

Not sure if this is the best approach! But its much better than #2677

Comment threadlightning/src/ln/channelmanager.rs Outdated
}
};

let validate_peer_chan = |

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.

Rather than making these lambdas and passing them into decode_incoming_update_add_htlc_onion, can we just check them after running decode_incoming_update_add_htlc_onion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, its much cleaner now. I repeated the CLTV checks in the peel_payment_onion fn though, but I guess that's fine.

Also added a test for peel_payment_onion

@codecov-commenter

codecov-commenter commented Nov 1, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 44 lines in your changes are missing coverage. Please review.

Comparison is base (1f399b0) 88.71% compared to head (192fe05) 88.72%.
Report is 63 commits behind head on main.

FilesPatch %Lines
lightning/src/ln/channelmanager.rs89.21%37 Missing and 7 partials ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2700 +/- ##
=========================================
Coverage 88.71% 88.72% =========================================
Files 112 113 +1 Lines 88502 89533 +1031 Branches 88502 89533 +1031 =========================================
+ Hits 78517 79434 +917 - Misses 7752 7839 +87 - Partials 2233 2260 +27 

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

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

Nice! This turned out pretty good. I think we'll basically be able to use this for LSP 4 too.

Comment threadlightning/src/ln/channelmanager.rs Outdated
if msg.cltv_expiry > cur_height + CLTV_FAR_FAR_AWAY as u32 { // expiry_too_far
return Err("CLTV expiry is too far in the future");
}
if (outgoing_cltv_value) as u64 <= (cur_height + LATENCY_GRACE_PERIOD_BLOCKS) as u64 {

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.

Why keep the redundant one in decode_update_add_htlc_onion, can we just drop the redundant checks and leave it only doing the next-hop-channels-is-real checks.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Trying to figure out how to do this... the ChannelManager::decode_update_add_htlc_onion CLTV checks may generate a chan_update, while the checks in peel_payment_onion are simpler (since peel_payment_onion is called externally, without the context).

Are you saying we should move the checks inside the inner decode_incoming_update_add_htlc_onion fn?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok! got it figured out so there is no redundancy

Comment threadlightning/src/ln/channelmanager.rs Outdated
}

/// Peel one layer off an incoming onion, returning PendingHTLCInfo (either Forward or Receive).
/// Validates the outgoing CLTV value against the cur_height.

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.

Docs should describe some amount of "this does all the relevant context-free checks that LDK requires for payment relay or acceptance. If the payment is to be received, and the amount matches the expected amount for a given invoice, this indicates the UpdateAddHTLC, once fully committed in the channel, will generate an Event::PaymentReceived".

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Oops, needs a small rebase after the other PR.

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

Still making my way through

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 1a37835 to 98bc9a9CompareNovember 9, 2023 00:56

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

Almost there!

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs

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

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.
pub incoming_shared_secret: [u8; 32],
payment_hash: PaymentHash,

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.

Why leave this as the only unexposed field?

@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

OK, happy to do a follow-up on these items as soon as it gets merged

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 3a9fe46 to 3ddb6aaCompareNovember 14, 2023 19:50
@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

Oh, thanks for the tip. I reverted the merge commit. Also reverted the PeelOnionError stuff for a follow-up PR instead, per @valentinewallace's suggestion

valentinewallace
valentinewallace previously approved these changes Nov 14, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Having done more research into CLN and LND's htlc interception APIs, I don't think we need to follow-up adding PeelOnionError.

Both APIs take either an error code or a decoded onion error packet, so our current error should be sufficient for that.

I was also thinking the LSPS4 spec may need better error info, but from talking to @TheBlueMatt it sounds like the LSP would always just error with "unknown next channel."

So excuse the misleading direction, I think this PR is fine as-is.

Comment threadlightning/src/ln/channelmanager.rs Outdated

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

LGTM, though the docs on newly-public fields and structs really need to communicate a lot more information. Generally, any public field or struct needs docs that explain (a) what it is (often in terms of how we calculated it) and (b) what its used for, often how a user would use it (if there's no reason for them to use it, it shouldn't be public).

incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.
incoming_cltv_expiry: u32,
/// Optional shared secret for phantom node.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This tells a user almost nothing about what this is or what its used for.

/// generated using `get_fake_scid` from the scid_utils::fake_scid module.
short_channel_id: u64, // This should be NonZero<u64> eventually when we bump MSRV
},
/// An HTLC paid to an invoice we generated.

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: might be worth noting that, at this point, we have not checked that the invoice being paid was actually generated by us, but rather its claiming to pay an invoice of ours.

/// See [`RecipientOnionFields::custom_tlvs`] for more info.
custom_tlvs: Vec<(u64, Vec<u8>)>,
},
/// Incoming keysend (sender provided the preimage in a TLV).

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.

Only kinda specific to this PR, but the public interface is now kinda confused between keysend and spontaneous payments. We originally tried to use "spontaneous payments" for this publicly, but some keysend references slipped in, and now we're adding more. We should make everything consistent in a followup rename.

/// See [`RecipientOnionFields::payment_metadata`] for more info.
payment_metadata: Option<Vec<u8>>,
incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.

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: would be nice to also repeat what it is, not just what its used for.

pub struct PendingHTLCInfo {
/// Further routing details based on whether the HTLC is being forwarded or received.
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This doesn't really say much about what this is used for/why its here.

}
}

fn create_fwd_pending_htlc_info(

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.

Now that these are all freestanding functions, they (and the associated return/error structs) should probably move to some other file, if only to make channelmanager.rs slightly less huge.

@TheBlueMatt
TheBlueMatt merged commit 870a0f1 into lightningdevkit:mainNov 16, 2023
tnull added a commit that referenced this pull request Dec 6, 2023
Improve docs on newly-public structs after #2700
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evanfeenstra@codecov-commenter@TheBlueMatt@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' peel_payment_onion static fn in channelmanager by Evanfeenstra · Pull Request #2700 · lightningdevkit/rust-lightning · GitHub
Skip to content

peel_payment_onion static fn in channelmanager - #2700

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing
Nov 16, 2023
Merged

peel_payment_onion static fn in channelmanager#2700
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Contributor

Adds a public peel_payment_onion function that takes msgs::UpdateAddHTLC and returns PendingHTLCInfo.

I separated the internals of decode_update_add_htlc_onion, construct_recv_pending_htlc_info, and construct_fwd_pending_htlc_info into static functions, and used them to make the PendingHTLCInfo. There are two validation closures passed to peel_payment_onion... some of the outbound channel checking is done in these closures, so its up to the caller to validate against current channel state.

I am unsure about phantom_shared_secret and allow_underpay in create_recv_pending_htlc_info so i left them None/false when called from peel_payment_onion

Not sure if this is the best approach! But its much better than #2677

Comment threadlightning/src/ln/channelmanager.rs Outdated
}
};

let validate_peer_chan = |

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.

Rather than making these lambdas and passing them into decode_incoming_update_add_htlc_onion, can we just check them after running decode_incoming_update_add_htlc_onion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, its much cleaner now. I repeated the CLTV checks in the peel_payment_onion fn though, but I guess that's fine.

Also added a test for peel_payment_onion

@codecov-commenter

codecov-commenter commented Nov 1, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 44 lines in your changes are missing coverage. Please review.

Comparison is base (1f399b0) 88.71% compared to head (192fe05) 88.72%.
Report is 63 commits behind head on main.

FilesPatch %Lines
lightning/src/ln/channelmanager.rs89.21%37 Missing and 7 partials ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2700 +/- ##
=========================================
Coverage 88.71% 88.72% =========================================
Files 112 113 +1 Lines 88502 89533 +1031 Branches 88502 89533 +1031 =========================================
+ Hits 78517 79434 +917 - Misses 7752 7839 +87 - Partials 2233 2260 +27 

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

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

Nice! This turned out pretty good. I think we'll basically be able to use this for LSP 4 too.

Comment threadlightning/src/ln/channelmanager.rs Outdated
if msg.cltv_expiry > cur_height + CLTV_FAR_FAR_AWAY as u32 { // expiry_too_far
return Err("CLTV expiry is too far in the future");
}
if (outgoing_cltv_value) as u64 <= (cur_height + LATENCY_GRACE_PERIOD_BLOCKS) as u64 {

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.

Why keep the redundant one in decode_update_add_htlc_onion, can we just drop the redundant checks and leave it only doing the next-hop-channels-is-real checks.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Trying to figure out how to do this... the ChannelManager::decode_update_add_htlc_onion CLTV checks may generate a chan_update, while the checks in peel_payment_onion are simpler (since peel_payment_onion is called externally, without the context).

Are you saying we should move the checks inside the inner decode_incoming_update_add_htlc_onion fn?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok! got it figured out so there is no redundancy

Comment threadlightning/src/ln/channelmanager.rs Outdated
}

/// Peel one layer off an incoming onion, returning PendingHTLCInfo (either Forward or Receive).
/// Validates the outgoing CLTV value against the cur_height.

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.

Docs should describe some amount of "this does all the relevant context-free checks that LDK requires for payment relay or acceptance. If the payment is to be received, and the amount matches the expected amount for a given invoice, this indicates the UpdateAddHTLC, once fully committed in the channel, will generate an Event::PaymentReceived".

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Oops, needs a small rebase after the other PR.

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

Still making my way through

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 1a37835 to 98bc9a9CompareNovember 9, 2023 00:56

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

Almost there!

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs

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

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.
pub incoming_shared_secret: [u8; 32],
payment_hash: PaymentHash,

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.

Why leave this as the only unexposed field?

@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

OK, happy to do a follow-up on these items as soon as it gets merged

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 3a9fe46 to 3ddb6aaCompareNovember 14, 2023 19:50
@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

Oh, thanks for the tip. I reverted the merge commit. Also reverted the PeelOnionError stuff for a follow-up PR instead, per @valentinewallace's suggestion

valentinewallace
valentinewallace previously approved these changes Nov 14, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Having done more research into CLN and LND's htlc interception APIs, I don't think we need to follow-up adding PeelOnionError.

Both APIs take either an error code or a decoded onion error packet, so our current error should be sufficient for that.

I was also thinking the LSPS4 spec may need better error info, but from talking to @TheBlueMatt it sounds like the LSP would always just error with "unknown next channel."

So excuse the misleading direction, I think this PR is fine as-is.

Comment threadlightning/src/ln/channelmanager.rs Outdated

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

LGTM, though the docs on newly-public fields and structs really need to communicate a lot more information. Generally, any public field or struct needs docs that explain (a) what it is (often in terms of how we calculated it) and (b) what its used for, often how a user would use it (if there's no reason for them to use it, it shouldn't be public).

incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.
incoming_cltv_expiry: u32,
/// Optional shared secret for phantom node.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This tells a user almost nothing about what this is or what its used for.

/// generated using `get_fake_scid` from the scid_utils::fake_scid module.
short_channel_id: u64, // This should be NonZero<u64> eventually when we bump MSRV
},
/// An HTLC paid to an invoice we generated.

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: might be worth noting that, at this point, we have not checked that the invoice being paid was actually generated by us, but rather its claiming to pay an invoice of ours.

/// See [`RecipientOnionFields::custom_tlvs`] for more info.
custom_tlvs: Vec<(u64, Vec<u8>)>,
},
/// Incoming keysend (sender provided the preimage in a TLV).

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.

Only kinda specific to this PR, but the public interface is now kinda confused between keysend and spontaneous payments. We originally tried to use "spontaneous payments" for this publicly, but some keysend references slipped in, and now we're adding more. We should make everything consistent in a followup rename.

/// See [`RecipientOnionFields::payment_metadata`] for more info.
payment_metadata: Option<Vec<u8>>,
incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.

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: would be nice to also repeat what it is, not just what its used for.

pub struct PendingHTLCInfo {
/// Further routing details based on whether the HTLC is being forwarded or received.
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This doesn't really say much about what this is used for/why its here.

}
}

fn create_fwd_pending_htlc_info(

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.

Now that these are all freestanding functions, they (and the associated return/error structs) should probably move to some other file, if only to make channelmanager.rs slightly less huge.

@TheBlueMatt
TheBlueMatt merged commit 870a0f1 into lightningdevkit:mainNov 16, 2023
tnull added a commit that referenced this pull request Dec 6, 2023
Improve docs on newly-public structs after #2700
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evanfeenstra@codecov-commenter@TheBlueMatt@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' peel_payment_onion static fn in channelmanager by Evanfeenstra · Pull Request #2700 · lightningdevkit/rust-lightning · GitHub
Skip to content

peel_payment_onion static fn in channelmanager - #2700

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing
Nov 16, 2023
Merged

peel_payment_onion static fn in channelmanager#2700
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Contributor

Adds a public peel_payment_onion function that takes msgs::UpdateAddHTLC and returns PendingHTLCInfo.

I separated the internals of decode_update_add_htlc_onion, construct_recv_pending_htlc_info, and construct_fwd_pending_htlc_info into static functions, and used them to make the PendingHTLCInfo. There are two validation closures passed to peel_payment_onion... some of the outbound channel checking is done in these closures, so its up to the caller to validate against current channel state.

I am unsure about phantom_shared_secret and allow_underpay in create_recv_pending_htlc_info so i left them None/false when called from peel_payment_onion

Not sure if this is the best approach! But its much better than #2677

Comment threadlightning/src/ln/channelmanager.rs Outdated
}
};

let validate_peer_chan = |

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.

Rather than making these lambdas and passing them into decode_incoming_update_add_htlc_onion, can we just check them after running decode_incoming_update_add_htlc_onion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, its much cleaner now. I repeated the CLTV checks in the peel_payment_onion fn though, but I guess that's fine.

Also added a test for peel_payment_onion

@codecov-commenter

codecov-commenter commented Nov 1, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 44 lines in your changes are missing coverage. Please review.

Comparison is base (1f399b0) 88.71% compared to head (192fe05) 88.72%.
Report is 63 commits behind head on main.

FilesPatch %Lines
lightning/src/ln/channelmanager.rs89.21%37 Missing and 7 partials ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2700 +/- ##
=========================================
Coverage 88.71% 88.72% =========================================
Files 112 113 +1 Lines 88502 89533 +1031 Branches 88502 89533 +1031 =========================================
+ Hits 78517 79434 +917 - Misses 7752 7839 +87 - Partials 2233 2260 +27 

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

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

Nice! This turned out pretty good. I think we'll basically be able to use this for LSP 4 too.

Comment threadlightning/src/ln/channelmanager.rs Outdated
if msg.cltv_expiry > cur_height + CLTV_FAR_FAR_AWAY as u32 { // expiry_too_far
return Err("CLTV expiry is too far in the future");
}
if (outgoing_cltv_value) as u64 <= (cur_height + LATENCY_GRACE_PERIOD_BLOCKS) as u64 {

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.

Why keep the redundant one in decode_update_add_htlc_onion, can we just drop the redundant checks and leave it only doing the next-hop-channels-is-real checks.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Trying to figure out how to do this... the ChannelManager::decode_update_add_htlc_onion CLTV checks may generate a chan_update, while the checks in peel_payment_onion are simpler (since peel_payment_onion is called externally, without the context).

Are you saying we should move the checks inside the inner decode_incoming_update_add_htlc_onion fn?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok! got it figured out so there is no redundancy

Comment threadlightning/src/ln/channelmanager.rs Outdated
}

/// Peel one layer off an incoming onion, returning PendingHTLCInfo (either Forward or Receive).
/// Validates the outgoing CLTV value against the cur_height.

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.

Docs should describe some amount of "this does all the relevant context-free checks that LDK requires for payment relay or acceptance. If the payment is to be received, and the amount matches the expected amount for a given invoice, this indicates the UpdateAddHTLC, once fully committed in the channel, will generate an Event::PaymentReceived".

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Oops, needs a small rebase after the other PR.

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

Still making my way through

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 1a37835 to 98bc9a9CompareNovember 9, 2023 00:56

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

Almost there!

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs

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

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.
pub incoming_shared_secret: [u8; 32],
payment_hash: PaymentHash,

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.

Why leave this as the only unexposed field?

@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

OK, happy to do a follow-up on these items as soon as it gets merged

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 3a9fe46 to 3ddb6aaCompareNovember 14, 2023 19:50
@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

Oh, thanks for the tip. I reverted the merge commit. Also reverted the PeelOnionError stuff for a follow-up PR instead, per @valentinewallace's suggestion

valentinewallace
valentinewallace previously approved these changes Nov 14, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Having done more research into CLN and LND's htlc interception APIs, I don't think we need to follow-up adding PeelOnionError.

Both APIs take either an error code or a decoded onion error packet, so our current error should be sufficient for that.

I was also thinking the LSPS4 spec may need better error info, but from talking to @TheBlueMatt it sounds like the LSP would always just error with "unknown next channel."

So excuse the misleading direction, I think this PR is fine as-is.

Comment threadlightning/src/ln/channelmanager.rs Outdated

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

LGTM, though the docs on newly-public fields and structs really need to communicate a lot more information. Generally, any public field or struct needs docs that explain (a) what it is (often in terms of how we calculated it) and (b) what its used for, often how a user would use it (if there's no reason for them to use it, it shouldn't be public).

incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.
incoming_cltv_expiry: u32,
/// Optional shared secret for phantom node.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This tells a user almost nothing about what this is or what its used for.

/// generated using `get_fake_scid` from the scid_utils::fake_scid module.
short_channel_id: u64, // This should be NonZero<u64> eventually when we bump MSRV
},
/// An HTLC paid to an invoice we generated.

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: might be worth noting that, at this point, we have not checked that the invoice being paid was actually generated by us, but rather its claiming to pay an invoice of ours.

/// See [`RecipientOnionFields::custom_tlvs`] for more info.
custom_tlvs: Vec<(u64, Vec<u8>)>,
},
/// Incoming keysend (sender provided the preimage in a TLV).

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.

Only kinda specific to this PR, but the public interface is now kinda confused between keysend and spontaneous payments. We originally tried to use "spontaneous payments" for this publicly, but some keysend references slipped in, and now we're adding more. We should make everything consistent in a followup rename.

/// See [`RecipientOnionFields::payment_metadata`] for more info.
payment_metadata: Option<Vec<u8>>,
incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.

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: would be nice to also repeat what it is, not just what its used for.

pub struct PendingHTLCInfo {
/// Further routing details based on whether the HTLC is being forwarded or received.
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This doesn't really say much about what this is used for/why its here.

}
}

fn create_fwd_pending_htlc_info(

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.

Now that these are all freestanding functions, they (and the associated return/error structs) should probably move to some other file, if only to make channelmanager.rs slightly less huge.

@TheBlueMatt
TheBlueMatt merged commit 870a0f1 into lightningdevkit:mainNov 16, 2023
tnull added a commit that referenced this pull request Dec 6, 2023
Improve docs on newly-public structs after #2700
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

peel_payment_onion static fn in channelmanager - #2700

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing
Nov 16, 2023
Merged

peel_payment_onion static fn in channelmanager#2700
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
Evanfeenstra:pub-htlc-routing

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Contributor

Adds a public peel_payment_onion function that takes msgs::UpdateAddHTLC and returns PendingHTLCInfo.

I separated the internals of decode_update_add_htlc_onion, construct_recv_pending_htlc_info, and construct_fwd_pending_htlc_info into static functions, and used them to make the PendingHTLCInfo. There are two validation closures passed to peel_payment_onion... some of the outbound channel checking is done in these closures, so its up to the caller to validate against current channel state.

I am unsure about phantom_shared_secret and allow_underpay in create_recv_pending_htlc_info so i left them None/false when called from peel_payment_onion

Not sure if this is the best approach! But its much better than #2677

Comment threadlightning/src/ln/channelmanager.rs Outdated
}
};

let validate_peer_chan = |

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.

Rather than making these lambdas and passing them into decode_incoming_update_add_htlc_onion, can we just check them after running decode_incoming_update_add_htlc_onion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, its much cleaner now. I repeated the CLTV checks in the peel_payment_onion fn though, but I guess that's fine.

Also added a test for peel_payment_onion

@codecov-commenter

codecov-commenter commented Nov 1, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 44 lines in your changes are missing coverage. Please review.

Comparison is base (1f399b0) 88.71% compared to head (192fe05) 88.72%.
Report is 63 commits behind head on main.

FilesPatch %Lines
lightning/src/ln/channelmanager.rs89.21%37 Missing and 7 partials ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2700 +/- ##
=========================================
Coverage 88.71% 88.72% =========================================
Files 112 113 +1 Lines 88502 89533 +1031 Branches 88502 89533 +1031 =========================================
+ Hits 78517 79434 +917 - Misses 7752 7839 +87 - Partials 2233 2260 +27 

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

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

Nice! This turned out pretty good. I think we'll basically be able to use this for LSP 4 too.

Comment threadlightning/src/ln/channelmanager.rs Outdated
if msg.cltv_expiry > cur_height + CLTV_FAR_FAR_AWAY as u32 { // expiry_too_far
return Err("CLTV expiry is too far in the future");
}
if (outgoing_cltv_value) as u64 <= (cur_height + LATENCY_GRACE_PERIOD_BLOCKS) as u64 {

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.

Why keep the redundant one in decode_update_add_htlc_onion, can we just drop the redundant checks and leave it only doing the next-hop-channels-is-real checks.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Trying to figure out how to do this... the ChannelManager::decode_update_add_htlc_onion CLTV checks may generate a chan_update, while the checks in peel_payment_onion are simpler (since peel_payment_onion is called externally, without the context).

Are you saying we should move the checks inside the inner decode_incoming_update_add_htlc_onion fn?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok! got it figured out so there is no redundancy

Comment threadlightning/src/ln/channelmanager.rs Outdated
}

/// Peel one layer off an incoming onion, returning PendingHTLCInfo (either Forward or Receive).
/// Validates the outgoing CLTV value against the cur_height.

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.

Docs should describe some amount of "this does all the relevant context-free checks that LDK requires for payment relay or acceptance. If the payment is to be received, and the amount matches the expected amount for a given invoice, this indicates the UpdateAddHTLC, once fully committed in the channel, will generate an Event::PaymentReceived".

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Oops, needs a small rebase after the other PR.

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

Still making my way through

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 1a37835 to 98bc9a9CompareNovember 9, 2023 00:56

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

Almost there!

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs

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

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.
pub incoming_shared_secret: [u8; 32],
payment_hash: PaymentHash,

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.

Why leave this as the only unexposed field?

@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Needs rebase unfortunately :(

LGTM after this. Also fine with fixing these in follow-up.

OK, happy to do a follow-up on these items as soon as it gets merged

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

@Evanfeenstra
Evanfeenstraforce-pushed the pub-htlc-routing branch 2 times, most recently from 3a9fe46 to 3ddb6aaCompareNovember 14, 2023 19:50
@Evanfeenstra

Copy link
Copy Markdown
ContributorAuthor

Rather than using merge commits to rebase, please use rebase directly. See https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#rebasing-changes.

Oh, thanks for the tip. I reverted the merge commit. Also reverted the PeelOnionError stuff for a follow-up PR instead, per @valentinewallace's suggestion

valentinewallace
valentinewallace previously approved these changes Nov 14, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Having done more research into CLN and LND's htlc interception APIs, I don't think we need to follow-up adding PeelOnionError.

Both APIs take either an error code or a decoded onion error packet, so our current error should be sufficient for that.

I was also thinking the LSPS4 spec may need better error info, but from talking to @TheBlueMatt it sounds like the LSP would always just error with "unknown next channel."

So excuse the misleading direction, I think this PR is fine as-is.

Comment threadlightning/src/ln/channelmanager.rs Outdated

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

LGTM, though the docs on newly-public fields and structs really need to communicate a lot more information. Generally, any public field or struct needs docs that explain (a) what it is (often in terms of how we calculated it) and (b) what its used for, often how a user would use it (if there's no reason for them to use it, it shouldn't be public).

incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.
incoming_cltv_expiry: u32,
/// Optional shared secret for phantom node.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This tells a user almost nothing about what this is or what its used for.

/// generated using `get_fake_scid` from the scid_utils::fake_scid module.
short_channel_id: u64, // This should be NonZero<u64> eventually when we bump MSRV
},
/// An HTLC paid to an invoice we generated.

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: might be worth noting that, at this point, we have not checked that the invoice being paid was actually generated by us, but rather its claiming to pay an invoice of ours.

/// See [`RecipientOnionFields::custom_tlvs`] for more info.
custom_tlvs: Vec<(u64, Vec<u8>)>,
},
/// Incoming keysend (sender provided the preimage in a TLV).

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.

Only kinda specific to this PR, but the public interface is now kinda confused between keysend and spontaneous payments. We originally tried to use "spontaneous payments" for this publicly, but some keysend references slipped in, and now we're adding more. We should make everything consistent in a followup rename.

/// See [`RecipientOnionFields::payment_metadata`] for more info.
payment_metadata: Option<Vec<u8>>,
incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
/// Used to track when we should expire pending HTLCs that go unclaimed.

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: would be nice to also repeat what it is, not just what its used for.

pub struct PendingHTLCInfo {
/// Further routing details based on whether the HTLC is being forwarded or received.
pub routing: PendingHTLCRouting,
/// Shared secret from the previous hop.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This doesn't really say much about what this is used for/why its here.

}
}

fn create_fwd_pending_htlc_info(

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.

Now that these are all freestanding functions, they (and the associated return/error structs) should probably move to some other file, if only to make channelmanager.rs slightly less huge.

@TheBlueMatt
TheBlueMatt merged commit 870a0f1 into lightningdevkit:mainNov 16, 2023
tnull added a commit that referenced this pull request Dec 6, 2023
Improve docs on newly-public structs after #2700
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evanfeenstra@codecov-commenter@TheBlueMatt@valentinewallace