Skip to content

Move broadcast_node_announcement to PeerManager - #1699

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework
Sep 9, 2022
Merged

Move broadcast_node_announcement to PeerManager#1699
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some NodeFeatures will, in the future, represent features which
are not enabled by the ChannelManager, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the ChannelManager.

The simplest fix for this is to change to generating the
node_announcement in PeerManager, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.

This PR moves channel_announcement/update messages into peer connection handling and moves the broadcast_node_announcement function to
PeerHandler but does not yet implement feature OR'ing.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 1887a2e to dbb5885CompareSeptember 6, 2022 22:48
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/msgs.rs Outdated
@codecov-commenter

codecov-commenter commented Sep 6, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1699 (25a10a1) into main (301efc8) will decrease coverage by 0.13%.
The diff coverage is 74.28%.

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

@@ Coverage Diff @@## main #1699 +/- ##
==========================================
- Coverage 90.92% 90.78% -0.14% 
==========================================
Files 86 86 Lines 46417 46407 -10 Branches 46417 46407 -10 ==========================================
- Hits 42204 42132 -72 - Misses 4213 4275 +62 
Impacted FilesCoverage Δ
lightning/src/ln/functional_test_utils.rs93.68% <ø> (+0.09%)⬆️
lightning/src/ln/msgs.rs86.24% <ø> (ø)
lightning/src/util/events.rs36.58% <0.00%> (-2.92%)⬇️
lightning/src/ln/peer_handler.rs57.00% <30.00%> (-0.02%)⬇️
lightning/src/util/test_utils.rs77.18% <33.33%> (-0.31%)⬇️
lightning-net-tokio/src/lib.rs76.82% <75.00%> (-0.55%)⬇️
lightning/src/ln/channelmanager.rs84.94% <84.61%> (-0.06%)⬇️
lightning/src/ln/functional_tests.rs96.90% <91.66%> (-0.21%)⬇️
lightning-background-processor/src/lib.rs96.23% <100.00%> (ø)
lightning/src/ln/chanmon_update_fail_tests.rs97.72% <100.00%> (ø)
... and 10 more

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

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 3 times, most recently from 8e2fa84 to 1128d85CompareSeptember 7, 2022 16:48
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased to fix a new test added in git.

Comment threadlightning/src/ln/functional_test_utils.rs Outdated
Comment threadpending_changelog/1699.txt Outdated
Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment on lines +652 to +654
/// `current_time` should be set higher than any previous `PeerManager` instance with the same
/// secret key. The simplest way to ensure this, of course, is to simply set it to the current
/// UNIX timestamp on startup.

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.

This isn't quite accurate or at least is unclear what is meant by "any previous PeerManager instance". It needs to be set higher than what was used to previously initialize plus the number of times that broadcast_node_announcement had previously been called. Maybe just say it should set to the current timestamp?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Tried to reword it. I don't want to be so strict as to tell users they need a clock here.

Comment threadCONTRIBUTING.md Outdated
Comment threadpending_changelog/1699.txt Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.
`PeerManager::new`'s new `current_time` argument must be set to the current time, not a counter, for any existing nodes which upgrade.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why bother saying "not a counter"? The counter was previously an implementation detail.

Also, shouldn't all nodes need to set it to the current time regardless if upgrading?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I guess the intent is that users can totally still use a counter if they want, but I'll drop the clause.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Re-added it with a bit more context now that there's similarly more context on the PeerManager constructors themselves.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 008bd35 to baf5848CompareSeptember 7, 2022 22:11
}
}
assert!(found_ann_1);
assert_eq!(a_events.len(), 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not still check for the node announcement?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We don't do a node announcement anymore that can be checked here - we don't have a PeerManager in the normal functional test environment, so can't test it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/peer_handler.rs
excess_data: Vec::new(),
};
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
let node_announce_sig = sign(&self.secp_ctx, &msghash, &self.our_node_secret);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm, so since PeerManager doesn't have a KeysInterface, it's not obvious to me how we'll get rid of this in the future (unlike with ChannelManager)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We need to move to PeerManager having a KeysInterface :). We need that anyway as we need to replace the peer ECDH with the KeysInterface ECDH.

Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.

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.

nit: Maybe we should use the commit hash instead of PR number, to keep the commit history independent from GH?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I dont think the file name matters at all. It just has to be unique, for all that it matters people could just put their name as long as things are unique.

Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
///
/// (C-not exported) as we can't export a PeerManager with a dummy channel handler
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

Probably doesn't work, but a thought: rather than the user supplying the current time and awkward docs, why not do what ChannelManager did previously and set it to 0 on startup, then compare_exchange it based on ChannelUpdates, etc that we receive that contain timestamps?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We can't be confident in the timestamps we get from random peers. ChannelManager used actual blocks, which we dont currently have in the peer handling, and I'm not sure its worth adding just for this.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a9e7424 to b3547f1CompareSeptember 8, 2022 17:52

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Basically LGTM if CI's happy

Comment threadlightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from b3547f1 to 2a064dfCompareSeptember 8, 2022 18:47
@valentinewallace

Copy link
Copy Markdown
Contributor

Looks good, fine to squash whenever on my end

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from 2a064df to 25a10a1CompareSeptember 8, 2022 18:50
Comment threadCONTRIBUTING.md Outdated
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }

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.

Should this be known? Think it might be changed in the follow-up already.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I think node features can be none, it just means no one will connect to us, which is good. We set more features in init, because we want to make connections to people, but I think node should be none.

Comment on lines +562 to +568
/// `current_time` is used as an always-increasing counter that survives across restarts and is
/// incremented irregularly internally. In general it is best to simply use the current UNIX
/// timestamp, however if it is not available a persistent counter that increases once per
/// minute should suffice.
///
/// (C-not exported) as we can't export a PeerManager with a dummy route handler
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

FWIW, we could always parameterize PeerManager by util::time::Time and provide implementations for (1) SystemTime and (2) a global counter. The latter would be for no-std and could be persisted when incremented. Would probably need an associated function to initialize the counter from persisted data / specify where to persist.

Since neither implementation needs to be instantiated (util::time::Time only has associated functions), we wouldn't need an extra method parameter anywhere. Just an idea. Happy to leave it to a follow-up, if desired.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The issue is the global counter would have to have some kind of persistence, which would mean we need the user involved. Otherwise we'd have a different API between no-std and std which I'm also not a fan of :/

When we connect to a new peer, immediately send them any
channel_announcement and channel_update messages for any public
channels we have with other peers. This allows us to stop sending
those messages on a timer when they have not changed and ensures
we are sending messages when we have peers connected, rather than
broadcasting at startup when we have no peers connected.
Some `NodeFeatures` will, in the future, represent features which
are not enabled by the `ChannelManager`, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the `ChannelManager`.
The simplest fix for this is to change to generating the
node_announcement in `PeerManager`, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.
This commit moves the `broadcast_node_announcement` function to
`PeerHandler` but does not yet implement feature OR'ing.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a83a363 to e2495f2CompareSeptember 8, 2022 19:50
@TheBlueMatt
TheBlueMatt merged commit ba69536 into lightningdevkit:mainSep 9, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@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" + '
Move broadcast_node_announcement to PeerManager by TheBlueMatt · Pull Request #1699 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move broadcast_node_announcement to PeerManager - #1699

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework
Sep 9, 2022
Merged

