Skip to content

Replace PublicKey with [u8; 33] in NetworkGraph - #1107

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray
Oct 8, 2021
Merged

Replace PublicKey with [u8; 33] in NetworkGraph#1107
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray

Conversation

@dunxen

Copy link
Copy Markdown
Contributor

Closes#960

@dunxen
dunxen marked this pull request as draft October 5, 2021 06:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Going to take this out of draft once I've fixed the linting and fuzzing.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is awesome, excited to see benchmark results once bench compiles :)

Comment threadlightning-invoice/src/de.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from e60d06f to 01e67a4CompareOctober 5, 2021 20:49

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice, 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.

Comment threadlightning/src/routing/router.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

I believe due to calls to serialize or from_slice in the tight inner loop, see comment.

I'm also going to minimise serialize() in the rest of get_route() as much as possible.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 01e67a4 to c36d6e7CompareOctober 6, 2021 08:58
@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

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.

@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Just comparing here

#1079

test ln::channelmanager::bench::bench_sends ... bench: 7,765,229 ns/iter (+/- 1,232,859)
test routing::network_graph::benches::read_network_graph ... bench: 2,303,387,362 ns/iter (+/- 80,066,866)
test routing::network_graph::benches::write_network_graph ... bench: 152,065,789 ns/iter (+/- 7,420,318)
test routing::router::benches::generate_mpp_routes ... bench: 104,163,061 ns/iter (+/- 64,813,214)
test routing::router::benches::generate_routes ... bench: 97,599,490 ns/iter (+/- 69,822,412)

vs c36d6e7

test ln::channelmanager::bench::bench_sends ... bench: 7,565,717 ns/iter (+/- 1,752,280)
test routing::network_graph::benches::read_network_graph ... bench: 1,407,918,285 ns/iter (+/- 124,747,638)
test routing::network_graph::benches::write_network_graph ... bench: 134,930,617 ns/iter (+/- 10,801,383)
test routing::router::benches::generate_mpp_routes ... bench: 42,800,183 ns/iter (+/- 28,587,831)
test routing::router::benches::generate_routes ... bench: 42,839,538 ns/iter (+/- 33,412,245)

The write performance is not a huge improvement (expected this probably) but read and routes are nice.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

I think the way to do this is to replace NodeId type alias with pub struct NodeId([u8; 33]) and then you'll be able to impl core::cmp::PartialOrd for NodeId directly.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The rest of the patch looks good, I think.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from c36d6e7 to 2a3c25aCompareOctober 6, 2021 20:50
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxen marked this pull request as ready for review October 6, 2021 21:16
@codecov

codecovBot commented Oct 6, 2021

Copy link
Copy Markdown

Codecov Report

Merging #1107 (e9059e0) into main (6582aae) will decrease coverage by 0.01%.
The diff coverage is 82.75%.

❗ Current head e9059e0 differs from pull request most recent head fce631c. Consider uploading reports for the commit fce631c to get more accurate results
Impacted file tree graph

@@ 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 
Impacted FilesCoverage Δ
lightning/src/routing/network_graph.rs91.22% <74.50%> (-0.32%)⬇️
lightning/src/routing/router.rs96.04% <89.23%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs84.87% <0.00%> (-0.01%)⬇️
lightning/src/ln/mod.rs90.00% <0.00%> (ø)
lightning/src/ln/payment_tests.rs
lightning/src/ln/functional_tests.rs97.40% <0.00%> (+0.01%)⬆️

Continue to review full report at Codecov.

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

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Basically LGTM, note you'll have to squash for CI to pass.

Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Basically LGTM, note you'll have to squash for CI to pass.

The one time I forget to squash before pushing 🥲

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch 2 times, most recently from bede58e to 5e204d2CompareOctober 7, 2021 05:07
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 5e204d2 to 059bf1aCompareOctober 8, 2021 15:55
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 059bf1a to fce631cCompareOctober 8, 2021 16:38
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();

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.

How about impl From<NodeId> for PublicKey (and vice-versa)?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yeah, I did consider that right after I pushed the last change. It'll clean things up quite a bit, I agree 🙂

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.

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.

@TheBlueMattTheBlueMattOct 8, 2021

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think we can leave it as is for now then?

@dunxendunxenOct 8, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

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?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

@Kixunil Happy to review any follow-ups if this is possible within our MSRV constraints.

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.

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.

@TheBlueMatt
TheBlueMatt merged commit 843d25d into lightningdevkit:mainOct 8, 2021
@dunxen
dunxen deleted the 2021-10-swap-pubkey-for-bytearray branch October 9, 2021 06:14
@jkczyzjkczyz mentioned this pull request Apr 6, 2024
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.

Swap NetworkGraph PublicKeys for [u8; 33]

4 participants

@dunxen@TheBlueMatt@Kixunil@jkczyz
, '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" + '
Replace PublicKey with [u8; 33] in NetworkGraph by dunxen · Pull Request #1107 · lightningdevkit/rust-lightning · GitHub
Skip to content

