Skip to content

Remove the final_cltv_expiry_delta in RouteParameters entirely - #2015

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields
Feb 28, 2023
Merged

Remove the final_cltv_expiry_delta in RouteParameters entirely#2015
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

fbc0847 purported to "move" the
final_cltv_expiry_delta field to PaymentParamters from
RouteParameters. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in PaymentParameters.

It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every PaymentParameters while deserializing.

We do this here - making PaymentParameters a ReadableArgs
taking a "default" cltv_expiry_delta when it goes to read. This
allows existing RouteParameters objects to pass the read
final_cltv_expiry_delta field in to be used if the new field
wasn't present.

Sadly, if we want to do this, we have to do it in the same release as the above commit, so it has to land for 114 :(

@TheBlueMattTheBlueMatt added this to the 0.0.114 milestone Feb 6, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch 2 times, most recently from f106a82 to 76a1530CompareFebruary 16, 2023 01:04
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@dunxen

dunxen commented Feb 20, 2023

Copy link
Copy Markdown
Contributor

Looks like fuzz stuff needs updating

diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 9b3b76c2..3d9be984 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -513,7 +513,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
@@ -537,7 +536,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
diff --git a/fuzz/src/router.rs b/fuzz/src/router.rs
index a7c50de4..66d68040 100644
--- a/fuzz/src/router.rs+++ b/fuzz/src/router.rs@@ -302,7 +302,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
payment_params: PaymentParameters::from_node_id(*target, final_cltv_expiry_delta)
.with_route_hints(last_hops.clone()),
final_value_msat,
- final_cltv_expiry_delta,
};
let _ = find_route(&our_pubkey, &route_params, &net_graph,
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),

@dunxendunxen self-assigned this Feb 20, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 76a1530 to 1e1cb91CompareFebruary 21, 2023 17:09
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, thanks. Also rebased.