Move broadcast_node_announcement to PeerManager#1699
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some NodeFeatures will, in the future, represent features which
are not enabled by the ChannelManager, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the ChannelManager.

The simplest fix for this is to change to generating the
node_announcement in PeerManager, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.

This PR moves channel_announcement/update messages into peer connection handling and moves the broadcast_node_announcement function to
PeerHandler but does not yet implement feature OR'ing.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 1887a2e to dbb5885CompareSeptember 6, 2022 22:48
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/msgs.rs Outdated
@codecov-commenter

codecov-commenter commented Sep 6, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1699 (25a10a1) into main (301efc8) will decrease coverage by 0.13%.
The diff coverage is 74.28%.

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

@@ Coverage Diff @@## main #1699 +/- ##
==========================================
- Coverage 90.92% 90.78% -0.14% 
==========================================
Files 86 86 Lines 46417 46407 -10 Branches 46417 46407 -10 ==========================================
- Hits 42204 42132 -72 - Misses 4213 4275 +62 
Impacted FilesCoverage Δ
lightning/src/ln/functional_test_utils.rs93.68% <ø> (+0.09%)⬆️
lightning/src/ln/msgs.rs86.24% <ø> (ø)
lightning/src/util/events.rs36.58% <0.00%> (-2.92%)⬇️
lightning/src/ln/peer_handler.rs57.00% <30.00%> (-0.02%)⬇️
lightning/src/util/test_utils.rs77.18% <33.33%> (-0.31%)⬇️
lightning-net-tokio/src/lib.rs76.82% <75.00%> (-0.55%)⬇️
lightning/src/ln/channelmanager.rs84.94% <84.61%> (-0.06%)⬇️
lightning/src/ln/functional_tests.rs96.90% <91.66%> (-0.21%)⬇️
lightning-background-processor/src/lib.rs96.23% <100.00%> (ø)
lightning/src/ln/chanmon_update_fail_tests.rs97.72% <100.00%> (ø)
... and 10 more

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

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 3 times, most recently from 8e2fa84 to 1128d85CompareSeptember 7, 2022 16:48
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased to fix a new test added in git.

Comment threadlightning/src/ln/functional_test_utils.rs Outdated
Comment threadpending_changelog/1699.txt Outdated
Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment on lines +652 to +654
/// `current_time` should be set higher than any previous `PeerManager` instance with the same
/// secret key. The simplest way to ensure this, of course, is to simply set it to the current
/// UNIX timestamp on startup.

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.

This isn't quite accurate or at least is unclear what is meant by "any previous PeerManager instance". It needs to be set higher than what was used to previously initialize plus the number of times that broadcast_node_announcement had previously been called. Maybe just say it should set to the current timestamp?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Tried to reword it. I don't want to be so strict as to tell users they need a clock here.

Comment threadCONTRIBUTING.md Outdated
Comment threadpending_changelog/1699.txt Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.
`PeerManager::new`'s new `current_time` argument must be set to the current time, not a counter, for any existing nodes which upgrade.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why bother saying "not a counter"? The counter was previously an implementation detail.

Also, shouldn't all nodes need to set it to the current time regardless if upgrading?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I guess the intent is that users can totally still use a counter if they want, but I'll drop the clause.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Re-added it with a bit more context now that there's similarly more context on the PeerManager constructors themselves.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 008bd35 to baf5848CompareSeptember 7, 2022 22:11
}
}
assert!(found_ann_1);
assert_eq!(a_events.len(), 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not still check for the node announcement?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We don't do a node announcement anymore that can be checked here - we don't have a PeerManager in the normal functional test environment, so can't test it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/peer_handler.rs
excess_data: Vec::new(),
};
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
let node_announce_sig = sign(&self.secp_ctx, &msghash, &self.our_node_secret);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm, so since PeerManager doesn't have a KeysInterface, it's not obvious to me how we'll get rid of this in the future (unlike with ChannelManager)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We need to move to PeerManager having a KeysInterface :). We need that anyway as we need to replace the peer ECDH with the KeysInterface ECDH.

Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.

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.

nit: Maybe we should use the commit hash instead of PR number, to keep the commit history independent from GH?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I dont think the file name matters at all. It just has to be unique, for all that it matters people could just put their name as long as things are unique.

Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
///
/// (C-not exported) as we can't export a PeerManager with a dummy channel handler
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

Probably doesn't work, but a thought: rather than the user supplying the current time and awkward docs, why not do what ChannelManager did previously and set it to 0 on startup, then compare_exchange it based on ChannelUpdates, etc that we receive that contain timestamps?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We can't be confident in the timestamps we get from random peers. ChannelManager used actual blocks, which we dont currently have in the peer handling, and I'm not sure its worth adding just for this.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a9e7424 to b3547f1CompareSeptember 8, 2022 17:52

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Basically LGTM if CI's happy

Comment threadlightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from b3547f1 to 2a064dfCompareSeptember 8, 2022 18:47
@valentinewallace

Copy link
Copy Markdown
Contributor

Looks good, fine to squash whenever on my end

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from 2a064df to 25a10a1CompareSeptember 8, 2022 18:50
Comment threadCONTRIBUTING.md Outdated
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }

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.

Should this be known? Think it might be changed in the follow-up already.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I think node features can be none, it just means no one will connect to us, which is good. We set more features in init, because we want to make connections to people, but I think node should be none.

Comment on lines +562 to +568
/// `current_time` is used as an always-increasing counter that survives across restarts and is
/// incremented irregularly internally. In general it is best to simply use the current UNIX
/// timestamp, however if it is not available a persistent counter that increases once per
/// minute should suffice.
///
/// (C-not exported) as we can't export a PeerManager with a dummy route handler
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

FWIW, we could always parameterize PeerManager by util::time::Time and provide implementations for (1) SystemTime and (2) a global counter. The latter would be for no-std and could be persisted when incremented. Would probably need an associated function to initialize the counter from persisted data / specify where to persist.

Since neither implementation needs to be instantiated (util::time::Time only has associated functions), we wouldn't need an extra method parameter anywhere. Just an idea. Happy to leave it to a follow-up, if desired.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The issue is the global counter would have to have some kind of persistence, which would mean we need the user involved. Otherwise we'd have a different API between no-std and std which I'm also not a fan of :/