Replace PublicKey with [u8; 33] in NetworkGraph - #1107

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray
Oct 8, 2021
Merged

Replace PublicKey with [u8; 33] in NetworkGraph#1107
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray

Conversation

@dunxen

Copy link
Copy Markdown
Contributor

Closes#960

@dunxen
dunxen marked this pull request as draft October 5, 2021 06:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Going to take this out of draft once I've fixed the linting and fuzzing.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is awesome, excited to see benchmark results once bench compiles :)

Comment threadlightning-invoice/src/de.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from e60d06f to 01e67a4CompareOctober 5, 2021 20:49

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice, 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.

Comment threadlightning/src/routing/router.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

I believe due to calls to serialize or from_slice in the tight inner loop, see comment.

I'm also going to minimise serialize() in the rest of get_route() as much as possible.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 01e67a4 to c36d6e7CompareOctober 6, 2021 08:58
@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

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.

@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Just comparing here

#1079

test ln::channelmanager::bench::bench_sends ... bench: 7,765,229 ns/iter (+/- 1,232,859)
test routing::network_graph::benches::read_network_graph ... bench: 2,303,387,362 ns/iter (+/- 80,066,866)
test routing::network_graph::benches::write_network_graph ... bench: 152,065,789 ns/iter (+/- 7,420,318)
test routing::router::benches::generate_mpp_routes ... bench: 104,163,061 ns/iter (+/- 64,813,214)
test routing::router::benches::generate_routes ... bench: 97,599,490 ns/iter (+/- 69,822,412)

vs c36d6e7

test ln::channelmanager::bench::bench_sends ... bench: 7,565,717 ns/iter (+/- 1,752,280)
test routing::network_graph::benches::read_network_graph ... bench: 1,407,918,285 ns/iter (+/- 124,747,638)
test routing::network_graph::benches::write_network_graph ... bench: 134,930,617 ns/iter (+/- 10,801,383)
test routing::router::benches::generate_mpp_routes ... bench: 42,800,183 ns/iter (+/- 28,587,831)
test routing::router::benches::generate_routes ... bench: 42,839,538 ns/iter (+/- 33,412,245)

The write performance is not a huge improvement (expected this probably) but read and routes are nice.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

I think the way to do this is to replace NodeId type alias with pub struct NodeId([u8; 33]) and then you'll be able to impl core::cmp::PartialOrd for NodeId directly.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The rest of the patch looks good, I think.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from c36d6e7 to 2a3c25aCompareOctober 6, 2021 20:50
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxen marked this pull request as ready for review October 6, 2021 21:16
@codecov

codecovBot commented Oct 6, 2021

Copy link
Copy Markdown

Codecov Report

Merging #1107 (e9059e0) into main (6582aae) will decrease coverage by 0.01%.
The diff coverage is 82.75%.

❗ Current head e9059e0 differs from pull request most recent head fce631c. Consider uploading reports for the commit fce631c to get more accurate results
Impacted file tree graph

@@ 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 
Impacted FilesCoverage Δ
lightning/src/routing/network_graph.rs91.22% <74.50%> (-0.32%)⬇️
lightning/src/routing/router.rs96.04% <89.23%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs84.87% <0.00%> (-0.01%)⬇️
lightning/src/ln/mod.rs90.00% <0.00%> (ø)
lightning/src/ln/payment_tests.rs
lightning/src/ln/functional_tests.rs97.40% <0.00%> (+0.01%)⬆️

Continue to review full report at Codecov.

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

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Basically LGTM, note you'll have to squash for CI to pass.

Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Basically LGTM, note you'll have to squash for CI to pass.

The one time I forget to squash before pushing 🥲

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch 2 times, most recently from bede58e to 5e204d2CompareOctober 7, 2021 05:07
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 5e204d2 to 059bf1aCompareOctober 8, 2021 15:55
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 059bf1a to fce631cCompareOctober 8, 2021 16:38
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();

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.

How about impl From<NodeId> for PublicKey (and vice-versa)?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yeah, I did consider that right after I pushed the last change. It'll clean things up quite a bit, I agree 🙂

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.

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.

@TheBlueMattTheBlueMattOct 8, 2021

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think we can leave it as is for now then?

@dunxendunxenOct 8, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

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?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

@Kixunil Happy to review any follow-ups if this is possible within our MSRV constraints.

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.

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.

@TheBlueMatt
TheBlueMatt merged commit 843d25d into lightningdevkit:mainOct 8, 2021
@dunxen
dunxen deleted the 2021-10-swap-pubkey-for-bytearray branch October 9, 2021 06:14
@jkczyzjkczyz mentioned this pull request Apr 6, 2024
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.

Swap NetworkGraph PublicKeys for [u8; 33]

4 participants

@dunxen@TheBlueMatt@Kixunil@jkczyz
, '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('^' + ".*" + ' Replace PublicKey with [u8; 33] in NetworkGraph by dunxen · Pull Request #1107 · lightningdevkit/rust-lightning · GitHub
Skip to content

Replace PublicKey with [u8; 33] in NetworkGraph - #1107

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray
Oct 8, 2021
Merged