Comment threadlightning/src/routing/router.rs Outdated
(9, final_cltv_expiry_delta, (default_value, default_final_cltv_expiry_delta)),
});
Ok(Self {
payee_pubkey: payee_pubkey.0.unwrap(),

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.

Wouldn't it provide better compile-time checks to use _init_tlv_based_struct_field ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, I guess, I mean it currently does this but I agree if we ever change it we don't want this to blow up.

Comment threadlightning/src/routing/router.rs
pub final_cltv_expiry_delta: u32,
}

impl Writeable for PaymentParameters {

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 not keep using the macro but default to 0 (or MIN_CLTV_EXPIRY_DELTA), so the field can be set by higher-level reads? Do we expect users to be serializing this struct?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114, we want to make sure the final_cltv_expiry_delta parameter moves over to the right place. Because its a given parameter I dont think we want to just assume its some specific value.

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.

Hmm, if we kept PayParams using the ser macro with a default value, RouteParams deser would always ensure it sets the correct value, though. I see why we need to break out of the macro for RouteParams, but just not sure I understand why we need to break out for PaymentParams.

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114

+ retries on restart aren't supported in 114 (do you mean using send_payment?).

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The value read from the old field in RouteParameters needs to make it into the PaymentParameters somehow on read, I'm not sure how we do that without breaking up the macro as well?

  • retries on restart aren't supported in 114 (do you mean using send_payment?).

Right, I guess I mean if you're using the PaymentPathFailed data to retry? I guess it borderline doesn't matter but it does feel weird to synthesize the wrong value in the serialized event.

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.

We wouldn't be synthesizing the wrong value, though, IIUC. Shouldn't this code in RouteParams deser cover this case, if they do want to use PaymentPathFailed::retry?

 let mut payment_params: PaymentParameters = payment_params.0.unwrap();
if payment_params.final_cltv_expiry_delta == 0 {
payment_params.final_cltv_expiry_delta = final_cltv_expiry_delta.0.unwrap();
}

Another thought could be removing retry entirely, which we want to do at some point anyway, maybe even more ser complexity introduced there though.

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.

Anyway, we may be talking past each other, and it doesn't matter that much though the broken-up macro is somewhat ugly, so I won't die on this hill :)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Ah, okay, I indeed didn't understand your suggestion here - yes, I think all the places we read a RouteParameters in LDK we are happy with the special-case of 0 for min_final_cltv_delta being treated as "no value" and overwriting it. However, that's...weird in a public API? Like, there's an implicit Option, there, basically, and we can't have an actual Option there because the router can't deal with it. So I'd kinda rather force the caller to pass the value in via the ReadableArgs implementation rather than have an implicit Option?

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.

Yeah, just seems unlikely this struct would ever be serialized on its own, even if it's technically possible. Fine to leave as-is

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

LGTM

Comment threadlightning/src/routing/router.rs
@codecov-commenter

codecov-commenter commented Feb 22, 2023

Copy link
Copy Markdown

Codecov Report

Base: 87.26% // Head: 87.42% // Increases project coverage by +0.15% 🎉

Coverage data is based on head (a4d85db) compared to base (16b3c72).
Patch coverage: 58.00% of modified lines in pull request are covered.

❗ Current head a4d85db differs from pull request most recent head f03b7cd. Consider uploading reports for the commit f03b7cd to get more accurate results

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2015 +/- ##
==========================================
+ Coverage 87.26% 87.42% +0.15% 
==========================================
Files 101 101 Lines 44414 47347 +2933 Branches 44414 47347 +2933 ==========================================
+ Hits 38759 41394 +2635 - Misses 5655 5953 +298 
Impacted FilesCoverage Δ
lightning-invoice/src/payment.rs75.78% <ø> (+0.03%)⬆️
lightning-invoice/src/utils.rs96.14% <ø> (ø)
lightning/src/ln/functional_tests.rs97.33% <ø> (+0.04%)⬆️
lightning/src/ln/outbound_payment.rs80.56% <ø> (+1.49%)⬆️
lightning/src/util/ser.rs82.92% <0.00%> (-1.80%)⬇️
lightning/src/util/ser_macros.rs92.69% <ø> (ø)
lightning/src/routing/router.rs92.24% <56.25%> (-0.54%)⬇️
lightning/src/ln/channelmanager.rs89.10% <63.63%> (+2.56%)⬆️
lightning/src/ln/payment_tests.rs95.65% <100.00%> (+<0.01%)⬆️
lightning/src/sync/nostd_sync.rs37.50% <0.00%> (-5.00%)⬇️
... and 35 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@dunxen

Copy link
Copy Markdown
Contributor

Looks good for squash

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

Don't have much to add, just learned a lot about macros while trying to understand what this PR was doing.

One comprehension check: Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

@valentinewallace

Copy link
Copy Markdown
Contributor

Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

We're actually planning to get rid of PaymentPathFailed::retry, so seems it's mostly serializable for historical reasons or in case users want to store it for whatever reason. PaymentParameters definitely need to be serializable because it's serialized in ChannelManager

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from a4d85db to de3fab7CompareFebruary 22, 2023 23:07
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed fixups down.

valentinewallace
valentinewallace previously approved these changes Feb 22, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

valentinewallace
valentinewallace previously approved these changes Feb 27, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from d2307db to 28a94c1CompareFebruary 27, 2023 18:35
@valentinewallace

Copy link
Copy Markdown
Contributor

Some rebase errors need fixing sadly

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Sorry was waiting on #2055

When we read a `Route` (or a list of `RouteHop`s), we should never
have zero paths or zero `RouteHop`s in a path. As such, its fine to
simply reject these at deserialization-time. Technically this could
lead to something which we can generate not round-trip'ing
serialization, but that seems okay here.
This adds `required` support for trait-wrapped reading (e.g. for
objects read via `ReadableArgs`) as well as support for the
trait-wrapped reading syntax across the TLV struct/enum
serialization macros.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 28a94c1 to 280f087CompareFebruary 27, 2023 22:31
fbc0847 purported to "move" the
`final_cltv_expiry_delta` field to `PaymentParamters` from
`RouteParameters`. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in `PaymentParameters`.
It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every `PaymentParameters` while deserializing.
We do this here - making `PaymentParameters` a `ReadableArgs`
taking a "default" `cltv_expiry_delta` when it goes to read. This
allows existing `RouteParameters` objects to pass the read
`final_cltv_expiry_delta` field in to be used if the new field
wasn't present.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 280f087 to f03b7cdCompareFebruary 27, 2023 22:33
@dunxen

Copy link
Copy Markdown
Contributor

Phew. What a rebase rally! :P

@dunxendunxen removed their assignment Feb 28, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Heh, it wasn't that important compared to the things it conflicted with 🤷‍♂️

@TheBlueMatt
TheBlueMatt merged commit b8bea74 into lightningdevkit:mainFeb 28, 2023
@valentinewallacevalentinewallace mentioned this pull request Mar 3, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@valentinewallace@dunxen@codecov-commenter@naumenkogs@alecchendev
, '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" + '
Remove the final_cltv_expiry_delta in RouteParameters entirely by TheBlueMatt · Pull Request #2015 · lightningdevkit/rust-lightning · GitHub
Skip to content

Remove the final_cltv_expiry_delta in RouteParameters entirely - #2015

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields
Feb 28, 2023
Merged

Remove the final_cltv_expiry_delta in RouteParameters entirely#2015
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

fbc0847 purported to "move" the
final_cltv_expiry_delta field to PaymentParamters from
RouteParameters. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in PaymentParameters.

It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every PaymentParameters while deserializing.

We do this here - making PaymentParameters a ReadableArgs
taking a "default" cltv_expiry_delta when it goes to read. This
allows existing RouteParameters objects to pass the read
final_cltv_expiry_delta field in to be used if the new field
wasn't present.

Sadly, if we want to do this, we have to do it in the same release as the above commit, so it has to land for 114 :(

@TheBlueMattTheBlueMatt added this to the 0.0.114 milestone Feb 6, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch 2 times, most recently from f106a82 to 76a1530CompareFebruary 16, 2023 01:04
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@dunxen

dunxen commented Feb 20, 2023

Copy link
Copy Markdown
Contributor

Looks like fuzz stuff needs updating

diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 9b3b76c2..3d9be984 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -513,7 +513,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
@@ -537,7 +536,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
diff --git a/fuzz/src/router.rs b/fuzz/src/router.rs
index a7c50de4..66d68040 100644
--- a/fuzz/src/router.rs+++ b/fuzz/src/router.rs@@ -302,7 +302,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
payment_params: PaymentParameters::from_node_id(*target, final_cltv_expiry_delta)
.with_route_hints(last_hops.clone()),
final_value_msat,
- final_cltv_expiry_delta,
};
let _ = find_route(&our_pubkey, &route_params, &net_graph,
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),

@dunxendunxen self-assigned this Feb 20, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 76a1530 to 1e1cb91CompareFebruary 21, 2023 17:09
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, thanks. Also rebased.

Comment threadlightning/src/routing/router.rs Outdated
(9, final_cltv_expiry_delta, (default_value, default_final_cltv_expiry_delta)),
});
Ok(Self {
payee_pubkey: payee_pubkey.0.unwrap(),

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.

Wouldn't it provide better compile-time checks to use _init_tlv_based_struct_field ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, I guess, I mean it currently does this but I agree if we ever change it we don't want this to blow up.

Comment threadlightning/src/routing/router.rs
pub final_cltv_expiry_delta: u32,
}

impl Writeable for PaymentParameters {

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 not keep using the macro but default to 0 (or MIN_CLTV_EXPIRY_DELTA), so the field can be set by higher-level reads? Do we expect users to be serializing this struct?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114, we want to make sure the final_cltv_expiry_delta parameter moves over to the right place. Because its a given parameter I dont think we want to just assume its some specific value.

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.

Hmm, if we kept PayParams using the ser macro with a default value, RouteParams deser would always ensure it sets the correct value, though. I see why we need to break out of the macro for RouteParams, but just not sure I understand why we need to break out for PaymentParams.

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114

+ retries on restart aren't supported in 114 (do you mean using send_payment?).

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The value read from the old field in RouteParameters needs to make it into the PaymentParameters somehow on read, I'm not sure how we do that without breaking up the macro as well?

  • retries on restart aren't supported in 114 (do you mean using send_payment?).

Right, I guess I mean if you're using the PaymentPathFailed data to retry? I guess it borderline doesn't matter but it does feel weird to synthesize the wrong value in the serialized event.

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.

We wouldn't be synthesizing the wrong value, though, IIUC. Shouldn't this code in RouteParams deser cover this case, if they do want to use PaymentPathFailed::retry?

 let mut payment_params: PaymentParameters = payment_params.0.unwrap();
if payment_params.final_cltv_expiry_delta == 0 {
payment_params.final_cltv_expiry_delta = final_cltv_expiry_delta.0.unwrap();
}

Another thought could be removing retry entirely, which we want to do at some point anyway, maybe even more ser complexity introduced there though.

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.

Anyway, we may be talking past each other, and it doesn't matter that much though the broken-up macro is somewhat ugly, so I won't die on this hill :)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Ah, okay, I indeed didn't understand your suggestion here - yes, I think all the places we read a RouteParameters in LDK we are happy with the special-case of 0 for min_final_cltv_delta being treated as "no value" and overwriting it. However, that's...weird in a public API? Like, there's an implicit Option, there, basically, and we can't have an actual Option there because the router can't deal with it. So I'd kinda rather force the caller to pass the value in via the ReadableArgs implementation rather than have an implicit Option?

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.

Yeah, just seems unlikely this struct would ever be serialized on its own, even if it's technically possible. Fine to leave as-is

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

LGTM

Comment threadlightning/src/routing/router.rs
@codecov-commenter

codecov-commenter commented Feb 22, 2023

Copy link
Copy Markdown

Codecov Report

Base: 87.26% // Head: 87.42% // Increases project coverage by +0.15% 🎉

Coverage data is based on head (a4d85db) compared to base (16b3c72).
Patch coverage: 58.00% of modified lines in pull request are covered.

❗ Current head a4d85db differs from pull request most recent head f03b7cd. Consider uploading reports for the commit f03b7cd to get more accurate results

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2015 +/- ##
==========================================
+ Coverage 87.26% 87.42% +0.15% 
==========================================
Files 101 101 Lines 44414 47347 +2933 Branches 44414 47347 +2933 ==========================================
+ Hits 38759 41394 +2635 - Misses 5655 5953 +298 
Impacted FilesCoverage Δ
lightning-invoice/src/payment.rs75.78% <ø> (+0.03%)⬆️
lightning-invoice/src/utils.rs96.14% <ø> (ø)
lightning/src/ln/functional_tests.rs97.33% <ø> (+0.04%)⬆️
lightning/src/ln/outbound_payment.rs80.56% <ø> (+1.49%)⬆️
lightning/src/util/ser.rs82.92% <0.00%> (-1.80%)⬇️
lightning/src/util/ser_macros.rs92.69% <ø> (ø)
lightning/src/routing/router.rs92.24% <56.25%> (-0.54%)⬇️
lightning/src/ln/channelmanager.rs89.10% <63.63%> (+2.56%)⬆️
lightning/src/ln/payment_tests.rs95.65% <100.00%> (+<0.01%)⬆️
lightning/src/sync/nostd_sync.rs37.50% <0.00%> (-5.00%)⬇️
... and 35 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@dunxen

Copy link
Copy Markdown
Contributor

Looks good for squash

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

Don't have much to add, just learned a lot about macros while trying to understand what this PR was doing.

One comprehension check: Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

@valentinewallace

Copy link
Copy Markdown
Contributor

Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

We're actually planning to get rid of PaymentPathFailed::retry, so seems it's mostly serializable for historical reasons or in case users want to store it for whatever reason. PaymentParameters definitely need to be serializable because it's serialized in ChannelManager

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from a4d85db to de3fab7CompareFebruary 22, 2023 23:07
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed fixups down.

valentinewallace
valentinewallace previously approved these changes Feb 22, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

valentinewallace
valentinewallace previously approved these changes Feb 27, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from d2307db to 28a94c1CompareFebruary 27, 2023 18:35
@valentinewallace

Copy link
Copy Markdown
Contributor

Some rebase errors need fixing sadly

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Sorry was waiting on #2055

When we read a `Route` (or a list of `RouteHop`s), we should never
have zero paths or zero `RouteHop`s in a path. As such, its fine to
simply reject these at deserialization-time. Technically this could
lead to something which we can generate not round-trip'ing
serialization, but that seems okay here.
This adds `required` support for trait-wrapped reading (e.g. for
objects read via `ReadableArgs`) as well as support for the
trait-wrapped reading syntax across the TLV struct/enum
serialization macros.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 28a94c1 to 280f087CompareFebruary 27, 2023 22:31
fbc0847 purported to "move" the
`final_cltv_expiry_delta` field to `PaymentParamters` from
`RouteParameters`. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in `PaymentParameters`.
It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every `PaymentParameters` while deserializing.
We do this here - making `PaymentParameters` a `ReadableArgs`
taking a "default" `cltv_expiry_delta` when it goes to read. This
allows existing `RouteParameters` objects to pass the read
`final_cltv_expiry_delta` field in to be used if the new field
wasn't present.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 280f087 to f03b7cdCompareFebruary 27, 2023 22:33
@dunxen

Copy link
Copy Markdown
Contributor

Phew. What a rebase rally! :P

@dunxendunxen removed their assignment Feb 28, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Heh, it wasn't that important compared to the things it conflicted with 🤷‍♂️

@TheBlueMatt
TheBlueMatt merged commit b8bea74 into lightningdevkit:mainFeb 28, 2023
@valentinewallacevalentinewallace mentioned this pull request Mar 3, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@valentinewallace@dunxen@codecov-commenter@naumenkogs@alecchendev
, '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('^' + ".*" + ' Remove the final_cltv_expiry_delta in RouteParameters entirely by TheBlueMatt · Pull Request #2015 · lightningdevkit/rust-lightning · GitHub
Skip to content

Remove the final_cltv_expiry_delta in RouteParameters entirely - #2015

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields
Feb 28, 2023
Merged

Remove the final_cltv_expiry_delta in RouteParameters entirely#2015
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

fbc0847 purported to "move" the
final_cltv_expiry_delta field to PaymentParamters from
RouteParameters. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in PaymentParameters.

It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every PaymentParameters while deserializing.

We do this here - making PaymentParameters a ReadableArgs
taking a "default" cltv_expiry_delta when it goes to read. This
allows existing RouteParameters objects to pass the read
final_cltv_expiry_delta field in to be used if the new field
wasn't present.

Sadly, if we want to do this, we have to do it in the same release as the above commit, so it has to land for 114 :(

@TheBlueMattTheBlueMatt added this to the 0.0.114 milestone Feb 6, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch 2 times, most recently from f106a82 to 76a1530CompareFebruary 16, 2023 01:04
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@dunxen

dunxen commented Feb 20, 2023

Copy link
Copy Markdown
Contributor

Looks like fuzz stuff needs updating

diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 9b3b76c2..3d9be984 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -513,7 +513,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
@@ -537,7 +536,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
diff --git a/fuzz/src/router.rs b/fuzz/src/router.rs
index a7c50de4..66d68040 100644
--- a/fuzz/src/router.rs+++ b/fuzz/src/router.rs@@ -302,7 +302,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
payment_params: PaymentParameters::from_node_id(*target, final_cltv_expiry_delta)
.with_route_hints(last_hops.clone()),
final_value_msat,
- final_cltv_expiry_delta,
};
let _ = find_route(&our_pubkey, &route_params, &net_graph,
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),

@dunxendunxen self-assigned this Feb 20, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 76a1530 to 1e1cb91CompareFebruary 21, 2023 17:09
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, thanks. Also rebased.

Comment threadlightning/src/routing/router.rs Outdated
(9, final_cltv_expiry_delta, (default_value, default_final_cltv_expiry_delta)),
});
Ok(Self {
payee_pubkey: payee_pubkey.0.unwrap(),

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.

Wouldn't it provide better compile-time checks to use _init_tlv_based_struct_field ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, I guess, I mean it currently does this but I agree if we ever change it we don't want this to blow up.

Comment threadlightning/src/routing/router.rs
pub final_cltv_expiry_delta: u32,
}

impl Writeable for PaymentParameters {

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 not keep using the macro but default to 0 (or MIN_CLTV_EXPIRY_DELTA), so the field can be set by higher-level reads? Do we expect users to be serializing this struct?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114, we want to make sure the final_cltv_expiry_delta parameter moves over to the right place. Because its a given parameter I dont think we want to just assume its some specific value.

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.

Hmm, if we kept PayParams using the ser macro with a default value, RouteParams deser would always ensure it sets the correct value, though. I see why we need to break out of the macro for RouteParams, but just not sure I understand why we need to break out for PaymentParams.

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114

+ retries on restart aren't supported in 114 (do you mean using send_payment?).

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The value read from the old field in RouteParameters needs to make it into the PaymentParameters somehow on read, I'm not sure how we do that without breaking up the macro as well?

  • retries on restart aren't supported in 114 (do you mean using send_payment?).

Right, I guess I mean if you're using the PaymentPathFailed data to retry? I guess it borderline doesn't matter but it does feel weird to synthesize the wrong value in the serialized event.

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.

We wouldn't be synthesizing the wrong value, though, IIUC. Shouldn't this code in RouteParams deser cover this case, if they do want to use PaymentPathFailed::retry?

 let mut payment_params: PaymentParameters = payment_params.0.unwrap();
if payment_params.final_cltv_expiry_delta == 0 {
payment_params.final_cltv_expiry_delta = final_cltv_expiry_delta.0.unwrap();
}

Another thought could be removing retry entirely, which we want to do at some point anyway, maybe even more ser complexity introduced there though.

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.

Anyway, we may be talking past each other, and it doesn't matter that much though the broken-up macro is somewhat ugly, so I won't die on this hill :)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Ah, okay, I indeed didn't understand your suggestion here - yes, I think all the places we read a RouteParameters in LDK we are happy with the special-case of 0 for min_final_cltv_delta being treated as "no value" and overwriting it. However, that's...weird in a public API? Like, there's an implicit Option, there, basically, and we can't have an actual Option there because the router can't deal with it. So I'd kinda rather force the caller to pass the value in via the ReadableArgs implementation rather than have an implicit Option?

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.

Yeah, just seems unlikely this struct would ever be serialized on its own, even if it's technically possible. Fine to leave as-is

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

LGTM

Comment threadlightning/src/routing/router.rs
@codecov-commenter

codecov-commenter commented Feb 22, 2023

Copy link
Copy Markdown

Codecov Report

Base: 87.26% // Head: 87.42% // Increases project coverage by +0.15% 🎉

Coverage data is based on head (a4d85db) compared to base (16b3c72).
Patch coverage: 58.00% of modified lines in pull request are covered.

❗ Current head a4d85db differs from pull request most recent head f03b7cd. Consider uploading reports for the commit f03b7cd to get more accurate results

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2015 +/- ##
==========================================
+ Coverage 87.26% 87.42% +0.15% 
==========================================
Files 101 101 Lines 44414 47347 +2933 Branches 44414 47347 +2933 ==========================================
+ Hits 38759 41394 +2635 - Misses 5655 5953 +298 
Impacted FilesCoverage Δ
lightning-invoice/src/payment.rs75.78% <ø> (+0.03%)⬆️
lightning-invoice/src/utils.rs96.14% <ø> (ø)
lightning/src/ln/functional_tests.rs97.33% <ø> (+0.04%)⬆️
lightning/src/ln/outbound_payment.rs80.56% <ø> (+1.49%)⬆️
lightning/src/util/ser.rs82.92% <0.00%> (-1.80%)⬇️
lightning/src/util/ser_macros.rs92.69% <ø> (ø)
lightning/src/routing/router.rs92.24% <56.25%> (-0.54%)⬇️
lightning/src/ln/channelmanager.rs89.10% <63.63%> (+2.56%)⬆️
lightning/src/ln/payment_tests.rs95.65% <100.00%> (+<0.01%)⬆️
lightning/src/sync/nostd_sync.rs37.50% <0.00%> (-5.00%)⬇️
... and 35 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@dunxen

Copy link
Copy Markdown
Contributor

Looks good for squash

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

Don't have much to add, just learned a lot about macros while trying to understand what this PR was doing.

One comprehension check: Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

@valentinewallace

Copy link
Copy Markdown
Contributor

Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

We're actually planning to get rid of PaymentPathFailed::retry, so seems it's mostly serializable for historical reasons or in case users want to store it for whatever reason. PaymentParameters definitely need to be serializable because it's serialized in ChannelManager

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from a4d85db to de3fab7CompareFebruary 22, 2023 23:07
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed fixups down.

valentinewallace
valentinewallace previously approved these changes Feb 22, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

valentinewallace
valentinewallace previously approved these changes Feb 27, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from d2307db to 28a94c1CompareFebruary 27, 2023 18:35
@valentinewallace

Copy link
Copy Markdown
Contributor

Some rebase errors need fixing sadly

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Sorry was waiting on #2055

When we read a `Route` (or a list of `RouteHop`s), we should never
have zero paths or zero `RouteHop`s in a path. As such, its fine to
simply reject these at deserialization-time. Technically this could
lead to something which we can generate not round-trip'ing
serialization, but that seems okay here.
This adds `required` support for trait-wrapped reading (e.g. for
objects read via `ReadableArgs`) as well as support for the
trait-wrapped reading syntax across the TLV struct/enum
serialization macros.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 28a94c1 to 280f087CompareFebruary 27, 2023 22:31
fbc0847 purported to "move" the
`final_cltv_expiry_delta` field to `PaymentParamters` from
`RouteParameters`. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in `PaymentParameters`.
It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every `PaymentParameters` while deserializing.
We do this here - making `PaymentParameters` a `ReadableArgs`
taking a "default" `cltv_expiry_delta` when it goes to read. This
allows existing `RouteParameters` objects to pass the read
`final_cltv_expiry_delta` field in to be used if the new field
wasn't present.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 280f087 to f03b7cdCompareFebruary 27, 2023 22:33
@dunxen

Copy link
Copy Markdown
Contributor

Phew. What a rebase rally! :P

@dunxendunxen removed their assignment Feb 28, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Heh, it wasn't that important compared to the things it conflicted with 🤷‍♂️

@TheBlueMatt
TheBlueMatt merged commit b8bea74 into lightningdevkit:mainFeb 28, 2023
@valentinewallacevalentinewallace mentioned this pull request Mar 3, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@valentinewallace@dunxen@codecov-commenter@naumenkogs@alecchendev
, '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('^' + ".*" + ' Remove the final_cltv_expiry_delta in RouteParameters entirely by TheBlueMatt · Pull Request #2015 · lightningdevkit/rust-lightning · GitHub
Skip to content

Remove the final_cltv_expiry_delta in RouteParameters entirely - #2015

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields
Feb 28, 2023
Merged

Remove the final_cltv_expiry_delta in RouteParameters entirely#2015
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

fbc0847 purported to "move" the
final_cltv_expiry_delta field to PaymentParamters from
RouteParameters. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in PaymentParameters.

It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every PaymentParameters while deserializing.

We do this here - making PaymentParameters a ReadableArgs
taking a "default" cltv_expiry_delta when it goes to read. This
allows existing RouteParameters objects to pass the read
final_cltv_expiry_delta field in to be used if the new field
wasn't present.

Sadly, if we want to do this, we have to do it in the same release as the above commit, so it has to land for 114 :(

@TheBlueMattTheBlueMatt added this to the 0.0.114 milestone Feb 6, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch 2 times, most recently from f106a82 to 76a1530CompareFebruary 16, 2023 01:04
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@dunxen

dunxen commented Feb 20, 2023

Copy link
Copy Markdown
Contributor

Looks like fuzz stuff needs updating

diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 9b3b76c2..3d9be984 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -513,7 +513,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
@@ -537,7 +536,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
diff --git a/fuzz/src/router.rs b/fuzz/src/router.rs
index a7c50de4..66d68040 100644
--- a/fuzz/src/router.rs+++ b/fuzz/src/router.rs@@ -302,7 +302,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
payment_params: PaymentParameters::from_node_id(*target, final_cltv_expiry_delta)
.with_route_hints(last_hops.clone()),
final_value_msat,
- final_cltv_expiry_delta,
};
let _ = find_route(&our_pubkey, &route_params, &net_graph,
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),

@dunxendunxen self-assigned this Feb 20, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 76a1530 to 1e1cb91CompareFebruary 21, 2023 17:09
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, thanks. Also rebased.

Comment threadlightning/src/routing/router.rs Outdated
(9, final_cltv_expiry_delta, (default_value, default_final_cltv_expiry_delta)),
});
Ok(Self {
payee_pubkey: payee_pubkey.0.unwrap(),

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.

Wouldn't it provide better compile-time checks to use _init_tlv_based_struct_field ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, I guess, I mean it currently does this but I agree if we ever change it we don't want this to blow up.

Comment threadlightning/src/routing/router.rs
pub final_cltv_expiry_delta: u32,
}

impl Writeable for PaymentParameters {

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 not keep using the macro but default to 0 (or MIN_CLTV_EXPIRY_DELTA), so the field can be set by higher-level reads? Do we expect users to be serializing this struct?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114, we want to make sure the final_cltv_expiry_delta parameter moves over to the right place. Because its a given parameter I dont think we want to just assume its some specific value.

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.

Hmm, if we kept PayParams using the ser macro with a default value, RouteParams deser would always ensure it sets the correct value, though. I see why we need to break out of the macro for RouteParams, but just not sure I understand why we need to break out for PaymentParams.

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114

+ retries on restart aren't supported in 114 (do you mean using send_payment?).

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The value read from the old field in RouteParameters needs to make it into the PaymentParameters somehow on read, I'm not sure how we do that without breaking up the macro as well?

  • retries on restart aren't supported in 114 (do you mean using send_payment?).

Right, I guess I mean if you're using the PaymentPathFailed data to retry? I guess it borderline doesn't matter but it does feel weird to synthesize the wrong value in the serialized event.

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.

We wouldn't be synthesizing the wrong value, though, IIUC. Shouldn't this code in RouteParams deser cover this case, if they do want to use PaymentPathFailed::retry?

 let mut payment_params: PaymentParameters = payment_params.0.unwrap();
if payment_params.final_cltv_expiry_delta == 0 {
payment_params.final_cltv_expiry_delta = final_cltv_expiry_delta.0.unwrap();
}

Another thought could be removing retry entirely, which we want to do at some point anyway, maybe even more ser complexity introduced there though.

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.

Anyway, we may be talking past each other, and it doesn't matter that much though the broken-up macro is somewhat ugly, so I won't die on this hill :)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Ah, okay, I indeed didn't understand your suggestion here - yes, I think all the places we read a RouteParameters in LDK we are happy with the special-case of 0 for min_final_cltv_delta being treated as "no value" and overwriting it. However, that's...weird in a public API? Like, there's an implicit Option, there, basically, and we can't have an actual Option there because the router can't deal with it. So I'd kinda rather force the caller to pass the value in via the ReadableArgs implementation rather than have an implicit Option?

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.

Yeah, just seems unlikely this struct would ever be serialized on its own, even if it's technically possible. Fine to leave as-is

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

LGTM

Comment threadlightning/src/routing/router.rs
@codecov-commenter

codecov-commenter commented Feb 22, 2023

Copy link
Copy Markdown

Codecov Report

Base: 87.26% // Head: 87.42% // Increases project coverage by +0.15% 🎉

Coverage data is based on head (a4d85db) compared to base (16b3c72).
Patch coverage: 58.00% of modified lines in pull request are covered.

❗ Current head a4d85db differs from pull request most recent head f03b7cd. Consider uploading reports for the commit f03b7cd to get more accurate results

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2015 +/- ##
==========================================
+ Coverage 87.26% 87.42% +0.15% 
==========================================
Files 101 101 Lines 44414 47347 +2933 Branches 44414 47347 +2933 ==========================================
+ Hits 38759 41394 +2635 - Misses 5655 5953 +298 
Impacted FilesCoverage Δ
lightning-invoice/src/payment.rs75.78% <ø> (+0.03%)⬆️
lightning-invoice/src/utils.rs96.14% <ø> (ø)
lightning/src/ln/functional_tests.rs97.33% <ø> (+0.04%)⬆️
lightning/src/ln/outbound_payment.rs80.56% <ø> (+1.49%)⬆️
lightning/src/util/ser.rs82.92% <0.00%> (-1.80%)⬇️
lightning/src/util/ser_macros.rs92.69% <ø> (ø)
lightning/src/routing/router.rs92.24% <56.25%> (-0.54%)⬇️
lightning/src/ln/channelmanager.rs89.10% <63.63%> (+2.56%)⬆️
lightning/src/ln/payment_tests.rs95.65% <100.00%> (+<0.01%)⬆️
lightning/src/sync/nostd_sync.rs37.50% <0.00%> (-5.00%)⬇️
... and 35 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@dunxen

Copy link
Copy Markdown
Contributor

Looks good for squash

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

Don't have much to add, just learned a lot about macros while trying to understand what this PR was doing.

One comprehension check: Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

@valentinewallace

Copy link
Copy Markdown
Contributor

Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

We're actually planning to get rid of PaymentPathFailed::retry, so seems it's mostly serializable for historical reasons or in case users want to store it for whatever reason. PaymentParameters definitely need to be serializable because it's serialized in ChannelManager

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from a4d85db to de3fab7CompareFebruary 22, 2023 23:07
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed fixups down.

valentinewallace
valentinewallace previously approved these changes Feb 22, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

valentinewallace
valentinewallace previously approved these changes Feb 27, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from d2307db to 28a94c1CompareFebruary 27, 2023 18:35
@valentinewallace

Copy link
Copy Markdown
Contributor

Some rebase errors need fixing sadly

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Sorry was waiting on #2055

When we read a `Route` (or a list of `RouteHop`s), we should never
have zero paths or zero `RouteHop`s in a path. As such, its fine to
simply reject these at deserialization-time. Technically this could
lead to something which we can generate not round-trip'ing
serialization, but that seems okay here.
This adds `required` support for trait-wrapped reading (e.g. for
objects read via `ReadableArgs`) as well as support for the
trait-wrapped reading syntax across the TLV struct/enum
serialization macros.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 28a94c1 to 280f087CompareFebruary 27, 2023 22:31
fbc0847 purported to "move" the
`final_cltv_expiry_delta` field to `PaymentParamters` from
`RouteParameters`. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in `PaymentParameters`.
It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every `PaymentParameters` while deserializing.
We do this here - making `PaymentParameters` a `ReadableArgs`
taking a "default" `cltv_expiry_delta` when it goes to read. This
allows existing `RouteParameters` objects to pass the read
`final_cltv_expiry_delta` field in to be used if the new field
wasn't present.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 280f087 to f03b7cdCompareFebruary 27, 2023 22:33
@dunxen

Copy link
Copy Markdown
Contributor

Phew. What a rebase rally! :P

@dunxendunxen removed their assignment Feb 28, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Heh, it wasn't that important compared to the things it conflicted with 🤷‍♂️

@TheBlueMatt
TheBlueMatt merged commit b8bea74 into lightningdevkit:mainFeb 28, 2023
@valentinewallacevalentinewallace mentioned this pull request Mar 3, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@valentinewallace@dunxen@codecov-commenter@naumenkogs@alecchendev
, '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" + ' Remove the final_cltv_expiry_delta in RouteParameters entirely by TheBlueMatt · Pull Request #2015 · lightningdevkit/rust-lightning · GitHub
Skip to content

Remove the final_cltv_expiry_delta in RouteParameters entirely - #2015

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields
Feb 28, 2023
Merged

Remove the final_cltv_expiry_delta in RouteParameters entirely#2015
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

fbc0847 purported to "move" the
final_cltv_expiry_delta field to PaymentParamters from
RouteParameters. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in PaymentParameters.

It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every PaymentParameters while deserializing.

We do this here - making PaymentParameters a ReadableArgs
taking a "default" cltv_expiry_delta when it goes to read. This
allows existing RouteParameters objects to pass the read
final_cltv_expiry_delta field in to be used if the new field
wasn't present.

Sadly, if we want to do this, we have to do it in the same release as the above commit, so it has to land for 114 :(

@TheBlueMattTheBlueMatt added this to the 0.0.114 milestone Feb 6, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch 2 times, most recently from f106a82 to 76a1530CompareFebruary 16, 2023 01:04
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@dunxen

dunxen commented Feb 20, 2023

Copy link
Copy Markdown
Contributor

Looks like fuzz stuff needs updating

diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 9b3b76c2..3d9be984 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -513,7 +513,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
@@ -537,7 +536,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
diff --git a/fuzz/src/router.rs b/fuzz/src/router.rs
index a7c50de4..66d68040 100644
--- a/fuzz/src/router.rs+++ b/fuzz/src/router.rs@@ -302,7 +302,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
payment_params: PaymentParameters::from_node_id(*target, final_cltv_expiry_delta)
.with_route_hints(last_hops.clone()),
final_value_msat,
- final_cltv_expiry_delta,
};
let _ = find_route(&our_pubkey, &route_params, &net_graph,
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),

@dunxendunxen self-assigned this Feb 20, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 76a1530 to 1e1cb91CompareFebruary 21, 2023 17:09
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, thanks. Also rebased.

Comment threadlightning/src/routing/router.rs Outdated
(9, final_cltv_expiry_delta, (default_value, default_final_cltv_expiry_delta)),
});
Ok(Self {
payee_pubkey: payee_pubkey.0.unwrap(),

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.

Wouldn't it provide better compile-time checks to use _init_tlv_based_struct_field ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, I guess, I mean it currently does this but I agree if we ever change it we don't want this to blow up.

Comment threadlightning/src/routing/router.rs
pub final_cltv_expiry_delta: u32,
}

impl Writeable for PaymentParameters {

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 not keep using the macro but default to 0 (or MIN_CLTV_EXPIRY_DELTA), so the field can be set by higher-level reads? Do we expect users to be serializing this struct?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114, we want to make sure the final_cltv_expiry_delta parameter moves over to the right place. Because its a given parameter I dont think we want to just assume its some specific value.

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.

Hmm, if we kept PayParams using the ser macro with a default value, RouteParams deser would always ensure it sets the correct value, though. I see why we need to break out of the macro for RouteParams, but just not sure I understand why we need to break out for PaymentParams.

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114

+ retries on restart aren't supported in 114 (do you mean using send_payment?).

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The value read from the old field in RouteParameters needs to make it into the PaymentParameters somehow on read, I'm not sure how we do that without breaking up the macro as well?

  • retries on restart aren't supported in 114 (do you mean using send_payment?).

Right, I guess I mean if you're using the PaymentPathFailed data to retry? I guess it borderline doesn't matter but it does feel weird to synthesize the wrong value in the serialized event.

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.

We wouldn't be synthesizing the wrong value, though, IIUC. Shouldn't this code in RouteParams deser cover this case, if they do want to use PaymentPathFailed::retry?

 let mut payment_params: PaymentParameters = payment_params.0.unwrap();
if payment_params.final_cltv_expiry_delta == 0 {
payment_params.final_cltv_expiry_delta = final_cltv_expiry_delta.0.unwrap();
}

Another thought could be removing retry entirely, which we want to do at some point anyway, maybe even more ser complexity introduced there though.

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.

Anyway, we may be talking past each other, and it doesn't matter that much though the broken-up macro is somewhat ugly, so I won't die on this hill :)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Ah, okay, I indeed didn't understand your suggestion here - yes, I think all the places we read a RouteParameters in LDK we are happy with the special-case of 0 for min_final_cltv_delta being treated as "no value" and overwriting it. However, that's...weird in a public API? Like, there's an implicit Option, there, basically, and we can't have an actual Option there because the router can't deal with it. So I'd kinda rather force the caller to pass the value in via the ReadableArgs implementation rather than have an implicit Option?

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.

Yeah, just seems unlikely this struct would ever be serialized on its own, even if it's technically possible. Fine to leave as-is

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

LGTM

Comment threadlightning/src/routing/router.rs
@codecov-commenter

codecov-commenter commented Feb 22, 2023

Copy link
Copy Markdown

Codecov Report

Base: 87.26% // Head: 87.42% // Increases project coverage by +0.15% 🎉

Coverage data is based on head (a4d85db) compared to base (16b3c72).
Patch coverage: 58.00% of modified lines in pull request are covered.

❗ Current head a4d85db differs from pull request most recent head f03b7cd. Consider uploading reports for the commit f03b7cd to get more accurate results

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2015 +/- ##
==========================================
+ Coverage 87.26% 87.42% +0.15% 
==========================================
Files 101 101 Lines 44414 47347 +2933 Branches 44414 47347 +2933 ==========================================
+ Hits 38759 41394 +2635 - Misses 5655 5953 +298 
Impacted FilesCoverage Δ
lightning-invoice/src/payment.rs75.78% <ø> (+0.03%)⬆️
lightning-invoice/src/utils.rs96.14% <ø> (ø)
lightning/src/ln/functional_tests.rs97.33% <ø> (+0.04%)⬆️
lightning/src/ln/outbound_payment.rs80.56% <ø> (+1.49%)⬆️
lightning/src/util/ser.rs82.92% <0.00%> (-1.80%)⬇️
lightning/src/util/ser_macros.rs92.69% <ø> (ø)
lightning/src/routing/router.rs92.24% <56.25%> (-0.54%)⬇️
lightning/src/ln/channelmanager.rs89.10% <63.63%> (+2.56%)⬆️
lightning/src/ln/payment_tests.rs95.65% <100.00%> (+<0.01%)⬆️
lightning/src/sync/nostd_sync.rs37.50% <0.00%> (-5.00%)⬇️
... and 35 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@dunxen

Copy link
Copy Markdown
Contributor

Looks good for squash

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

Don't have much to add, just learned a lot about macros while trying to understand what this PR was doing.

One comprehension check: Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

@valentinewallace

Copy link
Copy Markdown
Contributor

Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

We're actually planning to get rid of PaymentPathFailed::retry, so seems it's mostly serializable for historical reasons or in case users want to store it for whatever reason. PaymentParameters definitely need to be serializable because it's serialized in ChannelManager

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from a4d85db to de3fab7CompareFebruary 22, 2023 23:07
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed fixups down.

valentinewallace
valentinewallace previously approved these changes Feb 22, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

valentinewallace
valentinewallace previously approved these changes Feb 27, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from d2307db to 28a94c1CompareFebruary 27, 2023 18:35
@valentinewallace

Copy link
Copy Markdown
Contributor

Some rebase errors need fixing sadly

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Sorry was waiting on #2055

When we read a `Route` (or a list of `RouteHop`s), we should never
have zero paths or zero `RouteHop`s in a path. As such, its fine to
simply reject these at deserialization-time. Technically this could
lead to something which we can generate not round-trip'ing
serialization, but that seems okay here.
This adds `required` support for trait-wrapped reading (e.g. for
objects read via `ReadableArgs`) as well as support for the
trait-wrapped reading syntax across the TLV struct/enum
serialization macros.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 28a94c1 to 280f087CompareFebruary 27, 2023 22:31
fbc0847 purported to "move" the
`final_cltv_expiry_delta` field to `PaymentParamters` from
`RouteParameters`. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in `PaymentParameters`.
It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every `PaymentParameters` while deserializing.
We do this here - making `PaymentParameters` a `ReadableArgs`
taking a "default" `cltv_expiry_delta` when it goes to read. This
allows existing `RouteParameters` objects to pass the read
`final_cltv_expiry_delta` field in to be used if the new field
wasn't present.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 280f087 to f03b7cdCompareFebruary 27, 2023 22:33
@dunxen

Copy link
Copy Markdown
Contributor

Phew. What a rebase rally! :P

@dunxendunxen removed their assignment Feb 28, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Heh, it wasn't that important compared to the things it conflicted with 🤷‍♂️

@TheBlueMatt
TheBlueMatt merged commit b8bea74 into lightningdevkit:mainFeb 28, 2023
@valentinewallacevalentinewallace mentioned this pull request Mar 3, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@valentinewallace@dunxen@codecov-commenter@naumenkogs@alecchendev
, '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('^' + ".*" + ' Remove the final_cltv_expiry_delta in RouteParameters entirely by TheBlueMatt · Pull Request #2015 · lightningdevkit/rust-lightning · GitHub
Skip to content

Remove the final_cltv_expiry_delta in RouteParameters entirely - #2015

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields
Feb 28, 2023
Merged

Remove the final_cltv_expiry_delta in RouteParameters entirely#2015
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

fbc0847 purported to "move" the
final_cltv_expiry_delta field to PaymentParamters from
RouteParameters. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in PaymentParameters.

It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every PaymentParameters while deserializing.

We do this here - making PaymentParameters a ReadableArgs
taking a "default" cltv_expiry_delta when it goes to read. This
allows existing RouteParameters objects to pass the read
final_cltv_expiry_delta field in to be used if the new field
wasn't present.

Sadly, if we want to do this, we have to do it in the same release as the above commit, so it has to land for 114 :(

@TheBlueMattTheBlueMatt added this to the 0.0.114 milestone Feb 6, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch 2 times, most recently from f106a82 to 76a1530CompareFebruary 16, 2023 01:04
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@dunxen

dunxen commented Feb 20, 2023

Copy link
Copy Markdown
Contributor

Looks like fuzz stuff needs updating

diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 9b3b76c2..3d9be984 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -513,7 +513,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
@@ -537,7 +536,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
diff --git a/fuzz/src/router.rs b/fuzz/src/router.rs
index a7c50de4..66d68040 100644
--- a/fuzz/src/router.rs+++ b/fuzz/src/router.rs@@ -302,7 +302,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
payment_params: PaymentParameters::from_node_id(*target, final_cltv_expiry_delta)
.with_route_hints(last_hops.clone()),
final_value_msat,
- final_cltv_expiry_delta,
};
let _ = find_route(&our_pubkey, &route_params, &net_graph,
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),

@dunxendunxen self-assigned this Feb 20, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 76a1530 to 1e1cb91CompareFebruary 21, 2023 17:09
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, thanks. Also rebased.

Comment threadlightning/src/routing/router.rs Outdated
(9, final_cltv_expiry_delta, (default_value, default_final_cltv_expiry_delta)),
});
Ok(Self {
payee_pubkey: payee_pubkey.0.unwrap(),

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.

Wouldn't it provide better compile-time checks to use _init_tlv_based_struct_field ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, I guess, I mean it currently does this but I agree if we ever change it we don't want this to blow up.

Comment threadlightning/src/routing/router.rs
pub final_cltv_expiry_delta: u32,
}

impl Writeable for PaymentParameters {

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 not keep using the macro but default to 0 (or MIN_CLTV_EXPIRY_DELTA), so the field can be set by higher-level reads? Do we expect users to be serializing this struct?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114, we want to make sure the final_cltv_expiry_delta parameter moves over to the right place. Because its a given parameter I dont think we want to just assume its some specific value.

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.

Hmm, if we kept PayParams using the ser macro with a default value, RouteParams deser would always ensure it sets the correct value, though. I see why we need to break out of the macro for RouteParams, but just not sure I understand why we need to break out for PaymentParams.

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114

+ retries on restart aren't supported in 114 (do you mean using send_payment?).

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The value read from the old field in RouteParameters needs to make it into the PaymentParameters somehow on read, I'm not sure how we do that without breaking up the macro as well?

  • retries on restart aren't supported in 114 (do you mean using send_payment?).

Right, I guess I mean if you're using the PaymentPathFailed data to retry? I guess it borderline doesn't matter but it does feel weird to synthesize the wrong value in the serialized event.

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.

We wouldn't be synthesizing the wrong value, though, IIUC. Shouldn't this code in RouteParams deser cover this case, if they do want to use PaymentPathFailed::retry?

 let mut payment_params: PaymentParameters = payment_params.0.unwrap();
if payment_params.final_cltv_expiry_delta == 0 {
payment_params.final_cltv_expiry_delta = final_cltv_expiry_delta.0.unwrap();
}

Another thought could be removing retry entirely, which we want to do at some point anyway, maybe even more ser complexity introduced there though.

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.

Anyway, we may be talking past each other, and it doesn't matter that much though the broken-up macro is somewhat ugly, so I won't die on this hill :)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Ah, okay, I indeed didn't understand your suggestion here - yes, I think all the places we read a RouteParameters in LDK we are happy with the special-case of 0 for min_final_cltv_delta being treated as "no value" and overwriting it. However, that's...weird in a public API? Like, there's an implicit Option, there, basically, and we can't have an actual Option there because the router can't deal with it. So I'd kinda rather force the caller to pass the value in via the ReadableArgs implementation rather than have an implicit Option?

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.

Yeah, just seems unlikely this struct would ever be serialized on its own, even if it's technically possible. Fine to leave as-is

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

LGTM

Comment threadlightning/src/routing/router.rs
@codecov-commenter

codecov-commenter commented Feb 22, 2023

Copy link
Copy Markdown

Codecov Report

Base: 87.26% // Head: 87.42% // Increases project coverage by +0.15% 🎉

Coverage data is based on head (a4d85db) compared to base (16b3c72).
Patch coverage: 58.00% of modified lines in pull request are covered.

❗ Current head a4d85db differs from pull request most recent head f03b7cd. Consider uploading reports for the commit f03b7cd to get more accurate results

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2015 +/- ##
==========================================
+ Coverage 87.26% 87.42% +0.15% 
==========================================
Files 101 101 Lines 44414 47347 +2933 Branches 44414 47347 +2933 ==========================================
+ Hits 38759 41394 +2635 - Misses 5655 5953 +298 
Impacted FilesCoverage Δ
lightning-invoice/src/payment.rs75.78% <ø> (+0.03%)⬆️
lightning-invoice/src/utils.rs96.14% <ø> (ø)
lightning/src/ln/functional_tests.rs97.33% <ø> (+0.04%)⬆️
lightning/src/ln/outbound_payment.rs80.56% <ø> (+1.49%)⬆️
lightning/src/util/ser.rs82.92% <0.00%> (-1.80%)⬇️
lightning/src/util/ser_macros.rs92.69% <ø> (ø)
lightning/src/routing/router.rs92.24% <56.25%> (-0.54%)⬇️
lightning/src/ln/channelmanager.rs89.10% <63.63%> (+2.56%)⬆️
lightning/src/ln/payment_tests.rs95.65% <100.00%> (+<0.01%)⬆️
lightning/src/sync/nostd_sync.rs37.50% <0.00%> (-5.00%)⬇️
... and 35 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@dunxen

Copy link
Copy Markdown
Contributor

Looks good for squash

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

Don't have much to add, just learned a lot about macros while trying to understand what this PR was doing.

One comprehension check: Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

@valentinewallace

Copy link
Copy Markdown
Contributor

Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

We're actually planning to get rid of PaymentPathFailed::retry, so seems it's mostly serializable for historical reasons or in case users want to store it for whatever reason. PaymentParameters definitely need to be serializable because it's serialized in ChannelManager

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from a4d85db to de3fab7CompareFebruary 22, 2023 23:07
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed fixups down.

valentinewallace
valentinewallace previously approved these changes Feb 22, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

valentinewallace
valentinewallace previously approved these changes Feb 27, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from d2307db to 28a94c1CompareFebruary 27, 2023 18:35
@valentinewallace

Copy link
Copy Markdown
Contributor

Some rebase errors need fixing sadly

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Sorry was waiting on #2055

When we read a `Route` (or a list of `RouteHop`s), we should never
have zero paths or zero `RouteHop`s in a path. As such, its fine to
simply reject these at deserialization-time. Technically this could
lead to something which we can generate not round-trip'ing
serialization, but that seems okay here.
This adds `required` support for trait-wrapped reading (e.g. for
objects read via `ReadableArgs`) as well as support for the
trait-wrapped reading syntax across the TLV struct/enum
serialization macros.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 28a94c1 to 280f087CompareFebruary 27, 2023 22:31
fbc0847 purported to "move" the
`final_cltv_expiry_delta` field to `PaymentParamters` from
`RouteParameters`. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in `PaymentParameters`.
It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every `PaymentParameters` while deserializing.
We do this here - making `PaymentParameters` a `ReadableArgs`
taking a "default" `cltv_expiry_delta` when it goes to read. This
allows existing `RouteParameters` objects to pass the read
`final_cltv_expiry_delta` field in to be used if the new field
wasn't present.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 280f087 to f03b7cdCompareFebruary 27, 2023 22:33
@dunxen

Copy link
Copy Markdown
Contributor

Phew. What a rebase rally! :P

@dunxendunxen removed their assignment Feb 28, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Heh, it wasn't that important compared to the things it conflicted with 🤷‍♂️

@TheBlueMatt
TheBlueMatt merged commit b8bea74 into lightningdevkit:mainFeb 28, 2023
@valentinewallacevalentinewallace mentioned this pull request Mar 3, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@valentinewallace@dunxen@codecov-commenter@naumenkogs@alecchendev
, '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('^' + ".*" + ' Remove the final_cltv_expiry_delta in RouteParameters entirely by TheBlueMatt · Pull Request #2015 · lightningdevkit/rust-lightning · GitHub
Skip to content

Remove the final_cltv_expiry_delta in RouteParameters entirely - #2015

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields
Feb 28, 2023
Merged

Remove the final_cltv_expiry_delta in RouteParameters entirely#2015
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

fbc0847 purported to "move" the
final_cltv_expiry_delta field to PaymentParamters from
RouteParameters. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in PaymentParameters.

It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every PaymentParameters while deserializing.

We do this here - making PaymentParameters a ReadableArgs
taking a "default" cltv_expiry_delta when it goes to read. This
allows existing RouteParameters objects to pass the read
final_cltv_expiry_delta field in to be used if the new field
wasn't present.

Sadly, if we want to do this, we have to do it in the same release as the above commit, so it has to land for 114 :(

@TheBlueMattTheBlueMatt added this to the 0.0.114 milestone Feb 6, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch 2 times, most recently from f106a82 to 76a1530CompareFebruary 16, 2023 01:04
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@dunxen

dunxen commented Feb 20, 2023

Copy link
Copy Markdown
Contributor

Looks like fuzz stuff needs updating

diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 9b3b76c2..3d9be984 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -513,7 +513,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
@@ -537,7 +536,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
diff --git a/fuzz/src/router.rs b/fuzz/src/router.rs
index a7c50de4..66d68040 100644
--- a/fuzz/src/router.rs+++ b/fuzz/src/router.rs@@ -302,7 +302,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
payment_params: PaymentParameters::from_node_id(*target, final_cltv_expiry_delta)
.with_route_hints(last_hops.clone()),
final_value_msat,
- final_cltv_expiry_delta,
};
let _ = find_route(&our_pubkey, &route_params, &net_graph,
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),

@dunxendunxen self-assigned this Feb 20, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 76a1530 to 1e1cb91CompareFebruary 21, 2023 17:09
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, thanks. Also rebased.

Comment threadlightning/src/routing/router.rs Outdated
(9, final_cltv_expiry_delta, (default_value, default_final_cltv_expiry_delta)),
});
Ok(Self {
payee_pubkey: payee_pubkey.0.unwrap(),

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.

Wouldn't it provide better compile-time checks to use _init_tlv_based_struct_field ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, I guess, I mean it currently does this but I agree if we ever change it we don't want this to blow up.

Comment threadlightning/src/routing/router.rs
pub final_cltv_expiry_delta: u32,
}

impl Writeable for PaymentParameters {

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 not keep using the macro but default to 0 (or MIN_CLTV_EXPIRY_DELTA), so the field can be set by higher-level reads? Do we expect users to be serializing this struct?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114, we want to make sure the final_cltv_expiry_delta parameter moves over to the right place. Because its a given parameter I dont think we want to just assume its some specific value.

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.

Hmm, if we kept PayParams using the ser macro with a default value, RouteParams deser would always ensure it sets the correct value, though. I see why we need to break out of the macro for RouteParams, but just not sure I understand why we need to break out for PaymentParams.

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114

+ retries on restart aren't supported in 114 (do you mean using send_payment?).

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The value read from the old field in RouteParameters needs to make it into the PaymentParameters somehow on read, I'm not sure how we do that without breaking up the macro as well?

  • retries on restart aren't supported in 114 (do you mean using send_payment?).

Right, I guess I mean if you're using the PaymentPathFailed data to retry? I guess it borderline doesn't matter but it does feel weird to synthesize the wrong value in the serialized event.

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.

We wouldn't be synthesizing the wrong value, though, IIUC. Shouldn't this code in RouteParams deser cover this case, if they do want to use PaymentPathFailed::retry?

 let mut payment_params: PaymentParameters = payment_params.0.unwrap();
if payment_params.final_cltv_expiry_delta == 0 {
payment_params.final_cltv_expiry_delta = final_cltv_expiry_delta.0.unwrap();
}

Another thought could be removing retry entirely, which we want to do at some point anyway, maybe even more ser complexity introduced there though.

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.

Anyway, we may be talking past each other, and it doesn't matter that much though the broken-up macro is somewhat ugly, so I won't die on this hill :)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Ah, okay, I indeed didn't understand your suggestion here - yes, I think all the places we read a RouteParameters in LDK we are happy with the special-case of 0 for min_final_cltv_delta being treated as "no value" and overwriting it. However, that's...weird in a public API? Like, there's an implicit Option, there, basically, and we can't have an actual Option there because the router can't deal with it. So I'd kinda rather force the caller to pass the value in via the ReadableArgs implementation rather than have an implicit Option?

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.

Yeah, just seems unlikely this struct would ever be serialized on its own, even if it's technically possible. Fine to leave as-is

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

LGTM

Comment threadlightning/src/routing/router.rs
@codecov-commenter

codecov-commenter commented Feb 22, 2023

Copy link
Copy Markdown

Codecov Report

Base: 87.26% // Head: 87.42% // Increases project coverage by +0.15% 🎉

Coverage data is based on head (a4d85db) compared to base (16b3c72).
Patch coverage: 58.00% of modified lines in pull request are covered.

❗ Current head a4d85db differs from pull request most recent head f03b7cd. Consider uploading reports for the commit f03b7cd to get more accurate results

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2015 +/- ##
==========================================
+ Coverage 87.26% 87.42% +0.15% 
==========================================
Files 101 101 Lines 44414 47347 +2933 Branches 44414 47347 +2933 ==========================================
+ Hits 38759 41394 +2635 - Misses 5655 5953 +298 
Impacted FilesCoverage Δ
lightning-invoice/src/payment.rs75.78% <ø> (+0.03%)⬆️
lightning-invoice/src/utils.rs96.14% <ø> (ø)
lightning/src/ln/functional_tests.rs97.33% <ø> (+0.04%)⬆️
lightning/src/ln/outbound_payment.rs80.56% <ø> (+1.49%)⬆️
lightning/src/util/ser.rs82.92% <0.00%> (-1.80%)⬇️
lightning/src/util/ser_macros.rs92.69% <ø> (ø)
lightning/src/routing/router.rs92.24% <56.25%> (-0.54%)⬇️
lightning/src/ln/channelmanager.rs89.10% <63.63%> (+2.56%)⬆️
lightning/src/ln/payment_tests.rs95.65% <100.00%> (+<0.01%)⬆️
lightning/src/sync/nostd_sync.rs37.50% <0.00%> (-5.00%)⬇️
... and 35 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@dunxen

Copy link
Copy Markdown
Contributor

Looks good for squash

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

Don't have much to add, just learned a lot about macros while trying to understand what this PR was doing.

One comprehension check: Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

@valentinewallace

Copy link
Copy Markdown
Contributor

Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

We're actually planning to get rid of PaymentPathFailed::retry, so seems it's mostly serializable for historical reasons or in case users want to store it for whatever reason. PaymentParameters definitely need to be serializable because it's serialized in ChannelManager

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from a4d85db to de3fab7CompareFebruary 22, 2023 23:07
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed fixups down.

valentinewallace
valentinewallace previously approved these changes Feb 22, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

valentinewallace
valentinewallace previously approved these changes Feb 27, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from d2307db to 28a94c1CompareFebruary 27, 2023 18:35
@valentinewallace

Copy link
Copy Markdown
Contributor

Some rebase errors need fixing sadly

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Sorry was waiting on #2055

When we read a `Route` (or a list of `RouteHop`s), we should never
have zero paths or zero `RouteHop`s in a path. As such, its fine to
simply reject these at deserialization-time. Technically this could
lead to something which we can generate not round-trip'ing
serialization, but that seems okay here.
This adds `required` support for trait-wrapped reading (e.g. for
objects read via `ReadableArgs`) as well as support for the
trait-wrapped reading syntax across the TLV struct/enum
serialization macros.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 28a94c1 to 280f087CompareFebruary 27, 2023 22:31
fbc0847 purported to "move" the
`final_cltv_expiry_delta` field to `PaymentParamters` from
`RouteParameters`. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in `PaymentParameters`.
It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every `PaymentParameters` while deserializing.
We do this here - making `PaymentParameters` a `ReadableArgs`
taking a "default" `cltv_expiry_delta` when it goes to read. This
allows existing `RouteParameters` objects to pass the read
`final_cltv_expiry_delta` field in to be used if the new field
wasn't present.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 280f087 to f03b7cdCompareFebruary 27, 2023 22:33
@dunxen

Copy link
Copy Markdown
Contributor

Phew. What a rebase rally! :P

@dunxendunxen removed their assignment Feb 28, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Heh, it wasn't that important compared to the things it conflicted with 🤷‍♂️

@TheBlueMatt
TheBlueMatt merged commit b8bea74 into lightningdevkit:mainFeb 28, 2023
@valentinewallacevalentinewallace mentioned this pull request Mar 3, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@valentinewallace@dunxen@codecov-commenter@naumenkogs@alecchendev
, '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); } })(); })(); Remove the final_cltv_expiry_delta in RouteParameters entirely by TheBlueMatt · Pull Request #2015 · lightningdevkit/rust-lightning · GitHub
Skip to content

Remove the final_cltv_expiry_delta in RouteParameters entirely - #2015

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields
Feb 28, 2023
Merged

Remove the final_cltv_expiry_delta in RouteParameters entirely#2015
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-02-no-dumb-redundant-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

fbc0847 purported to "move" the
final_cltv_expiry_delta field to PaymentParamters from
RouteParameters. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in PaymentParameters.

It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every PaymentParameters while deserializing.

We do this here - making PaymentParameters a ReadableArgs
taking a "default" cltv_expiry_delta when it goes to read. This
allows existing RouteParameters objects to pass the read
final_cltv_expiry_delta field in to be used if the new field
wasn't present.

Sadly, if we want to do this, we have to do it in the same release as the above commit, so it has to land for 114 :(

@TheBlueMattTheBlueMatt added this to the 0.0.114 milestone Feb 6, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch 2 times, most recently from f106a82 to 76a1530CompareFebruary 16, 2023 01:04
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@dunxen

dunxen commented Feb 20, 2023

Copy link
Copy Markdown
Contributor

Looks like fuzz stuff needs updating

diff --git a/fuzz/src/full_stack.rs b/fuzz/src/full_stack.rs
index 9b3b76c2..3d9be984 100644
--- a/fuzz/src/full_stack.rs+++ b/fuzz/src/full_stack.rs@@ -513,7 +513,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
@@ -537,7 +536,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
- final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
diff --git a/fuzz/src/router.rs b/fuzz/src/router.rs
index a7c50de4..66d68040 100644
--- a/fuzz/src/router.rs+++ b/fuzz/src/router.rs@@ -302,7 +302,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
payment_params: PaymentParameters::from_node_id(*target, final_cltv_expiry_delta)
.with_route_hints(last_hops.clone()),
final_value_msat,
- final_cltv_expiry_delta,
};
let _ = find_route(&our_pubkey, &route_params, &net_graph,
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),

@dunxendunxen self-assigned this Feb 20, 2023
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 76a1530 to 1e1cb91CompareFebruary 21, 2023 17:09
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Oops, thanks. Also rebased.

Comment threadlightning/src/routing/router.rs Outdated
(9, final_cltv_expiry_delta, (default_value, default_final_cltv_expiry_delta)),
});
Ok(Self {
payee_pubkey: payee_pubkey.0.unwrap(),

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.

Wouldn't it provide better compile-time checks to use _init_tlv_based_struct_field ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, I guess, I mean it currently does this but I agree if we ever change it we don't want this to blow up.

Comment threadlightning/src/routing/router.rs
pub final_cltv_expiry_delta: u32,
}

impl Writeable for PaymentParameters {

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 not keep using the macro but default to 0 (or MIN_CLTV_EXPIRY_DELTA), so the field can be set by higher-level reads? Do we expect users to be serializing this struct?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114, we want to make sure the final_cltv_expiry_delta parameter moves over to the right place. Because its a given parameter I dont think we want to just assume its some specific value.

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.

Hmm, if we kept PayParams using the ser macro with a default value, RouteParams deser would always ensure it sets the correct value, though. I see why we need to break out of the macro for RouteParams, but just not sure I understand why we need to break out for PaymentParams.

If a user has a RouteParameters serialized in 113, eg because of a payment failure, and they retry it on restart in 114

+ retries on restart aren't supported in 114 (do you mean using send_payment?).

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The value read from the old field in RouteParameters needs to make it into the PaymentParameters somehow on read, I'm not sure how we do that without breaking up the macro as well?

  • retries on restart aren't supported in 114 (do you mean using send_payment?).

Right, I guess I mean if you're using the PaymentPathFailed data to retry? I guess it borderline doesn't matter but it does feel weird to synthesize the wrong value in the serialized event.

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.

We wouldn't be synthesizing the wrong value, though, IIUC. Shouldn't this code in RouteParams deser cover this case, if they do want to use PaymentPathFailed::retry?

 let mut payment_params: PaymentParameters = payment_params.0.unwrap();
if payment_params.final_cltv_expiry_delta == 0 {
payment_params.final_cltv_expiry_delta = final_cltv_expiry_delta.0.unwrap();
}

Another thought could be removing retry entirely, which we want to do at some point anyway, maybe even more ser complexity introduced there though.

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.

Anyway, we may be talking past each other, and it doesn't matter that much though the broken-up macro is somewhat ugly, so I won't die on this hill :)

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Ah, okay, I indeed didn't understand your suggestion here - yes, I think all the places we read a RouteParameters in LDK we are happy with the special-case of 0 for min_final_cltv_delta being treated as "no value" and overwriting it. However, that's...weird in a public API? Like, there's an implicit Option, there, basically, and we can't have an actual Option there because the router can't deal with it. So I'd kinda rather force the caller to pass the value in via the ReadableArgs implementation rather than have an implicit Option?

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.

Yeah, just seems unlikely this struct would ever be serialized on its own, even if it's technically possible. Fine to leave as-is

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

LGTM

Comment threadlightning/src/routing/router.rs
@codecov-commenter

codecov-commenter commented Feb 22, 2023

Copy link
Copy Markdown

Codecov Report

Base: 87.26% // Head: 87.42% // Increases project coverage by +0.15% 🎉

Coverage data is based on head (a4d85db) compared to base (16b3c72).
Patch coverage: 58.00% of modified lines in pull request are covered.

❗ Current head a4d85db differs from pull request most recent head f03b7cd. Consider uploading reports for the commit f03b7cd to get more accurate results

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

Additional details and impacted files
@@ Coverage Diff @@## main #2015 +/- ##
==========================================
+ Coverage 87.26% 87.42% +0.15% 
==========================================
Files 101 101 Lines 44414 47347 +2933 Branches 44414 47347 +2933 ==========================================
+ Hits 38759 41394 +2635 - Misses 5655 5953 +298 
Impacted FilesCoverage Δ
lightning-invoice/src/payment.rs75.78% <ø> (+0.03%)⬆️
lightning-invoice/src/utils.rs96.14% <ø> (ø)
lightning/src/ln/functional_tests.rs97.33% <ø> (+0.04%)⬆️
lightning/src/ln/outbound_payment.rs80.56% <ø> (+1.49%)⬆️
lightning/src/util/ser.rs82.92% <0.00%> (-1.80%)⬇️
lightning/src/util/ser_macros.rs92.69% <ø> (ø)
lightning/src/routing/router.rs92.24% <56.25%> (-0.54%)⬇️
lightning/src/ln/channelmanager.rs89.10% <63.63%> (+2.56%)⬆️
lightning/src/ln/payment_tests.rs95.65% <100.00%> (+<0.01%)⬆️
lightning/src/sync/nostd_sync.rs37.50% <0.00%> (-5.00%)⬇️
... and 35 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@dunxen

Copy link
Copy Markdown
Contributor

Looks good for squash

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

Don't have much to add, just learned a lot about macros while trying to understand what this PR was doing.

One comprehension check: Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

@valentinewallace

Copy link
Copy Markdown
Contributor

Is the main reason that RouteParameters even needs to be serializable in the first place because it's included in Event::PaymentFailed which may be persisted (because a user would want to respond to the event after a crash)?

We're actually planning to get rid of PaymentPathFailed::retry, so seems it's mostly serializable for historical reasons or in case users want to store it for whatever reason. PaymentParameters definitely need to be serializable because it's serialized in ChannelManager

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from a4d85db to de3fab7CompareFebruary 22, 2023 23:07
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed fixups down.

valentinewallace
valentinewallace previously approved these changes Feb 22, 2023
@valentinewallace

Copy link
Copy Markdown
Contributor

Needs rebase

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

valentinewallace
valentinewallace previously approved these changes Feb 27, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased.

@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from d2307db to 28a94c1CompareFebruary 27, 2023 18:35
@valentinewallace

Copy link
Copy Markdown
Contributor

Some rebase errors need fixing sadly

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Sorry was waiting on #2055

When we read a `Route` (or a list of `RouteHop`s), we should never
have zero paths or zero `RouteHop`s in a path. As such, its fine to
simply reject these at deserialization-time. Technically this could
lead to something which we can generate not round-trip'ing
serialization, but that seems okay here.
This adds `required` support for trait-wrapped reading (e.g. for
objects read via `ReadableArgs`) as well as support for the
trait-wrapped reading syntax across the TLV struct/enum
serialization macros.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 28a94c1 to 280f087CompareFebruary 27, 2023 22:31
fbc0847 purported to "move" the
`final_cltv_expiry_delta` field to `PaymentParamters` from
`RouteParameters`. However, for naive backwards-compatibility
reasons it left the existing on in place and only added a new,
redundant field in `PaymentParameters`.
It turns out there's really no reason for this - if we take a more
critical eye towards backwards compatibility we can figure out the
correct value in every `PaymentParameters` while deserializing.
We do this here - making `PaymentParameters` a `ReadableArgs`
taking a "default" `cltv_expiry_delta` when it goes to read. This
allows existing `RouteParameters` objects to pass the read
`final_cltv_expiry_delta` field in to be used if the new field
wasn't present.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-02-no-dumb-redundant-fields branch from 280f087 to f03b7cdCompareFebruary 27, 2023 22:33
@dunxen

Copy link
Copy Markdown
Contributor

Phew. What a rebase rally! :P

@dunxendunxen removed their assignment Feb 28, 2023
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Heh, it wasn't that important compared to the things it conflicted with 🤷‍♂️

@TheBlueMatt
TheBlueMatt merged commit b8bea74 into lightningdevkit:mainFeb 28, 2023
@valentinewallacevalentinewallace mentioned this pull request Mar 3, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@TheBlueMatt@valentinewallace@dunxen@codecov-commenter@naumenkogs@alecchendev