When we connect to a new peer, immediately send them any
channel_announcement and channel_update messages for any public
channels we have with other peers. This allows us to stop sending
those messages on a timer when they have not changed and ensures
we are sending messages when we have peers connected, rather than
broadcasting at startup when we have no peers connected.
Some `NodeFeatures` will, in the future, represent features which
are not enabled by the `ChannelManager`, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the `ChannelManager`.
The simplest fix for this is to change to generating the
node_announcement in `PeerManager`, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.
This commit moves the `broadcast_node_announcement` function to
`PeerHandler` but does not yet implement feature OR'ing.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a83a363 to e2495f2CompareSeptember 8, 2022 19:50
@TheBlueMatt
TheBlueMatt merged commit ba69536 into lightningdevkit:mainSep 9, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@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('^' + ".*" + ' Move broadcast_node_announcement to PeerManager by TheBlueMatt · Pull Request #1699 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move broadcast_node_announcement to PeerManager - #1699

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework
Sep 9, 2022
Merged

Move broadcast_node_announcement to PeerManager#1699
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some NodeFeatures will, in the future, represent features which
are not enabled by the ChannelManager, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the ChannelManager.

The simplest fix for this is to change to generating the
node_announcement in PeerManager, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.

This PR moves channel_announcement/update messages into peer connection handling and moves the broadcast_node_announcement function to
PeerHandler but does not yet implement feature OR'ing.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 1887a2e to dbb5885CompareSeptember 6, 2022 22:48
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/msgs.rs Outdated
@codecov-commenter

codecov-commenter commented Sep 6, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1699 (25a10a1) into main (301efc8) will decrease coverage by 0.13%.
The diff coverage is 74.28%.

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

@@ Coverage Diff @@## main #1699 +/- ##
==========================================
- Coverage 90.92% 90.78% -0.14% 
==========================================
Files 86 86 Lines 46417 46407 -10 Branches 46417 46407 -10 ==========================================
- Hits 42204 42132 -72 - Misses 4213 4275 +62 
Impacted FilesCoverage Δ
lightning/src/ln/functional_test_utils.rs93.68% <ø> (+0.09%)⬆️
lightning/src/ln/msgs.rs86.24% <ø> (ø)
lightning/src/util/events.rs36.58% <0.00%> (-2.92%)⬇️
lightning/src/ln/peer_handler.rs57.00% <30.00%> (-0.02%)⬇️
lightning/src/util/test_utils.rs77.18% <33.33%> (-0.31%)⬇️
lightning-net-tokio/src/lib.rs76.82% <75.00%> (-0.55%)⬇️
lightning/src/ln/channelmanager.rs84.94% <84.61%> (-0.06%)⬇️
lightning/src/ln/functional_tests.rs96.90% <91.66%> (-0.21%)⬇️
lightning-background-processor/src/lib.rs96.23% <100.00%> (ø)
lightning/src/ln/chanmon_update_fail_tests.rs97.72% <100.00%> (ø)
... and 10 more

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

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 3 times, most recently from 8e2fa84 to 1128d85CompareSeptember 7, 2022 16:48
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased to fix a new test added in git.

Comment threadlightning/src/ln/functional_test_utils.rs Outdated
Comment threadpending_changelog/1699.txt Outdated
Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment on lines +652 to +654
/// `current_time` should be set higher than any previous `PeerManager` instance with the same
/// secret key. The simplest way to ensure this, of course, is to simply set it to the current
/// UNIX timestamp on startup.

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.

This isn't quite accurate or at least is unclear what is meant by "any previous PeerManager instance". It needs to be set higher than what was used to previously initialize plus the number of times that broadcast_node_announcement had previously been called. Maybe just say it should set to the current timestamp?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Tried to reword it. I don't want to be so strict as to tell users they need a clock here.

Comment threadCONTRIBUTING.md Outdated
Comment threadpending_changelog/1699.txt Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.
`PeerManager::new`'s new `current_time` argument must be set to the current time, not a counter, for any existing nodes which upgrade.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why bother saying "not a counter"? The counter was previously an implementation detail.

Also, shouldn't all nodes need to set it to the current time regardless if upgrading?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I guess the intent is that users can totally still use a counter if they want, but I'll drop the clause.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Re-added it with a bit more context now that there's similarly more context on the PeerManager constructors themselves.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 008bd35 to baf5848CompareSeptember 7, 2022 22:11
}
}
assert!(found_ann_1);
assert_eq!(a_events.len(), 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not still check for the node announcement?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We don't do a node announcement anymore that can be checked here - we don't have a PeerManager in the normal functional test environment, so can't test it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/peer_handler.rs
excess_data: Vec::new(),
};
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
let node_announce_sig = sign(&self.secp_ctx, &msghash, &self.our_node_secret);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm, so since PeerManager doesn't have a KeysInterface, it's not obvious to me how we'll get rid of this in the future (unlike with ChannelManager)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We need to move to PeerManager having a KeysInterface :). We need that anyway as we need to replace the peer ECDH with the KeysInterface ECDH.

Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.

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.

nit: Maybe we should use the commit hash instead of PR number, to keep the commit history independent from GH?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I dont think the file name matters at all. It just has to be unique, for all that it matters people could just put their name as long as things are unique.

Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
///
/// (C-not exported) as we can't export a PeerManager with a dummy channel handler
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

Probably doesn't work, but a thought: rather than the user supplying the current time and awkward docs, why not do what ChannelManager did previously and set it to 0 on startup, then compare_exchange it based on ChannelUpdates, etc that we receive that contain timestamps?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We can't be confident in the timestamps we get from random peers. ChannelManager used actual blocks, which we dont currently have in the peer handling, and I'm not sure its worth adding just for this.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a9e7424 to b3547f1CompareSeptember 8, 2022 17:52

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Basically LGTM if CI's happy

Comment threadlightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from b3547f1 to 2a064dfCompareSeptember 8, 2022 18:47
@valentinewallace

Copy link
Copy Markdown
Contributor

Looks good, fine to squash whenever on my end

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from 2a064df to 25a10a1CompareSeptember 8, 2022 18:50
Comment threadCONTRIBUTING.md Outdated
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }

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.

Should this be known? Think it might be changed in the follow-up already.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I think node features can be none, it just means no one will connect to us, which is good. We set more features in init, because we want to make connections to people, but I think node should be none.

Comment on lines +562 to +568
/// `current_time` is used as an always-increasing counter that survives across restarts and is
/// incremented irregularly internally. In general it is best to simply use the current UNIX
/// timestamp, however if it is not available a persistent counter that increases once per
/// minute should suffice.
///
/// (C-not exported) as we can't export a PeerManager with a dummy route handler
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

FWIW, we could always parameterize PeerManager by util::time::Time and provide implementations for (1) SystemTime and (2) a global counter. The latter would be for no-std and could be persisted when incremented. Would probably need an associated function to initialize the counter from persisted data / specify where to persist.

Since neither implementation needs to be instantiated (util::time::Time only has associated functions), we wouldn't need an extra method parameter anywhere. Just an idea. Happy to leave it to a follow-up, if desired.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The issue is the global counter would have to have some kind of persistence, which would mean we need the user involved. Otherwise we'd have a different API between no-std and std which I'm also not a fan of :/