Replace PublicKey with [u8; 33] in NetworkGraph#1107
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray

Conversation

@dunxen

Copy link
Copy Markdown
Contributor

Closes#960

@dunxen
dunxen marked this pull request as draft October 5, 2021 06:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Going to take this out of draft once I've fixed the linting and fuzzing.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is awesome, excited to see benchmark results once bench compiles :)

Comment threadlightning-invoice/src/de.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from e60d06f to 01e67a4CompareOctober 5, 2021 20:49

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice, 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.

Comment threadlightning/src/routing/router.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

I believe due to calls to serialize or from_slice in the tight inner loop, see comment.

I'm also going to minimise serialize() in the rest of get_route() as much as possible.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 01e67a4 to c36d6e7CompareOctober 6, 2021 08:58
@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

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.

@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Just comparing here

#1079

test ln::channelmanager::bench::bench_sends ... bench: 7,765,229 ns/iter (+/- 1,232,859)
test routing::network_graph::benches::read_network_graph ... bench: 2,303,387,362 ns/iter (+/- 80,066,866)
test routing::network_graph::benches::write_network_graph ... bench: 152,065,789 ns/iter (+/- 7,420,318)
test routing::router::benches::generate_mpp_routes ... bench: 104,163,061 ns/iter (+/- 64,813,214)
test routing::router::benches::generate_routes ... bench: 97,599,490 ns/iter (+/- 69,822,412)

vs c36d6e7

test ln::channelmanager::bench::bench_sends ... bench: 7,565,717 ns/iter (+/- 1,752,280)
test routing::network_graph::benches::read_network_graph ... bench: 1,407,918,285 ns/iter (+/- 124,747,638)
test routing::network_graph::benches::write_network_graph ... bench: 134,930,617 ns/iter (+/- 10,801,383)
test routing::router::benches::generate_mpp_routes ... bench: 42,800,183 ns/iter (+/- 28,587,831)
test routing::router::benches::generate_routes ... bench: 42,839,538 ns/iter (+/- 33,412,245)

The write performance is not a huge improvement (expected this probably) but read and routes are nice.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

I think the way to do this is to replace NodeId type alias with pub struct NodeId([u8; 33]) and then you'll be able to impl core::cmp::PartialOrd for NodeId directly.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The rest of the patch looks good, I think.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from c36d6e7 to 2a3c25aCompareOctober 6, 2021 20:50
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxen marked this pull request as ready for review October 6, 2021 21:16
@codecov

codecovBot commented Oct 6, 2021

Copy link
Copy Markdown

Codecov Report

Merging #1107 (e9059e0) into main (6582aae) will decrease coverage by 0.01%.
The diff coverage is 82.75%.

❗ Current head e9059e0 differs from pull request most recent head fce631c. Consider uploading reports for the commit fce631c to get more accurate results
Impacted file tree graph

@@ 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 
Impacted FilesCoverage Δ
lightning/src/routing/network_graph.rs91.22% <74.50%> (-0.32%)⬇️
lightning/src/routing/router.rs96.04% <89.23%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs84.87% <0.00%> (-0.01%)⬇️
lightning/src/ln/mod.rs90.00% <0.00%> (ø)
lightning/src/ln/payment_tests.rs
lightning/src/ln/functional_tests.rs97.40% <0.00%> (+0.01%)⬆️

Continue to review full report at Codecov.

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

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Basically LGTM, note you'll have to squash for CI to pass.

Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Basically LGTM, note you'll have to squash for CI to pass.

The one time I forget to squash before pushing 🥲

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch 2 times, most recently from bede58e to 5e204d2CompareOctober 7, 2021 05:07
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 5e204d2 to 059bf1aCompareOctober 8, 2021 15:55
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 059bf1a to fce631cCompareOctober 8, 2021 16:38
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();

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.

How about impl From<NodeId> for PublicKey (and vice-versa)?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yeah, I did consider that right after I pushed the last change. It'll clean things up quite a bit, I agree 🙂

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.

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.

@TheBlueMattTheBlueMattOct 8, 2021

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think we can leave it as is for now then?

@dunxendunxenOct 8, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

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?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

@Kixunil Happy to review any follow-ups if this is possible within our MSRV constraints.

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.

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.

@TheBlueMatt
TheBlueMatt merged commit 843d25d into lightningdevkit:mainOct 8, 2021
@dunxen
dunxen deleted the 2021-10-swap-pubkey-for-bytearray branch October 9, 2021 06:14
@jkczyzjkczyz mentioned this pull request Apr 6, 2024
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.

Swap NetworkGraph PublicKeys for [u8; 33]

4 participants

@dunxen@TheBlueMatt@Kixunil@jkczyz
, '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('^' + ".*" + ' Replace PublicKey with [u8; 33] in NetworkGraph by dunxen · Pull Request #1107 · lightningdevkit/rust-lightning · GitHub
Skip to content

Replace PublicKey with [u8; 33] in NetworkGraph - #1107

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray
Oct 8, 2021
Merged

