-
Notifications
You must be signed in to change notification settings - Fork 376
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Move broadcast_node_announcement to PeerManager #1699
Move broadcast_node_announcement to PeerManager #1699
Conversation
1887a2e
to
dbb5885
Compare
Codecov Report
@@ 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
Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here. |
8e2fa84
to
1128d85
Compare
Rebased to fix a new test added in git. |
lightning/src/ln/peer_handler.rs
Outdated
/// `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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This 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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tried to reword it. I don't want to be so strict as to tell users they need a clock here.
pending_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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess the intent is that users can totally still use a counter if they want, but I'll drop the clause.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Re-added it with a bit more context now that there's similarly more context on the PeerManager constructors themselves.
008bd35
to
baf5848
Compare
} | ||
} | ||
assert!(found_ann_1); | ||
assert_eq!(a_events.len(), 1); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not still check for the node announcement?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We 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.
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); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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
)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need to move to PeerManager
having a KeysInterface
:). We need that anyway as we need to replace the peer ECDH with the KeysInterface
ECDH.
@@ -0,0 +1,2 @@ | |||
`broadcast_node_announcement` has been moved to `PeerManager` from `ChannelManager`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Maybe we should use the commit hash instead of PR number, to keep the commit history independent from GH?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I 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.
/// ephemeral_random_data is used to derive per-connection ephemeral keys and must be | ||
/// cryptographically secure random bytes. | ||
/// | ||
/// (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 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 ChannelUpdate
s, etc that we receive that contain timestamps?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We 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.
a9e7424
to
b3547f1
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Basically LGTM if CI's happy
b3547f1
to
2a064df
Compare
Looks good, fine to squash whenever on my end |
2a064df
to
25a10a1
Compare
@@ -200,6 +202,7 @@ impl ChannelMessageHandler for ErroringMessageHandler { | |||
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() } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should this be known
? Think it might be changed in the follow-up already.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think 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.
/// `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 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Squashed. |
a83a363
to
e2495f2
Compare
Some
NodeFeatures
will, in the future, represent features whichare not enabled by the
ChannelManager
, but by other messagehandlers 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 connectedhandlers 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 toPeerHandler
but does not yet implement feature OR'ing.