When we connect to a new peer, immediately send them any
channel_announcement and channel_update messages for any public
channels we have with other peers. This allows us to stop sending
those messages on a timer when they have not changed and ensures
we are sending messages when we have peers connected, rather than
broadcasting at startup when we have no peers connected.
Some `NodeFeatures` will, in the future, represent features which
are not enabled by the `ChannelManager`, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the `ChannelManager`.
The simplest fix for this is to change to generating the
node_announcement in `PeerManager`, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.
This commit moves the `broadcast_node_announcement` function to
`PeerHandler` but does not yet implement feature OR'ing.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a83a363 to e2495f2CompareSeptember 8, 2022 19:50
@TheBlueMatt
TheBlueMatt merged commit ba69536 into lightningdevkit:mainSep 9, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@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('^' + ".*" + ' Move broadcast_node_announcement to PeerManager by TheBlueMatt · Pull Request #1699 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move broadcast_node_announcement to PeerManager - #1699

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework
Sep 9, 2022
Merged

Move broadcast_node_announcement to PeerManager#1699
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some NodeFeatures will, in the future, represent features which
are not enabled by the ChannelManager, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the ChannelManager.

The simplest fix for this is to change to generating the
node_announcement in PeerManager, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.

This PR moves channel_announcement/update messages into peer connection handling and moves the broadcast_node_announcement function to
PeerHandler but does not yet implement feature OR'ing.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 1887a2e to dbb5885CompareSeptember 6, 2022 22:48
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/msgs.rs Outdated
@codecov-commenter

codecov-commenter commented Sep 6, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1699 (25a10a1) into main (301efc8) will decrease coverage by 0.13%.
The diff coverage is 74.28%.

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

@@ Coverage Diff @@## main #1699 +/- ##
==========================================
- Coverage 90.92% 90.78% -0.14% 
==========================================
Files 86 86 Lines 46417 46407 -10 Branches 46417 46407 -10 ==========================================
- Hits 42204 42132 -72 - Misses 4213 4275 +62 
Impacted FilesCoverage Δ
lightning/src/ln/functional_test_utils.rs93.68% <ø> (+0.09%)⬆️
lightning/src/ln/msgs.rs86.24% <ø> (ø)
lightning/src/util/events.rs36.58% <0.00%> (-2.92%)⬇️
lightning/src/ln/peer_handler.rs57.00% <30.00%> (-0.02%)⬇️
lightning/src/util/test_utils.rs77.18% <33.33%> (-0.31%)⬇️
lightning-net-tokio/src/lib.rs76.82% <75.00%> (-0.55%)⬇️
lightning/src/ln/channelmanager.rs84.94% <84.61%> (-0.06%)⬇️
lightning/src/ln/functional_tests.rs96.90% <91.66%> (-0.21%)⬇️
lightning-background-processor/src/lib.rs96.23% <100.00%> (ø)
lightning/src/ln/chanmon_update_fail_tests.rs97.72% <100.00%> (ø)
... and 10 more

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

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 3 times, most recently from 8e2fa84 to 1128d85CompareSeptember 7, 2022 16:48
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased to fix a new test added in git.

Comment threadlightning/src/ln/functional_test_utils.rs Outdated
Comment threadpending_changelog/1699.txt Outdated
Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment on lines +652 to +654
/// `current_time` should be set higher than any previous `PeerManager` instance with the same
/// secret key. The simplest way to ensure this, of course, is to simply set it to the current
/// UNIX timestamp on startup.

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.

This isn't quite accurate or at least is unclear what is meant by "any previous PeerManager instance". It needs to be set higher than what was used to previously initialize plus the number of times that broadcast_node_announcement had previously been called. Maybe just say it should set to the current timestamp?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Tried to reword it. I don't want to be so strict as to tell users they need a clock here.

Comment threadCONTRIBUTING.md Outdated
Comment threadpending_changelog/1699.txt Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.
`PeerManager::new`'s new `current_time` argument must be set to the current time, not a counter, for any existing nodes which upgrade.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why bother saying "not a counter"? The counter was previously an implementation detail.

Also, shouldn't all nodes need to set it to the current time regardless if upgrading?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I guess the intent is that users can totally still use a counter if they want, but I'll drop the clause.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Re-added it with a bit more context now that there's similarly more context on the PeerManager constructors themselves.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 008bd35 to baf5848CompareSeptember 7, 2022 22:11
}
}
assert!(found_ann_1);
assert_eq!(a_events.len(), 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not still check for the node announcement?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We don't do a node announcement anymore that can be checked here - we don't have a PeerManager in the normal functional test environment, so can't test it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/peer_handler.rs
excess_data: Vec::new(),
};
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
let node_announce_sig = sign(&self.secp_ctx, &msghash, &self.our_node_secret);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm, so since PeerManager doesn't have a KeysInterface, it's not obvious to me how we'll get rid of this in the future (unlike with ChannelManager)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We need to move to PeerManager having a KeysInterface :). We need that anyway as we need to replace the peer ECDH with the KeysInterface ECDH.

Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.

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.

nit: Maybe we should use the commit hash instead of PR number, to keep the commit history independent from GH?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I dont think the file name matters at all. It just has to be unique, for all that it matters people could just put their name as long as things are unique.

Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
///
/// (C-not exported) as we can't export a PeerManager with a dummy channel handler
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

Probably doesn't work, but a thought: rather than the user supplying the current time and awkward docs, why not do what ChannelManager did previously and set it to 0 on startup, then compare_exchange it based on ChannelUpdates, etc that we receive that contain timestamps?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We can't be confident in the timestamps we get from random peers. ChannelManager used actual blocks, which we dont currently have in the peer handling, and I'm not sure its worth adding just for this.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a9e7424 to b3547f1CompareSeptember 8, 2022 17:52

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Basically LGTM if CI's happy

Comment threadlightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from b3547f1 to 2a064dfCompareSeptember 8, 2022 18:47
@valentinewallace

Copy link
Copy Markdown
Contributor

Looks good, fine to squash whenever on my end

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from 2a064df to 25a10a1CompareSeptember 8, 2022 18:50
Comment threadCONTRIBUTING.md Outdated
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }

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.

Should this be known? Think it might be changed in the follow-up already.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I think node features can be none, it just means no one will connect to us, which is good. We set more features in init, because we want to make connections to people, but I think node should be none.

Comment on lines +562 to +568
/// `current_time` is used as an always-increasing counter that survives across restarts and is
/// incremented irregularly internally. In general it is best to simply use the current UNIX
/// timestamp, however if it is not available a persistent counter that increases once per
/// minute should suffice.
///
/// (C-not exported) as we can't export a PeerManager with a dummy route handler
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

FWIW, we could always parameterize PeerManager by util::time::Time and provide implementations for (1) SystemTime and (2) a global counter. The latter would be for no-std and could be persisted when incremented. Would probably need an associated function to initialize the counter from persisted data / specify where to persist.

Since neither implementation needs to be instantiated (util::time::Time only has associated functions), we wouldn't need an extra method parameter anywhere. Just an idea. Happy to leave it to a follow-up, if desired.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The issue is the global counter would have to have some kind of persistence, which would mean we need the user involved. Otherwise we'd have a different API between no-std and std which I'm also not a fan of :/

When we connect to a new peer, immediately send them any
channel_announcement and channel_update messages for any public
channels we have with other peers. This allows us to stop sending
those messages on a timer when they have not changed and ensures
we are sending messages when we have peers connected, rather than
broadcasting at startup when we have no peers connected.
Some `NodeFeatures` will, in the future, represent features which
are not enabled by the `ChannelManager`, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the `ChannelManager`.
The simplest fix for this is to change to generating the
node_announcement in `PeerManager`, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.
This commit moves the `broadcast_node_announcement` function to
`PeerHandler` but does not yet implement feature OR'ing.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a83a363 to e2495f2CompareSeptember 8, 2022 19:50
@TheBlueMatt
TheBlueMatt merged commit ba69536 into lightningdevkit:mainSep 9, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@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" + ' Move broadcast_node_announcement to PeerManager by TheBlueMatt · Pull Request #1699 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move broadcast_node_announcement to PeerManager - #1699

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework
Sep 9, 2022
Merged

Move broadcast_node_announcement to PeerManager#1699
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some NodeFeatures will, in the future, represent features which
are not enabled by the ChannelManager, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the ChannelManager.

The simplest fix for this is to change to generating the
node_announcement in PeerManager, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.