Replace PublicKey with [u8; 33] in NetworkGraph#1107
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray

Conversation

@dunxen

Copy link
Copy Markdown
Contributor

Closes#960

@dunxen
dunxen marked this pull request as draft October 5, 2021 06:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Going to take this out of draft once I've fixed the linting and fuzzing.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is awesome, excited to see benchmark results once bench compiles :)

Comment threadlightning-invoice/src/de.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from e60d06f to 01e67a4CompareOctober 5, 2021 20:49

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice, 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.

Comment threadlightning/src/routing/router.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

I believe due to calls to serialize or from_slice in the tight inner loop, see comment.

I'm also going to minimise serialize() in the rest of get_route() as much as possible.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 01e67a4 to c36d6e7CompareOctober 6, 2021 08:58
@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

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.

@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Just comparing here

#1079

test ln::channelmanager::bench::bench_sends ... bench: 7,765,229 ns/iter (+/- 1,232,859)
test routing::network_graph::benches::read_network_graph ... bench: 2,303,387,362 ns/iter (+/- 80,066,866)
test routing::network_graph::benches::write_network_graph ... bench: 152,065,789 ns/iter (+/- 7,420,318)
test routing::router::benches::generate_mpp_routes ... bench: 104,163,061 ns/iter (+/- 64,813,214)
test routing::router::benches::generate_routes ... bench: 97,599,490 ns/iter (+/- 69,822,412)

vs c36d6e7

test ln::channelmanager::bench::bench_sends ... bench: 7,565,717 ns/iter (+/- 1,752,280)
test routing::network_graph::benches::read_network_graph ... bench: 1,407,918,285 ns/iter (+/- 124,747,638)
test routing::network_graph::benches::write_network_graph ... bench: 134,930,617 ns/iter (+/- 10,801,383)
test routing::router::benches::generate_mpp_routes ... bench: 42,800,183 ns/iter (+/- 28,587,831)
test routing::router::benches::generate_routes ... bench: 42,839,538 ns/iter (+/- 33,412,245)

The write performance is not a huge improvement (expected this probably) but read and routes are nice.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

I think the way to do this is to replace NodeId type alias with pub struct NodeId([u8; 33]) and then you'll be able to impl core::cmp::PartialOrd for NodeId directly.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The rest of the patch looks good, I think.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from c36d6e7 to 2a3c25aCompareOctober 6, 2021 20:50
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxen marked this pull request as ready for review October 6, 2021 21:16
@codecov

codecovBot commented Oct 6, 2021

Copy link
Copy Markdown

Codecov Report

Merging #1107 (e9059e0) into main (6582aae) will decrease coverage by 0.01%.
The diff coverage is 82.75%.

❗ Current head e9059e0 differs from pull request most recent head fce631c. Consider uploading reports for the commit fce631c to get more accurate results
Impacted file tree graph

@@ 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 
Impacted FilesCoverage Δ
lightning/src/routing/network_graph.rs91.22% <74.50%> (-0.32%)⬇️
lightning/src/routing/router.rs96.04% <89.23%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs84.87% <0.00%> (-0.01%)⬇️
lightning/src/ln/mod.rs90.00% <0.00%> (ø)
lightning/src/ln/payment_tests.rs
lightning/src/ln/functional_tests.rs97.40% <0.00%> (+0.01%)⬆️

Continue to review full report at Codecov.

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

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Basically LGTM, note you'll have to squash for CI to pass.

Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Basically LGTM, note you'll have to squash for CI to pass.

The one time I forget to squash before pushing 🥲

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch 2 times, most recently from bede58e to 5e204d2CompareOctober 7, 2021 05:07
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 5e204d2 to 059bf1aCompareOctober 8, 2021 15:55
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 059bf1a to fce631cCompareOctober 8, 2021 16:38
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();

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.

How about impl From<NodeId> for PublicKey (and vice-versa)?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yeah, I did consider that right after I pushed the last change. It'll clean things up quite a bit, I agree 🙂

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.

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.

@TheBlueMattTheBlueMattOct 8, 2021

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think we can leave it as is for now then?

@dunxendunxenOct 8, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

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?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

@Kixunil Happy to review any follow-ups if this is possible within our MSRV constraints.

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.

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.

@TheBlueMatt
TheBlueMatt merged commit 843d25d into lightningdevkit:mainOct 8, 2021
@dunxen
dunxen deleted the 2021-10-swap-pubkey-for-bytearray branch October 9, 2021 06:14
@jkczyzjkczyz mentioned this pull request Apr 6, 2024
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.

Swap NetworkGraph PublicKeys for [u8; 33]

4 participants

@dunxen@TheBlueMatt@Kixunil@jkczyz
, '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" + ' Replace PublicKey with [u8; 33] in NetworkGraph by dunxen · Pull Request #1107 · lightningdevkit/rust-lightning · GitHub
Skip to content

Replace PublicKey with [u8; 33] in NetworkGraph - #1107

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray
Oct 8, 2021
Merged

Replace PublicKey with [u8; 33] in NetworkGraph#1107
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray

