-
Notifications
You must be signed in to change notification settings - Fork 402
Replace PublicKey with [u8; 33] in NetworkGraph #1107
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Replace PublicKey with [u8; 33] in NetworkGraph #1107
Conversation
Going to take this out of draft once I've fixed the linting and fuzzing. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is awesome, excited to see benchmark results once bench compiles :)
e60d06f
to
01e67a4
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice, current bench shows a pretty substantial gain in read_network_graph
(1.7 seconds to 1.1 seconds on GH Actions) but a very substantial regression in route performance (89ms to 500ms on GH Actions), I believe due to calls to serialize
or from_slice
in the tight inner loop, see comment.
I'm also going to minimise |
01e67a4
to
c36d6e7
Compare
Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare Edit: Sort of wrong assumption here. It works on 1.47. Rust versions 1.51 and later just use const generics. Would have worked if these were Schnorr pubkeys lol. I'll provide the impl for [T; 33], then I'll promote the PR from draft to ready. Edit 2: Darn, doesn't seem like I can do this until rust-lang/rust#31844 anyway. And I'm not sure if we'd manage to do it via conditional compilation. |
Just comparing here
vs c36d6e7
The write performance is not a huge improvement (expected this probably) but read and routes are nice. |
I think the way to do this is to replace |
The rest of the patch looks good, I think. |
c36d6e7
to
2a3c25a
Compare
Codecov Report
@@ Coverage Diff @@
## main #1107 +/- ##
==========================================
- Coverage 90.67% 90.65% -0.02%
==========================================
Files 66 65 -1
Lines 34608 34621 +13
==========================================
+ Hits 31381 31387 +6
- Misses 3227 3234 +7
Continue to review full report at Codecov.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Basically LGTM, note you'll have to squash for CI to pass.
The one time I forget to squash before pushing 🥲 |
bede58e
to
5e204d2
Compare
5e204d2
to
059bf1a
Compare
059bf1a
to
fce631c
Compare
@@ -4409,9 +4413,9 @@ mod tests { | |||
'load_endpoints: for _ in 0..10 { | |||
loop { | |||
seed = seed.overflowing_mul(0xdeadbeef).0; | |||
let src = nodes.keys().skip(seed % nodes.len()).next().unwrap(); | |||
let src = &PublicKey::from_slice(nodes.keys().skip(seed % nodes.len()).next().unwrap().as_slice()).unwrap(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about impl From<NodeId> for PublicKey
(and vice-versa)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I did consider that right after I pushed the last change. It'll clean things up quite a bit, I agree 🙂
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't believe we can implement From
for a struct outside our crate. There's a workaround with using a tuple struct wrapping the PublicKey
. But also note that the conversion functions consume the struct being converted, so in many cases we'd have to make a copy since we only have a reference, which I think we'd want to avoid.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We also can't implement From<NodeId> for PublicKey
because its not infallible, it'd have to be TryFrom, at which point its arguably a similar amount of code to read (and I strongly prefer to see from_slice
over try_from
, because its much more explicit for the same thing).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jkczyz since NodeId
is in this crate From<T> for NodeId
can always be implemented for any T
we want. Also since Rust 1.41 From<NodeId> for T
is possible. In older versions at least impl Into<T> for NodeId
.
Also From
and Into
can be implemented for references, so copying should be non-issue.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can leave it as is for now then?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there going to be a bump in MSRV soon or are we trying to avoid that? I agree things look fine as is right now but would be nice to be able to implement From
/ TryFrom
for external structs for maybe other things in future?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there going to be a bump in MSRV soon or are we trying to avoid that?
Unlikely - we generally try to ensure you can compile LDK using commonly-available Rust toolchains. Distros don't usually ship rust updates except when they have to (ie when a new Firefox ESR comes out and they have to bump to meet the Firefox MSRV).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Kixunil Happy to review any follow-ups if this is possible within our MSRV constraints.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't care much, just note that Debian oldstable contains Rust 1.41, which is sufficient to solve the From
issue. Debian Bullseye has 1.48 which can even support modern Tokio. Debian stable is probably the most conservative distro that's actually widely used, so doesn't seem too bad to me.
Closes #960