This PR moves channel_announcement/update messages into peer connection handling and moves the broadcast_node_announcement function to
PeerHandler but does not yet implement feature OR'ing.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 1887a2e to dbb5885CompareSeptember 6, 2022 22:48
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/msgs.rs Outdated
@codecov-commenter

codecov-commenter commented Sep 6, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1699 (25a10a1) into main (301efc8) will decrease coverage by 0.13%.
The diff coverage is 74.28%.

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

@@ Coverage Diff @@## main #1699 +/- ##
==========================================
- Coverage 90.92% 90.78% -0.14% 
==========================================
Files 86 86 Lines 46417 46407 -10 Branches 46417 46407 -10 ==========================================
- Hits 42204 42132 -72 - Misses 4213 4275 +62 
Impacted FilesCoverage Δ
lightning/src/ln/functional_test_utils.rs93.68% <ø> (+0.09%)⬆️
lightning/src/ln/msgs.rs86.24% <ø> (ø)
lightning/src/util/events.rs36.58% <0.00%> (-2.92%)⬇️
lightning/src/ln/peer_handler.rs57.00% <30.00%> (-0.02%)⬇️
lightning/src/util/test_utils.rs77.18% <33.33%> (-0.31%)⬇️
lightning-net-tokio/src/lib.rs76.82% <75.00%> (-0.55%)⬇️
lightning/src/ln/channelmanager.rs84.94% <84.61%> (-0.06%)⬇️
lightning/src/ln/functional_tests.rs96.90% <91.66%> (-0.21%)⬇️
lightning-background-processor/src/lib.rs96.23% <100.00%> (ø)
lightning/src/ln/chanmon_update_fail_tests.rs97.72% <100.00%> (ø)
... and 10 more

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

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 3 times, most recently from 8e2fa84 to 1128d85CompareSeptember 7, 2022 16:48
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased to fix a new test added in git.

Comment threadlightning/src/ln/functional_test_utils.rs Outdated
Comment threadpending_changelog/1699.txt Outdated
Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment on lines +652 to +654
/// `current_time` should be set higher than any previous `PeerManager` instance with the same
/// secret key. The simplest way to ensure this, of course, is to simply set it to the current
/// UNIX timestamp on startup.

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.

This isn't quite accurate or at least is unclear what is meant by "any previous PeerManager instance". It needs to be set higher than what was used to previously initialize plus the number of times that broadcast_node_announcement had previously been called. Maybe just say it should set to the current timestamp?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Tried to reword it. I don't want to be so strict as to tell users they need a clock here.

Comment threadCONTRIBUTING.md Outdated
Comment threadpending_changelog/1699.txt Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.
`PeerManager::new`'s new `current_time` argument must be set to the current time, not a counter, for any existing nodes which upgrade.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why bother saying "not a counter"? The counter was previously an implementation detail.

Also, shouldn't all nodes need to set it to the current time regardless if upgrading?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I guess the intent is that users can totally still use a counter if they want, but I'll drop the clause.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Re-added it with a bit more context now that there's similarly more context on the PeerManager constructors themselves.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 008bd35 to baf5848CompareSeptember 7, 2022 22:11
}
}
assert!(found_ann_1);
assert_eq!(a_events.len(), 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not still check for the node announcement?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We don't do a node announcement anymore that can be checked here - we don't have a PeerManager in the normal functional test environment, so can't test it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/peer_handler.rs
excess_data: Vec::new(),
};
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
let node_announce_sig = sign(&self.secp_ctx, &msghash, &self.our_node_secret);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm, so since PeerManager doesn't have a KeysInterface, it's not obvious to me how we'll get rid of this in the future (unlike with ChannelManager)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We need to move to PeerManager having a KeysInterface :). We need that anyway as we need to replace the peer ECDH with the KeysInterface ECDH.

Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.

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.

nit: Maybe we should use the commit hash instead of PR number, to keep the commit history independent from GH?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I dont think the file name matters at all. It just has to be unique, for all that it matters people could just put their name as long as things are unique.

Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
///
/// (C-not exported) as we can't export a PeerManager with a dummy channel handler
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

Probably doesn't work, but a thought: rather than the user supplying the current time and awkward docs, why not do what ChannelManager did previously and set it to 0 on startup, then compare_exchange it based on ChannelUpdates, etc that we receive that contain timestamps?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We can't be confident in the timestamps we get from random peers. ChannelManager used actual blocks, which we dont currently have in the peer handling, and I'm not sure its worth adding just for this.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a9e7424 to b3547f1CompareSeptember 8, 2022 17:52

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Basically LGTM if CI's happy

Comment threadlightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from b3547f1 to 2a064dfCompareSeptember 8, 2022 18:47
@valentinewallace

Copy link
Copy Markdown
Contributor

Looks good, fine to squash whenever on my end

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from 2a064df to 25a10a1CompareSeptember 8, 2022 18:50
Comment threadCONTRIBUTING.md Outdated
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }

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.

Should this be known? Think it might be changed in the follow-up already.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I think node features can be none, it just means no one will connect to us, which is good. We set more features in init, because we want to make connections to people, but I think node should be none.

Comment on lines +562 to +568
/// `current_time` is used as an always-increasing counter that survives across restarts and is
/// incremented irregularly internally. In general it is best to simply use the current UNIX
/// timestamp, however if it is not available a persistent counter that increases once per
/// minute should suffice.
///
/// (C-not exported) as we can't export a PeerManager with a dummy route handler
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

FWIW, we could always parameterize PeerManager by util::time::Time and provide implementations for (1) SystemTime and (2) a global counter. The latter would be for no-std and could be persisted when incremented. Would probably need an associated function to initialize the counter from persisted data / specify where to persist.

Since neither implementation needs to be instantiated (util::time::Time only has associated functions), we wouldn't need an extra method parameter anywhere. Just an idea. Happy to leave it to a follow-up, if desired.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The issue is the global counter would have to have some kind of persistence, which would mean we need the user involved. Otherwise we'd have a different API between no-std and std which I'm also not a fan of :/