Conversation

@dunxen

Copy link
Copy Markdown
Contributor

Closes#960

@dunxen
dunxen marked this pull request as draft October 5, 2021 06:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Going to take this out of draft once I've fixed the linting and fuzzing.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is awesome, excited to see benchmark results once bench compiles :)

Comment threadlightning-invoice/src/de.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from e60d06f to 01e67a4CompareOctober 5, 2021 20:49

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice, 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.

Comment threadlightning/src/routing/router.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

I believe due to calls to serialize or from_slice in the tight inner loop, see comment.

I'm also going to minimise serialize() in the rest of get_route() as much as possible.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 01e67a4 to c36d6e7CompareOctober 6, 2021 08:58
@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

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.

@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Just comparing here

#1079

test ln::channelmanager::bench::bench_sends ... bench: 7,765,229 ns/iter (+/- 1,232,859)
test routing::network_graph::benches::read_network_graph ... bench: 2,303,387,362 ns/iter (+/- 80,066,866)
test routing::network_graph::benches::write_network_graph ... bench: 152,065,789 ns/iter (+/- 7,420,318)
test routing::router::benches::generate_mpp_routes ... bench: 104,163,061 ns/iter (+/- 64,813,214)
test routing::router::benches::generate_routes ... bench: 97,599,490 ns/iter (+/- 69,822,412)

vs c36d6e7

test ln::channelmanager::bench::bench_sends ... bench: 7,565,717 ns/iter (+/- 1,752,280)
test routing::network_graph::benches::read_network_graph ... bench: 1,407,918,285 ns/iter (+/- 124,747,638)
test routing::network_graph::benches::write_network_graph ... bench: 134,930,617 ns/iter (+/- 10,801,383)
test routing::router::benches::generate_mpp_routes ... bench: 42,800,183 ns/iter (+/- 28,587,831)
test routing::router::benches::generate_routes ... bench: 42,839,538 ns/iter (+/- 33,412,245)

The write performance is not a huge improvement (expected this probably) but read and routes are nice.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

I think the way to do this is to replace NodeId type alias with pub struct NodeId([u8; 33]) and then you'll be able to impl core::cmp::PartialOrd for NodeId directly.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The rest of the patch looks good, I think.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from c36d6e7 to 2a3c25aCompareOctober 6, 2021 20:50
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxen marked this pull request as ready for review October 6, 2021 21:16
@codecov

codecovBot commented Oct 6, 2021

Copy link
Copy Markdown

Codecov Report

Merging #1107 (e9059e0) into main (6582aae) will decrease coverage by 0.01%.
The diff coverage is 82.75%.

❗ Current head e9059e0 differs from pull request most recent head fce631c. Consider uploading reports for the commit fce631c to get more accurate results
Impacted file tree graph

@@ 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 
Impacted FilesCoverage Δ
lightning/src/routing/network_graph.rs91.22% <74.50%> (-0.32%)⬇️
lightning/src/routing/router.rs96.04% <89.23%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs84.87% <0.00%> (-0.01%)⬇️
lightning/src/ln/mod.rs90.00% <0.00%> (ø)
lightning/src/ln/payment_tests.rs
lightning/src/ln/functional_tests.rs97.40% <0.00%> (+0.01%)⬆️

Continue to review full report at Codecov.

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

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Basically LGTM, note you'll have to squash for CI to pass.

Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Basically LGTM, note you'll have to squash for CI to pass.

The one time I forget to squash before pushing 🥲

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch 2 times, most recently from bede58e to 5e204d2CompareOctober 7, 2021 05:07
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 5e204d2 to 059bf1aCompareOctober 8, 2021 15:55
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 059bf1a to fce631cCompareOctober 8, 2021 16:38
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();

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.

How about impl From<NodeId> for PublicKey (and vice-versa)?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yeah, I did consider that right after I pushed the last change. It'll clean things up quite a bit, I agree 🙂

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.

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.

@TheBlueMattTheBlueMattOct 8, 2021

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think we can leave it as is for now then?

@dunxendunxenOct 8, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

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?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

@Kixunil Happy to review any follow-ups if this is possible within our MSRV constraints.

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.

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.

@TheBlueMatt
TheBlueMatt merged commit 843d25d into lightningdevkit:mainOct 8, 2021
@dunxen
dunxen deleted the 2021-10-swap-pubkey-for-bytearray branch October 9, 2021 06:14
@jkczyzjkczyz mentioned this pull request Apr 6, 2024
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.

Swap NetworkGraph PublicKeys for [u8; 33]

4 participants

@dunxen@TheBlueMatt@Kixunil@jkczyz
, '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('^' + ".*" + ' Replace PublicKey with [u8; 33] in NetworkGraph by dunxen · Pull Request #1107 · lightningdevkit/rust-lightning · GitHub
Skip to content

Replace PublicKey with [u8; 33] in NetworkGraph - #1107

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray
Oct 8, 2021
Merged

Replace PublicKey with [u8; 33] in NetworkGraph#1107
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray

Conversation

@dunxen

Copy link
Copy Markdown
Contributor

Closes#960

@dunxen
dunxen marked this pull request as draft October 5, 2021 06:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Going to take this out of draft once I've fixed the linting and fuzzing.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is awesome, excited to see benchmark results once bench compiles :)

Comment threadlightning-invoice/src/de.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from e60d06f to 01e67a4CompareOctober 5, 2021 20:49

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice, 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.

Comment threadlightning/src/routing/router.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

I believe due to calls to serialize or from_slice in the tight inner loop, see comment.

I'm also going to minimise serialize() in the rest of get_route() as much as possible.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 01e67a4 to c36d6e7CompareOctober 6, 2021 08:58
@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

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.

@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Just comparing here

#1079

test ln::channelmanager::bench::bench_sends ... bench: 7,765,229 ns/iter (+/- 1,232,859)
test routing::network_graph::benches::read_network_graph ... bench: 2,303,387,362 ns/iter (+/- 80,066,866)
test routing::network_graph::benches::write_network_graph ... bench: 152,065,789 ns/iter (+/- 7,420,318)
test routing::router::benches::generate_mpp_routes ... bench: 104,163,061 ns/iter (+/- 64,813,214)
test routing::router::benches::generate_routes ... bench: 97,599,490 ns/iter (+/- 69,822,412)

vs c36d6e7

test ln::channelmanager::bench::bench_sends ... bench: 7,565,717 ns/iter (+/- 1,752,280)
test routing::network_graph::benches::read_network_graph ... bench: 1,407,918,285 ns/iter (+/- 124,747,638)
test routing::network_graph::benches::write_network_graph ... bench: 134,930,617 ns/iter (+/- 10,801,383)
test routing::router::benches::generate_mpp_routes ... bench: 42,800,183 ns/iter (+/- 28,587,831)
test routing::router::benches::generate_routes ... bench: 42,839,538 ns/iter (+/- 33,412,245)

The write performance is not a huge improvement (expected this probably) but read and routes are nice.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

I think the way to do this is to replace NodeId type alias with pub struct NodeId([u8; 33]) and then you'll be able to impl core::cmp::PartialOrd for NodeId directly.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The rest of the patch looks good, I think.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from c36d6e7 to 2a3c25aCompareOctober 6, 2021 20:50
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxen marked this pull request as ready for review October 6, 2021 21:16
@codecov

codecovBot commented Oct 6, 2021

Copy link
Copy Markdown

Codecov Report

Merging #1107 (e9059e0) into main (6582aae) will decrease coverage by 0.01%.
The diff coverage is 82.75%.

❗ Current head e9059e0 differs from pull request most recent head fce631c. Consider uploading reports for the commit fce631c to get more accurate results
Impacted file tree graph

@@ 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 
Impacted FilesCoverage Δ
lightning/src/routing/network_graph.rs91.22% <74.50%> (-0.32%)⬇️
lightning/src/routing/router.rs96.04% <89.23%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs84.87% <0.00%> (-0.01%)⬇️
lightning/src/ln/mod.rs90.00% <0.00%> (ø)
lightning/src/ln/payment_tests.rs
lightning/src/ln/functional_tests.rs97.40% <0.00%> (+0.01%)⬆️

Continue to review full report at Codecov.

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

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Basically LGTM, note you'll have to squash for CI to pass.

Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Basically LGTM, note you'll have to squash for CI to pass.

The one time I forget to squash before pushing 🥲

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch 2 times, most recently from bede58e to 5e204d2CompareOctober 7, 2021 05:07
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 5e204d2 to 059bf1aCompareOctober 8, 2021 15:55
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 059bf1a to fce631cCompareOctober 8, 2021 16:38
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();

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.

How about impl From<NodeId> for PublicKey (and vice-versa)?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yeah, I did consider that right after I pushed the last change. It'll clean things up quite a bit, I agree 🙂

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.

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.

@TheBlueMattTheBlueMattOct 8, 2021

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think we can leave it as is for now then?

@dunxendunxenOct 8, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

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?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

@Kixunil Happy to review any follow-ups if this is possible within our MSRV constraints.

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.

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.

@TheBlueMatt
TheBlueMatt merged commit 843d25d into lightningdevkit:mainOct 8, 2021
@dunxen
dunxen deleted the 2021-10-swap-pubkey-for-bytearray branch October 9, 2021 06:14
@jkczyzjkczyz mentioned this pull request Apr 6, 2024
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.

Swap NetworkGraph PublicKeys for [u8; 33]

4 participants

@dunxen@TheBlueMatt@Kixunil@jkczyz
, '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('^' + ".*" + ' Replace PublicKey with [u8; 33] in NetworkGraph by dunxen · Pull Request #1107 · lightningdevkit/rust-lightning · GitHub
Skip to content

Replace PublicKey with [u8; 33] in NetworkGraph - #1107

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray
Oct 8, 2021
Merged

Replace PublicKey with [u8; 33] in NetworkGraph#1107
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray

Conversation

@dunxen

Copy link
Copy Markdown
Contributor