When we connect to a new peer, immediately send them any
channel_announcement and channel_update messages for any public
channels we have with other peers. This allows us to stop sending
those messages on a timer when they have not changed and ensures
we are sending messages when we have peers connected, rather than
broadcasting at startup when we have no peers connected.
Some `NodeFeatures` will, in the future, represent features which
are not enabled by the `ChannelManager`, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the `ChannelManager`.
The simplest fix for this is to change to generating the
node_announcement in `PeerManager`, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.
This commit moves the `broadcast_node_announcement` function to
`PeerHandler` but does not yet implement feature OR'ing.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a83a363 to e2495f2CompareSeptember 8, 2022 19:50
@TheBlueMatt
TheBlueMatt merged commit ba69536 into lightningdevkit:mainSep 9, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@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('^' + ".*" + ' Move broadcast_node_announcement to PeerManager by TheBlueMatt · Pull Request #1699 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move broadcast_node_announcement to PeerManager - #1699

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework
Sep 9, 2022
Merged

Move broadcast_node_announcement to PeerManager#1699
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some NodeFeatures will, in the future, represent features which
are not enabled by the ChannelManager, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the ChannelManager.

The simplest fix for this is to change to generating the
node_announcement in PeerManager, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.

This PR moves channel_announcement/update messages into peer connection handling and moves the broadcast_node_announcement function to
PeerHandler but does not yet implement feature OR'ing.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 1887a2e to dbb5885CompareSeptember 6, 2022 22:48
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/msgs.rs Outdated
@codecov-commenter

codecov-commenter commented Sep 6, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1699 (25a10a1) into main (301efc8) will decrease coverage by 0.13%.
The diff coverage is 74.28%.

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

@@ Coverage Diff @@## main #1699 +/- ##
==========================================
- Coverage 90.92% 90.78% -0.14% 
==========================================
Files 86 86 Lines 46417 46407 -10 Branches 46417 46407 -10 ==========================================
- Hits 42204 42132 -72 - Misses 4213 4275 +62 
Impacted FilesCoverage Δ
lightning/src/ln/functional_test_utils.rs93.68% <ø> (+0.09%)⬆️
lightning/src/ln/msgs.rs86.24% <ø> (ø)
lightning/src/util/events.rs36.58% <0.00%> (-2.92%)⬇️
lightning/src/ln/peer_handler.rs57.00% <30.00%> (-0.02%)⬇️
lightning/src/util/test_utils.rs77.18% <33.33%> (-0.31%)⬇️
lightning-net-tokio/src/lib.rs76.82% <75.00%> (-0.55%)⬇️
lightning/src/ln/channelmanager.rs84.94% <84.61%> (-0.06%)⬇️
lightning/src/ln/functional_tests.rs96.90% <91.66%> (-0.21%)⬇️
lightning-background-processor/src/lib.rs96.23% <100.00%> (ø)
lightning/src/ln/chanmon_update_fail_tests.rs97.72% <100.00%> (ø)
... and 10 more

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

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 3 times, most recently from 8e2fa84 to 1128d85CompareSeptember 7, 2022 16:48
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased to fix a new test added in git.

Comment threadlightning/src/ln/functional_test_utils.rs Outdated
Comment threadpending_changelog/1699.txt Outdated
Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment on lines +652 to +654
/// `current_time` should be set higher than any previous `PeerManager` instance with the same
/// secret key. The simplest way to ensure this, of course, is to simply set it to the current
/// UNIX timestamp on startup.

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.

This isn't quite accurate or at least is unclear what is meant by "any previous PeerManager instance". It needs to be set higher than what was used to previously initialize plus the number of times that broadcast_node_announcement had previously been called. Maybe just say it should set to the current timestamp?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Tried to reword it. I don't want to be so strict as to tell users they need a clock here.

Comment threadCONTRIBUTING.md Outdated
Comment threadpending_changelog/1699.txt Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.
`PeerManager::new`'s new `current_time` argument must be set to the current time, not a counter, for any existing nodes which upgrade.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why bother saying "not a counter"? The counter was previously an implementation detail.

Also, shouldn't all nodes need to set it to the current time regardless if upgrading?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I guess the intent is that users can totally still use a counter if they want, but I'll drop the clause.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Re-added it with a bit more context now that there's similarly more context on the PeerManager constructors themselves.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 008bd35 to baf5848CompareSeptember 7, 2022 22:11
}
}
assert!(found_ann_1);
assert_eq!(a_events.len(), 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not still check for the node announcement?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We don't do a node announcement anymore that can be checked here - we don't have a PeerManager in the normal functional test environment, so can't test it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/peer_handler.rs
excess_data: Vec::new(),
};
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
let node_announce_sig = sign(&self.secp_ctx, &msghash, &self.our_node_secret);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm, so since PeerManager doesn't have a KeysInterface, it's not obvious to me how we'll get rid of this in the future (unlike with ChannelManager)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We need to move to PeerManager having a KeysInterface :). We need that anyway as we need to replace the peer ECDH with the KeysInterface ECDH.

Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.

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.

nit: Maybe we should use the commit hash instead of PR number, to keep the commit history independent from GH?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I dont think the file name matters at all. It just has to be unique, for all that it matters people could just put their name as long as things are unique.

Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
///
/// (C-not exported) as we can't export a PeerManager with a dummy channel handler
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

Probably doesn't work, but a thought: rather than the user supplying the current time and awkward docs, why not do what ChannelManager did previously and set it to 0 on startup, then compare_exchange it based on ChannelUpdates, etc that we receive that contain timestamps?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We can't be confident in the timestamps we get from random peers. ChannelManager used actual blocks, which we dont currently have in the peer handling, and I'm not sure its worth adding just for this.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a9e7424 to b3547f1CompareSeptember 8, 2022 17:52

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Basically LGTM if CI's happy

Comment threadlightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from b3547f1 to 2a064dfCompareSeptember 8, 2022 18:47
@valentinewallace

Copy link
Copy Markdown
Contributor

Looks good, fine to squash whenever on my end

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from 2a064df to 25a10a1CompareSeptember 8, 2022 18:50
Comment threadCONTRIBUTING.md Outdated
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }

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.

Should this be known? Think it might be changed in the follow-up already.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I think node features can be none, it just means no one will connect to us, which is good. We set more features in init, because we want to make connections to people, but I think node should be none.

Comment on lines +562 to +568
/// `current_time` is used as an always-increasing counter that survives across restarts and is
/// incremented irregularly internally. In general it is best to simply use the current UNIX
/// timestamp, however if it is not available a persistent counter that increases once per
/// minute should suffice.
///
/// (C-not exported) as we can't export a PeerManager with a dummy route handler
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

FWIW, we could always parameterize PeerManager by util::time::Time and provide implementations for (1) SystemTime and (2) a global counter. The latter would be for no-std and could be persisted when incremented. Would probably need an associated function to initialize the counter from persisted data / specify where to persist.

Since neither implementation needs to be instantiated (util::time::Time only has associated functions), we wouldn't need an extra method parameter anywhere. Just an idea. Happy to leave it to a follow-up, if desired.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The issue is the global counter would have to have some kind of persistence, which would mean we need the user involved. Otherwise we'd have a different API between no-std and std which I'm also not a fan of :/