Closes#960

@dunxen
dunxen marked this pull request as draft October 5, 2021 06:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Going to take this out of draft once I've fixed the linting and fuzzing.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is awesome, excited to see benchmark results once bench compiles :)

Comment threadlightning-invoice/src/de.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from e60d06f to 01e67a4CompareOctober 5, 2021 20:49

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice, 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.

Comment threadlightning/src/routing/router.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

I believe due to calls to serialize or from_slice in the tight inner loop, see comment.

I'm also going to minimise serialize() in the rest of get_route() as much as possible.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 01e67a4 to c36d6e7CompareOctober 6, 2021 08:58
@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

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.

@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Just comparing here

#1079

test ln::channelmanager::bench::bench_sends ... bench: 7,765,229 ns/iter (+/- 1,232,859)
test routing::network_graph::benches::read_network_graph ... bench: 2,303,387,362 ns/iter (+/- 80,066,866)
test routing::network_graph::benches::write_network_graph ... bench: 152,065,789 ns/iter (+/- 7,420,318)
test routing::router::benches::generate_mpp_routes ... bench: 104,163,061 ns/iter (+/- 64,813,214)
test routing::router::benches::generate_routes ... bench: 97,599,490 ns/iter (+/- 69,822,412)

vs c36d6e7

test ln::channelmanager::bench::bench_sends ... bench: 7,565,717 ns/iter (+/- 1,752,280)
test routing::network_graph::benches::read_network_graph ... bench: 1,407,918,285 ns/iter (+/- 124,747,638)
test routing::network_graph::benches::write_network_graph ... bench: 134,930,617 ns/iter (+/- 10,801,383)
test routing::router::benches::generate_mpp_routes ... bench: 42,800,183 ns/iter (+/- 28,587,831)
test routing::router::benches::generate_routes ... bench: 42,839,538 ns/iter (+/- 33,412,245)

The write performance is not a huge improvement (expected this probably) but read and routes are nice.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

I think the way to do this is to replace NodeId type alias with pub struct NodeId([u8; 33]) and then you'll be able to impl core::cmp::PartialOrd for NodeId directly.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The rest of the patch looks good, I think.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from c36d6e7 to 2a3c25aCompareOctober 6, 2021 20:50
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxen marked this pull request as ready for review October 6, 2021 21:16
@codecov

codecovBot commented Oct 6, 2021

Copy link
Copy Markdown

Codecov Report

Merging #1107 (e9059e0) into main (6582aae) will decrease coverage by 0.01%.
The diff coverage is 82.75%.

❗ Current head e9059e0 differs from pull request most recent head fce631c. Consider uploading reports for the commit fce631c to get more accurate results
Impacted file tree graph

@@ 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 
Impacted FilesCoverage Δ
lightning/src/routing/network_graph.rs91.22% <74.50%> (-0.32%)⬇️
lightning/src/routing/router.rs96.04% <89.23%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs84.87% <0.00%> (-0.01%)⬇️
lightning/src/ln/mod.rs90.00% <0.00%> (ø)
lightning/src/ln/payment_tests.rs
lightning/src/ln/functional_tests.rs97.40% <0.00%> (+0.01%)⬆️

Continue to review full report at Codecov.

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

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Basically LGTM, note you'll have to squash for CI to pass.

Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Basically LGTM, note you'll have to squash for CI to pass.

The one time I forget to squash before pushing 🥲

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch 2 times, most recently from bede58e to 5e204d2CompareOctober 7, 2021 05:07
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 5e204d2 to 059bf1aCompareOctober 8, 2021 15:55
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 059bf1a to fce631cCompareOctober 8, 2021 16:38
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();

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.

How about impl From<NodeId> for PublicKey (and vice-versa)?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yeah, I did consider that right after I pushed the last change. It'll clean things up quite a bit, I agree 🙂

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.

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.

@TheBlueMattTheBlueMattOct 8, 2021

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think we can leave it as is for now then?

@dunxendunxenOct 8, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

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?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

@Kixunil Happy to review any follow-ups if this is possible within our MSRV constraints.

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.

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.

@TheBlueMatt
TheBlueMatt merged commit 843d25d into lightningdevkit:mainOct 8, 2021
@dunxen
dunxen deleted the 2021-10-swap-pubkey-for-bytearray branch October 9, 2021 06:14
@jkczyzjkczyz mentioned this pull request Apr 6, 2024
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.

Swap NetworkGraph PublicKeys for [u8; 33]

4 participants

@dunxen@TheBlueMatt@Kixunil@jkczyz
, '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); } })(); })(); Replace PublicKey with [u8; 33] in NetworkGraph by dunxen · Pull Request #1107 · lightningdevkit/rust-lightning · GitHub
Skip to content

Replace PublicKey with [u8; 33] in NetworkGraph - #1107

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray
Oct 8, 2021
Merged

Replace PublicKey with [u8; 33] in NetworkGraph#1107
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
dunxen:2021-10-swap-pubkey-for-bytearray

Conversation

@dunxen

Copy link
Copy Markdown
Contributor