When we connect to a new peer, immediately send them any
channel_announcement and channel_update messages for any public
channels we have with other peers. This allows us to stop sending
those messages on a timer when they have not changed and ensures
we are sending messages when we have peers connected, rather than
broadcasting at startup when we have no peers connected.
Some `NodeFeatures` will, in the future, represent features which
are not enabled by the `ChannelManager`, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the `ChannelManager`.
The simplest fix for this is to change to generating the
node_announcement in `PeerManager`, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.
This commit moves the `broadcast_node_announcement` function to
`PeerHandler` but does not yet implement feature OR'ing.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a83a363 to e2495f2CompareSeptember 8, 2022 19:50
@TheBlueMatt
TheBlueMatt merged commit ba69536 into lightningdevkit:mainSep 9, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@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('^' + ".*" + ' Move broadcast_node_announcement to PeerManager by TheBlueMatt · Pull Request #1699 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move broadcast_node_announcement to PeerManager - #1699

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework
Sep 9, 2022
Merged

Move broadcast_node_announcement to PeerManager#1699
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some NodeFeatures will, in the future, represent features which
are not enabled by the ChannelManager, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the ChannelManager.

The simplest fix for this is to change to generating the
node_announcement in PeerManager, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.

This PR moves channel_announcement/update messages into peer connection handling and moves the broadcast_node_announcement function to
PeerHandler but does not yet implement feature OR'ing.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 1887a2e to dbb5885CompareSeptember 6, 2022 22:48
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/msgs.rs Outdated
@codecov-commenter

codecov-commenter commented Sep 6, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1699 (25a10a1) into main (301efc8) will decrease coverage by 0.13%.
The diff coverage is 74.28%.

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

@@ Coverage Diff @@## main #1699 +/- ##
==========================================
- Coverage 90.92% 90.78% -0.14% 
==========================================
Files 86 86 Lines 46417 46407 -10 Branches 46417 46407 -10 ==========================================
- Hits 42204 42132 -72 - Misses 4213 4275 +62 
Impacted FilesCoverage Δ
lightning/src/ln/functional_test_utils.rs93.68% <ø> (+0.09%)⬆️
lightning/src/ln/msgs.rs86.24% <ø> (ø)
lightning/src/util/events.rs36.58% <0.00%> (-2.92%)⬇️
lightning/src/ln/peer_handler.rs57.00% <30.00%> (-0.02%)⬇️
lightning/src/util/test_utils.rs77.18% <33.33%> (-0.31%)⬇️
lightning-net-tokio/src/lib.rs76.82% <75.00%> (-0.55%)⬇️
lightning/src/ln/channelmanager.rs84.94% <84.61%> (-0.06%)⬇️
lightning/src/ln/functional_tests.rs96.90% <91.66%> (-0.21%)⬇️
lightning-background-processor/src/lib.rs96.23% <100.00%> (ø)
lightning/src/ln/chanmon_update_fail_tests.rs97.72% <100.00%> (ø)
... and 10 more

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

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 3 times, most recently from 8e2fa84 to 1128d85CompareSeptember 7, 2022 16:48
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased to fix a new test added in git.

Comment threadlightning/src/ln/functional_test_utils.rs Outdated
Comment threadpending_changelog/1699.txt Outdated
Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment on lines +652 to +654
/// `current_time` should be set higher than any previous `PeerManager` instance with the same
/// secret key. The simplest way to ensure this, of course, is to simply set it to the current
/// UNIX timestamp on startup.

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.

This isn't quite accurate or at least is unclear what is meant by "any previous PeerManager instance". It needs to be set higher than what was used to previously initialize plus the number of times that broadcast_node_announcement had previously been called. Maybe just say it should set to the current timestamp?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Tried to reword it. I don't want to be so strict as to tell users they need a clock here.

Comment threadCONTRIBUTING.md Outdated
Comment threadpending_changelog/1699.txt Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.
`PeerManager::new`'s new `current_time` argument must be set to the current time, not a counter, for any existing nodes which upgrade.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why bother saying "not a counter"? The counter was previously an implementation detail.

Also, shouldn't all nodes need to set it to the current time regardless if upgrading?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I guess the intent is that users can totally still use a counter if they want, but I'll drop the clause.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Re-added it with a bit more context now that there's similarly more context on the PeerManager constructors themselves.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 008bd35 to baf5848CompareSeptember 7, 2022 22:11
}
}
assert!(found_ann_1);
assert_eq!(a_events.len(), 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not still check for the node announcement?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We don't do a node announcement anymore that can be checked here - we don't have a PeerManager in the normal functional test environment, so can't test it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/peer_handler.rs
excess_data: Vec::new(),
};
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
let node_announce_sig = sign(&self.secp_ctx, &msghash, &self.our_node_secret);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm, so since PeerManager doesn't have a KeysInterface, it's not obvious to me how we'll get rid of this in the future (unlike with ChannelManager)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We need to move to PeerManager having a KeysInterface :). We need that anyway as we need to replace the peer ECDH with the KeysInterface ECDH.

Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.

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.

nit: Maybe we should use the commit hash instead of PR number, to keep the commit history independent from GH?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I dont think the file name matters at all. It just has to be unique, for all that it matters people could just put their name as long as things are unique.

Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
///
/// (C-not exported) as we can't export a PeerManager with a dummy channel handler
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

Probably doesn't work, but a thought: rather than the user supplying the current time and awkward docs, why not do what ChannelManager did previously and set it to 0 on startup, then compare_exchange it based on ChannelUpdates, etc that we receive that contain timestamps?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We can't be confident in the timestamps we get from random peers. ChannelManager used actual blocks, which we dont currently have in the peer handling, and I'm not sure its worth adding just for this.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a9e7424 to b3547f1CompareSeptember 8, 2022 17:52

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Basically LGTM if CI's happy

Comment threadlightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from b3547f1 to 2a064dfCompareSeptember 8, 2022 18:47
@valentinewallace

Copy link
Copy Markdown
Contributor

Looks good, fine to squash whenever on my end

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from 2a064df to 25a10a1CompareSeptember 8, 2022 18:50
Comment threadCONTRIBUTING.md Outdated
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }

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.

Should this be known? Think it might be changed in the follow-up already.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I think node features can be none, it just means no one will connect to us, which is good. We set more features in init, because we want to make connections to people, but I think node should be none.

Comment on lines +562 to +568
/// `current_time` is used as an always-increasing counter that survives across restarts and is
/// incremented irregularly internally. In general it is best to simply use the current UNIX
/// timestamp, however if it is not available a persistent counter that increases once per
/// minute should suffice.
///
/// (C-not exported) as we can't export a PeerManager with a dummy route handler
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

FWIW, we could always parameterize PeerManager by util::time::Time and provide implementations for (1) SystemTime and (2) a global counter. The latter would be for no-std and could be persisted when incremented. Would probably need an associated function to initialize the counter from persisted data / specify where to persist.

Since neither implementation needs to be instantiated (util::time::Time only has associated functions), we wouldn't need an extra method parameter anywhere. Just an idea. Happy to leave it to a follow-up, if desired.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The issue is the global counter would have to have some kind of persistence, which would mean we need the user involved. Otherwise we'd have a different API between no-std and std which I'm also not a fan of :/

When we connect to a new peer, immediately send them any
channel_announcement and channel_update messages for any public
channels we have with other peers. This allows us to stop sending
those messages on a timer when they have not changed and ensures
we are sending messages when we have peers connected, rather than
broadcasting at startup when we have no peers connected.
Some `NodeFeatures` will, in the future, represent features which
are not enabled by the `ChannelManager`, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the `ChannelManager`.
The simplest fix for this is to change to generating the
node_announcement in `PeerManager`, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.
This commit moves the `broadcast_node_announcement` function to
`PeerHandler` but does not yet implement feature OR'ing.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a83a363 to e2495f2CompareSeptember 8, 2022 19:50
@TheBlueMatt
TheBlueMatt merged commit ba69536 into lightningdevkit:mainSep 9, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@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); } })(); })(); Move broadcast_node_announcement to PeerManager by TheBlueMatt · Pull Request #1699 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move broadcast_node_announcement to PeerManager - #1699

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework
Sep 9, 2022
Merged

Move broadcast_node_announcement to PeerManager#1699
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-08-announcement-rework

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Some NodeFeatures will, in the future, represent features which
are not enabled by the ChannelManager, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the ChannelManager.

The simplest fix for this is to change to generating the
node_announcement in PeerManager, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.

This PR moves channel_announcement/update messages into peer connection handling and moves the broadcast_node_announcement function to
PeerHandler but does not yet implement feature OR'ing.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 1887a2e to dbb5885CompareSeptember 6, 2022 22:48
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/msgs.rs Outdated
@codecov-commenter

codecov-commenter commented Sep 6, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1699 (25a10a1) into main (301efc8) will decrease coverage by 0.13%.
The diff coverage is 74.28%.

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