Closes#960

@dunxen
dunxen marked this pull request as draft October 5, 2021 06:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Going to take this out of draft once I've fixed the linting and fuzzing.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is awesome, excited to see benchmark results once bench compiles :)

Comment threadlightning-invoice/src/de.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from e60d06f to 01e67a4CompareOctober 5, 2021 20:49

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice, 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.

Comment threadlightning/src/routing/router.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

I believe due to calls to serialize or from_slice in the tight inner loop, see comment.

I'm also going to minimise serialize() in the rest of get_route() as much as possible.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 01e67a4 to c36d6e7CompareOctober 6, 2021 08:58
@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

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.

@dunxen

dunxen commented Oct 6, 2021

Copy link
Copy Markdown
ContributorAuthor

Just comparing here

#1079

test ln::channelmanager::bench::bench_sends ... bench: 7,765,229 ns/iter (+/- 1,232,859)
test routing::network_graph::benches::read_network_graph ... bench: 2,303,387,362 ns/iter (+/- 80,066,866)
test routing::network_graph::benches::write_network_graph ... bench: 152,065,789 ns/iter (+/- 7,420,318)
test routing::router::benches::generate_mpp_routes ... bench: 104,163,061 ns/iter (+/- 64,813,214)
test routing::router::benches::generate_routes ... bench: 97,599,490 ns/iter (+/- 69,822,412)

vs c36d6e7

test ln::channelmanager::bench::bench_sends ... bench: 7,565,717 ns/iter (+/- 1,752,280)
test routing::network_graph::benches::read_network_graph ... bench: 1,407,918,285 ns/iter (+/- 124,747,638)
test routing::network_graph::benches::write_network_graph ... bench: 134,930,617 ns/iter (+/- 10,801,383)
test routing::router::benches::generate_mpp_routes ... bench: 42,800,183 ns/iter (+/- 28,587,831)
test routing::router::benches::generate_routes ... bench: 42,839,538 ns/iter (+/- 33,412,245)

The write performance is not a huge improvement (expected this probably) but read and routes are nice.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Seems to fix for earlier Rust versions not supporting const generics, I'll need to use another way to compare NodeIds without introducing more allocations or other overhead.

I think the way to do this is to replace NodeId type alias with pub struct NodeId([u8; 33]) and then you'll be able to impl core::cmp::PartialOrd for NodeId directly.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The rest of the patch looks good, I think.

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from c36d6e7 to 2a3c25aCompareOctober 6, 2021 20:50
Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen
dunxen marked this pull request as ready for review October 6, 2021 21:16
@codecov

codecovBot commented Oct 6, 2021

Copy link
Copy Markdown

Codecov Report

Merging #1107 (e9059e0) into main (6582aae) will decrease coverage by 0.01%.
The diff coverage is 82.75%.

❗ Current head e9059e0 differs from pull request most recent head fce631c. Consider uploading reports for the commit fce631c to get more accurate results
Impacted file tree graph

@@ 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 
Impacted FilesCoverage Δ
lightning/src/routing/network_graph.rs91.22% <74.50%> (-0.32%)⬇️
lightning/src/routing/router.rs96.04% <89.23%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs84.87% <0.00%> (-0.01%)⬇️
lightning/src/ln/mod.rs90.00% <0.00%> (ø)
lightning/src/ln/payment_tests.rs
lightning/src/ln/functional_tests.rs97.40% <0.00%> (+0.01%)⬆️

Continue to review full report at Codecov.

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

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Basically LGTM, note you'll have to squash for CI to pass.

Comment threadlightning/src/routing/network_graph.rs Outdated
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Basically LGTM, note you'll have to squash for CI to pass.

The one time I forget to squash before pushing 🥲

@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch 2 times, most recently from bede58e to 5e204d2CompareOctober 7, 2021 05:07
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs Outdated
Comment threadlightning/src/routing/network_graph.rs
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 5e204d2 to 059bf1aCompareOctober 8, 2021 15:55
@dunxen
dunxenforce-pushed the 2021-10-swap-pubkey-for-bytearray branch from 059bf1a to fce631cCompareOctober 8, 2021 16:38
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();

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.

How about impl From<NodeId> for PublicKey (and vice-versa)?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yeah, I did consider that right after I pushed the last change. It'll clean things up quite a bit, I agree 🙂

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.

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.

@TheBlueMattTheBlueMattOct 8, 2021

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think we can leave it as is for now then?

@dunxendunxenOct 8, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

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?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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.

@Kixunil Happy to review any follow-ups if this is possible within our MSRV constraints.

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.

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.

@TheBlueMatt
TheBlueMatt merged commit 843d25d into lightningdevkit:mainOct 8, 2021
@dunxen
dunxen deleted the 2021-10-swap-pubkey-for-bytearray branch October 9, 2021 06:14
@jkczyzjkczyz mentioned this pull request Apr 6, 2024
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.

Swap NetworkGraph PublicKeys for [u8; 33]

4 participants

@dunxen@TheBlueMatt@Kixunil@jkczyz