@@ Coverage Diff @@## main #1699 +/- ##
==========================================
- Coverage 90.92% 90.78% -0.14% 
==========================================
Files 86 86 Lines 46417 46407 -10 Branches 46417 46407 -10 ==========================================
- Hits 42204 42132 -72 - Misses 4213 4275 +62 
Impacted FilesCoverage Δ
lightning/src/ln/functional_test_utils.rs93.68% <ø> (+0.09%)⬆️
lightning/src/ln/msgs.rs86.24% <ø> (ø)
lightning/src/util/events.rs36.58% <0.00%> (-2.92%)⬇️
lightning/src/ln/peer_handler.rs57.00% <30.00%> (-0.02%)⬇️
lightning/src/util/test_utils.rs77.18% <33.33%> (-0.31%)⬇️
lightning-net-tokio/src/lib.rs76.82% <75.00%> (-0.55%)⬇️
lightning/src/ln/channelmanager.rs84.94% <84.61%> (-0.06%)⬇️
lightning/src/ln/functional_tests.rs96.90% <91.66%> (-0.21%)⬇️
lightning-background-processor/src/lib.rs96.23% <100.00%> (ø)
lightning/src/ln/chanmon_update_fail_tests.rs97.72% <100.00%> (ø)
... and 10 more

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

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 3 times, most recently from 8e2fa84 to 1128d85CompareSeptember 7, 2022 16:48
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased to fix a new test added in git.

Comment threadlightning/src/ln/functional_test_utils.rs Outdated
Comment threadpending_changelog/1699.txt Outdated
Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment on lines +652 to +654
/// `current_time` should be set higher than any previous `PeerManager` instance with the same
/// secret key. The simplest way to ensure this, of course, is to simply set it to the current
/// UNIX timestamp on startup.

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.

This isn't quite accurate or at least is unclear what is meant by "any previous PeerManager instance". It needs to be set higher than what was used to previously initialize plus the number of times that broadcast_node_announcement had previously been called. Maybe just say it should set to the current timestamp?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Tried to reword it. I don't want to be so strict as to tell users they need a clock here.

Comment threadCONTRIBUTING.md Outdated
Comment threadpending_changelog/1699.txt Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.
`PeerManager::new`'s new `current_time` argument must be set to the current time, not a counter, for any existing nodes which upgrade.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why bother saying "not a counter"? The counter was previously an implementation detail.

Also, shouldn't all nodes need to set it to the current time regardless if upgrading?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I guess the intent is that users can totally still use a counter if they want, but I'll drop the clause.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Re-added it with a bit more context now that there's similarly more context on the PeerManager constructors themselves.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch 2 times, most recently from 008bd35 to baf5848CompareSeptember 7, 2022 22:11
}
}
assert!(found_ann_1);
assert_eq!(a_events.len(), 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not still check for the node announcement?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We don't do a node announcement anymore that can be checked here - we don't have a PeerManager in the normal functional test environment, so can't test it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/peer_handler.rs
excess_data: Vec::new(),
};
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
let node_announce_sig = sign(&self.secp_ctx, &msghash, &self.our_node_secret);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm, so since PeerManager doesn't have a KeysInterface, it's not obvious to me how we'll get rid of this in the future (unlike with ChannelManager)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We need to move to PeerManager having a KeysInterface :). We need that anyway as we need to replace the peer ECDH with the KeysInterface ECDH.

Comment threadlightning/src/ln/peer_handler.rs Outdated
Comment threadlightning/src/util/events.rs Outdated
@@ -0,0 +1,2 @@
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`.

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.

nit: Maybe we should use the commit hash instead of PR number, to keep the commit history independent from GH?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I dont think the file name matters at all. It just has to be unique, for all that it matters people could just put their name as long as things are unique.

Comment threadlightning/src/ln/peer_handler.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
///
/// (C-not exported) as we can't export a PeerManager with a dummy channel handler
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_routing_only(routing_message_handler: RM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

Probably doesn't work, but a thought: rather than the user supplying the current time and awkward docs, why not do what ChannelManager did previously and set it to 0 on startup, then compare_exchange it based on ChannelUpdates, etc that we receive that contain timestamps?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

We can't be confident in the timestamps we get from random peers. ChannelManager used actual blocks, which we dont currently have in the peer handling, and I'm not sure its worth adding just for this.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a9e7424 to b3547f1CompareSeptember 8, 2022 17:52

@valentinewallacevalentinewallace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Basically LGTM if CI's happy

Comment threadlightning/src/ln/channelmanager.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from b3547f1 to 2a064dfCompareSeptember 8, 2022 18:47
@valentinewallace

Copy link
Copy Markdown
Contributor

Looks good, fine to squash whenever on my end

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from 2a064df to 25a10a1CompareSeptember 8, 2022 18:50
Comment threadCONTRIBUTING.md Outdated
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }

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.

Should this be known? Think it might be changed in the follow-up already.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I think node features can be none, it just means no one will connect to us, which is good. We set more features in init, because we want to make connections to people, but I think node should be none.

Comment on lines +562 to +568
/// `current_time` is used as an always-increasing counter that survives across restarts and is
/// incremented irregularly internally. In general it is best to simply use the current UNIX
/// timestamp, however if it is not available a persistent counter that increases once per
/// minute should suffice.
///
/// (C-not exported) as we can't export a PeerManager with a dummy route handler
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, ephemeral_random_data: &[u8; 32], logger: L) -> Self {
pub fn new_channel_only(channel_message_handler: CM, onion_message_handler: OM, our_node_secret: SecretKey, current_time: u64, ephemeral_random_data: &[u8; 32], logger: L) -> Self {

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.

FWIW, we could always parameterize PeerManager by util::time::Time and provide implementations for (1) SystemTime and (2) a global counter. The latter would be for no-std and could be persisted when incremented. Would probably need an associated function to initialize the counter from persisted data / specify where to persist.

Since neither implementation needs to be instantiated (util::time::Time only has associated functions), we wouldn't need an extra method parameter anywhere. Just an idea. Happy to leave it to a follow-up, if desired.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

The issue is the global counter would have to have some kind of persistence, which would mean we need the user involved. Otherwise we'd have a different API between no-std and std which I'm also not a fan of :/

When we connect to a new peer, immediately send them any
channel_announcement and channel_update messages for any public
channels we have with other peers. This allows us to stop sending
those messages on a timer when they have not changed and ensures
we are sending messages when we have peers connected, rather than
broadcasting at startup when we have no peers connected.
Some `NodeFeatures` will, in the future, represent features which
are not enabled by the `ChannelManager`, but by other message
handlers handlers. Thus, it doesn't make sense to determine the
node feature bits in the `ChannelManager`.
The simplest fix for this is to change to generating the
node_announcement in `PeerManager`, asking all the connected
handlers which feature bits they support and simply OR'ing them
together. While this may not be sufficient in the future as it
doesn't consider feature bit dependencies, support for those could
be handled at the feature level in the future.
This commit moves the `broadcast_node_announcement` function to
`PeerHandler` but does not yet implement feature OR'ing.
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-08-announcement-rework branch from a83a363 to e2495f2CompareSeptember 8, 2022 19:50
@TheBlueMatt
TheBlueMatt merged commit ba69536 into lightningdevkit:mainSep 9, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@jkczyz