mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 23:08:36 +01:00
Merge pull request #1717 from TheBlueMatt/2022-09-req-features-in-handlers
Move checking of specific require peer feature bits to handlers
This commit is contained in:
commit
d2a9ae0b8e
17 changed files with 134 additions and 91 deletions
|
@ -754,8 +754,8 @@ mod tests {
|
|||
|
||||
for i in 0..num_nodes {
|
||||
for j in (i+1)..num_nodes {
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -577,7 +577,7 @@ mod tests {
|
|||
fn handle_channel_update(&self, _msg: &ChannelUpdate) -> Result<bool, LightningError> { Ok(false) }
|
||||
fn get_next_channel_announcement(&self, _starting_point: u64) -> Option<(ChannelAnnouncement, Option<ChannelUpdate>, Option<ChannelUpdate>)> { None }
|
||||
fn get_next_node_announcement(&self, _starting_point: Option<&PublicKey>) -> Option<NodeAnnouncement> { None }
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _init_msg: &Init) { }
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _init_msg: &Init) -> Result<(), ()> { Ok(()) }
|
||||
fn handle_reply_channel_range(&self, _their_node_id: &PublicKey, _msg: ReplyChannelRange) -> Result<(), LightningError> { Ok(()) }
|
||||
fn handle_reply_short_channel_ids_end(&self, _their_node_id: &PublicKey, _msg: ReplyShortChannelIdsEnd) -> Result<(), LightningError> { Ok(()) }
|
||||
fn handle_query_channel_range(&self, _their_node_id: &PublicKey, _msg: QueryChannelRange) -> Result<(), LightningError> { Ok(()) }
|
||||
|
@ -608,10 +608,11 @@ mod tests {
|
|||
self.pubkey_disconnected.clone().try_send(()).unwrap();
|
||||
}
|
||||
}
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, _msg: &Init) {
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, _init_msg: &Init) -> Result<(), ()> {
|
||||
if *their_node_id == self.expected_pubkey {
|
||||
self.pubkey_connected.clone().try_send(()).unwrap();
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &ChannelReestablish) {}
|
||||
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &ErrorMessage) {}
|
||||
|
|
|
@ -347,10 +347,10 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
@ -369,10 +369,10 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
|||
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
@ -1123,8 +1123,8 @@ fn test_monitor_update_fail_reestablish() {
|
|||
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);
|
||||
|
||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
|
||||
let as_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
@ -1142,8 +1142,8 @@ fn test_monitor_update_fail_reestablish() {
|
|||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
|
||||
assert_eq!(get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap(), as_reestablish);
|
||||
assert_eq!(get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap(), bs_reestablish);
|
||||
|
@ -1316,8 +1316,8 @@ fn claim_while_disconnected_monitor_update_fail() {
|
|||
check_added_monitors!(nodes[1], 1);
|
||||
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
|
||||
let as_reconnect = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
let bs_reconnect = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
@ -1448,8 +1448,8 @@ fn monitor_failed_no_reestablish_response() {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
|
||||
let as_reconnect = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
let bs_reconnect = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
@ -2031,9 +2031,9 @@ fn test_pending_update_fee_ack_on_reconnect() {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let as_connect_msg = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let bs_connect_msg = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_connect_msg);
|
||||
|
@ -2159,9 +2159,9 @@ fn do_update_fee_resend_test(deliver_update: bool, parallel_updates: bool) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let as_connect_msg = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let bs_connect_msg = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_connect_msg);
|
||||
|
@ -2324,10 +2324,10 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
|
|||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
// Now reconnect the two
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
|
|
@ -3550,6 +3550,12 @@ impl<Signer: Sign> Channel<Signer> {
|
|||
return;
|
||||
}
|
||||
|
||||
if self.channel_state & (ChannelState::PeerDisconnected as u32) == (ChannelState::PeerDisconnected as u32) {
|
||||
// While the below code should be idempotent, it's simpler to just return early, as
|
||||
// redundant disconnect events can fire, though they should be rare.
|
||||
return;
|
||||
}
|
||||
|
||||
if self.announcement_sigs_state == AnnouncementSigsState::MessageSent || self.announcement_sigs_state == AnnouncementSigsState::Committed {
|
||||
self.announcement_sigs_state = AnnouncementSigsState::NotSent;
|
||||
}
|
||||
|
|
|
@ -6034,7 +6034,12 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
|
|||
}
|
||||
}
|
||||
|
||||
fn peer_connected(&self, counterparty_node_id: &PublicKey, init_msg: &msgs::Init) {
|
||||
fn peer_connected(&self, counterparty_node_id: &PublicKey, init_msg: &msgs::Init) -> Result<(), ()> {
|
||||
if !init_msg.features.supports_static_remote_key() {
|
||||
log_debug!(self.logger, "Peer {} does not support static remote key, disconnecting with no_connection_possible", log_pubkey!(counterparty_node_id));
|
||||
return Err(());
|
||||
}
|
||||
|
||||
log_debug!(self.logger, "Generating channel_reestablish events for {}", log_pubkey!(counterparty_node_id));
|
||||
|
||||
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
|
||||
|
@ -6085,6 +6090,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
|
|||
retain
|
||||
});
|
||||
//TODO: Also re-broadcast announcement_signatures
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_error(&self, counterparty_node_id: &PublicKey, msg: &msgs::ErrorMessage) {
|
||||
|
@ -7480,8 +7486,8 @@ mod tests {
|
|||
|
||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||
let payee_pubkey = nodes[1].node.get_our_node_id();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||
let route_params = RouteParameters {
|
||||
|
@ -7524,8 +7530,8 @@ mod tests {
|
|||
|
||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||
let payee_pubkey = nodes[1].node.get_our_node_id();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||
let route_params = RouteParameters {
|
||||
|
@ -7803,8 +7809,8 @@ pub mod bench {
|
|||
});
|
||||
let node_b_holder = NodeHolder { node: &node_b };
|
||||
|
||||
node_a.peer_connected(&node_b.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
node_b.peer_connected(&node_a.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
node_a.peer_connected(&node_b.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
node_b.peer_connected(&node_a.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
node_a.create_channel(node_b.get_our_node_id(), 8_000_000, 100_000_000, 42, None).unwrap();
|
||||
node_b.handle_open_channel(&node_a.get_our_node_id(), InitFeatures::known(), &get_event_msg!(node_a_holder, MessageSendEvent::SendOpenChannel, node_b.get_our_node_id()));
|
||||
node_a.handle_accept_channel(&node_b.get_our_node_id(), InitFeatures::known(), &get_event_msg!(node_b_holder, MessageSendEvent::SendAcceptChannel, node_a.get_our_node_id()));
|
||||
|
|
|
@ -2108,8 +2108,8 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
|
|||
|
||||
for i in 0..node_count {
|
||||
for j in (i+1)..node_count {
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &msgs::Init { features: cfgs[j].features.clone(), remote_network_address: None });
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &msgs::Init { features: cfgs[i].features.clone(), remote_network_address: None });
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &msgs::Init { features: cfgs[j].features.clone(), remote_network_address: None }).unwrap();
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &msgs::Init { features: cfgs[i].features.clone(), remote_network_address: None }).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2383,9 +2383,9 @@ macro_rules! handle_chan_reestablish_msgs {
|
|||
/// pending_htlc_adds includes both the holding cell and in-flight update_add_htlcs, whereas
|
||||
/// for claims/fails they are separated out.
|
||||
pub fn reconnect_nodes<'a, 'b, 'c>(node_a: &Node<'a, 'b, 'c>, node_b: &Node<'a, 'b, 'c>, send_channel_ready: (bool, bool), pending_htlc_adds: (i64, i64), pending_htlc_claims: (usize, usize), pending_htlc_fails: (usize, usize), pending_cell_htlc_claims: (usize, usize), pending_cell_htlc_fails: (usize, usize), pending_raa: (bool, bool)) {
|
||||
node_a.node.peer_connected(&node_b.node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
node_a.node.peer_connected(&node_b.node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(node_a, node_b);
|
||||
node_b.node.peer_connected(&node_a.node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
node_b.node.peer_connected(&node_a.node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(node_b, node_a);
|
||||
|
||||
if send_channel_ready.0 {
|
||||
|
|
|
@ -3894,9 +3894,9 @@ fn test_funding_peer_disconnect() {
|
|||
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
|
||||
assert!(events_2.is_empty());
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let as_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
||||
// nodes[0] hasn't yet received a channel_ready, so it only sends that on reconnect.
|
||||
|
@ -4127,10 +4127,10 @@ fn test_drop_messages_peer_disconnect_dual_htlc() {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
@ -4406,9 +4406,9 @@ fn test_no_txn_manager_serialize_deserialize() {
|
|||
assert_eq!(nodes[0].node.list_channels().len(), 1);
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &reestablish_1[0]);
|
||||
|
@ -4526,9 +4526,9 @@ fn test_manager_serialize_deserialize_events() {
|
|||
assert_eq!(nodes[0].node.list_channels().len(), 1);
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &reestablish_1[0]);
|
||||
|
@ -4721,9 +4721,9 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
|
|||
//... and we can even still claim the payment!
|
||||
claim_payment(&nodes[2], &[&nodes[0], &nodes[1]], our_payment_preimage);
|
||||
|
||||
nodes[3].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[3].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish = get_chan_reestablish_msgs!(nodes[3], nodes[0]).pop().unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[3].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[3].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[3].node.get_our_node_id(), &reestablish);
|
||||
let mut found_err = false;
|
||||
for msg_event in nodes[0].node.get_and_clear_pending_msg_events() {
|
||||
|
@ -6837,10 +6837,10 @@ fn test_update_add_htlc_bolt2_receiver_check_repeated_id_ignore() {
|
|||
//Disconnect and Reconnect
|
||||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &reestablish_2[0]);
|
||||
|
@ -7552,8 +7552,8 @@ fn do_test_data_loss_protect(reconnect_panicing: bool) {
|
|||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
if reconnect_panicing {
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
|
||||
|
@ -7601,8 +7601,8 @@ fn do_test_data_loss_protect(reconnect_panicing: bool) {
|
|||
// after the warning message sent by B, we should not able to
|
||||
// use the channel, or reconnect with success to the channel.
|
||||
assert!(nodes[0].node.list_usable_channels().is_empty());
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let retry_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &retry_reestablish[0]);
|
||||
|
@ -7737,10 +7737,10 @@ fn test_announce_disable_channels() {
|
|||
}
|
||||
}
|
||||
// Reconnect peers
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 3);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 3);
|
||||
|
||||
|
@ -10030,8 +10030,8 @@ fn test_keysend_payments_to_private_node() {
|
|||
|
||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||
let payee_pubkey = nodes[1].node.get_our_node_id();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||
let route_params = RouteParameters {
|
||||
|
@ -10264,9 +10264,9 @@ fn do_test_partial_claim_before_restart(persist_both_monitors: bool) {
|
|||
if !persist_both_monitors {
|
||||
// If one of the two channels is still live, reveal the payment preimage over it.
|
||||
|
||||
nodes[3].node.peer_connected(&nodes[2].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[3].node.peer_connected(&nodes[2].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[3], nodes[2]);
|
||||
nodes[2].node.peer_connected(&nodes[3].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[2].node.peer_connected(&nodes[3].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[2], nodes[3]);
|
||||
|
||||
nodes[2].node.handle_channel_reestablish(&nodes[3].node.get_our_node_id(), &reestablish_1[0]);
|
||||
|
|
|
@ -883,10 +883,17 @@ pub trait ChannelMessageHandler : MessageSendEventsProvider {
|
|||
/// is believed to be possible in the future (eg they're sending us messages we don't
|
||||
/// understand or indicate they require unknown feature bits), no_connection_possible is set
|
||||
/// and any outstanding channels should be failed.
|
||||
///
|
||||
/// Note that in some rare cases this may be called without a corresponding
|
||||
/// [`Self::peer_connected`].
|
||||
fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
|
||||
|
||||
/// Handle a peer reconnecting, possibly generating channel_reestablish message(s).
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, msg: &Init);
|
||||
///
|
||||
/// May return an `Err(())` if the features the peer supports are not sufficient to communicate
|
||||
/// with us. Implementors should be somewhat conservative about doing so, however, as other
|
||||
/// message handlers may still wish to communicate with this peer.
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, msg: &Init) -> Result<(), ()>;
|
||||
/// Handle an incoming channel_reestablish message from the given peer.
|
||||
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &ChannelReestablish);
|
||||
|
||||
|
@ -940,7 +947,11 @@ pub trait RoutingMessageHandler : MessageSendEventsProvider {
|
|||
/// Called when a connection is established with a peer. This can be used to
|
||||
/// perform routing table synchronization using a strategy defined by the
|
||||
/// implementor.
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init: &Init);
|
||||
///
|
||||
/// May return an `Err(())` if the features the peer supports are not sufficient to communicate
|
||||
/// with us. Implementors should be somewhat conservative about doing so, however, as other
|
||||
/// message handlers may still wish to communicate with this peer.
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init: &Init) -> Result<(), ()>;
|
||||
/// Handles the reply of a query we initiated to learn about channels
|
||||
/// for a given range of blocks. We can expect to receive one or more
|
||||
/// replies to a single query.
|
||||
|
@ -976,9 +987,16 @@ pub trait OnionMessageHandler : OnionMessageProvider {
|
|||
fn handle_onion_message(&self, peer_node_id: &PublicKey, msg: &OnionMessage);
|
||||
/// Called when a connection is established with a peer. Can be used to track which peers
|
||||
/// advertise onion message support and are online.
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init: &Init);
|
||||
///
|
||||
/// May return an `Err(())` if the features the peer supports are not sufficient to communicate
|
||||
/// with us. Implementors should be somewhat conservative about doing so, however, as other
|
||||
/// message handlers may still wish to communicate with this peer.
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init: &Init) -> Result<(), ()>;
|
||||
/// Indicates a connection to the peer failed/an existing connection was lost. Allows handlers to
|
||||
/// drop and refuse to forward onion messages to this peer.
|
||||
///
|
||||
/// Note that in some rare cases this may be called without a corresponding
|
||||
/// [`Self::peer_connected`].
|
||||
fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
|
||||
|
||||
// Handler information:
|
||||
|
|
|
@ -887,10 +887,12 @@ fn test_do_not_default_to_onion_payload_tlv_format_when_unsupported() {
|
|||
let chanmon_cfgs = create_chanmon_cfgs(4);
|
||||
let mut node_cfgs = create_node_cfgs(4, &chanmon_cfgs);
|
||||
|
||||
// Set `node[1]` config to `InitFeatures::empty()` which return `false` for
|
||||
// `supports_variable_length_onion()`
|
||||
// Set `node[1]` config to `InitFeatures::empty()` + `static_remote_key` which implies
|
||||
// `!supports_variable_length_onion()` but still supports the required static-remote-key
|
||||
// feature.
|
||||
let mut node_1_cfg = &mut node_cfgs[1];
|
||||
node_1_cfg.features = InitFeatures::empty();
|
||||
node_1_cfg.features.set_static_remote_key_required();
|
||||
|
||||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
|
|
@ -451,12 +451,12 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
|||
assert_eq!(as_broadcasted_txn[0], as_commitment_tx);
|
||||
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
// Now nodes[1] should send a channel reestablish, which nodes[0] will respond to with an
|
||||
// error, as the channel has hit the chain.
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
|
||||
let as_err = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -670,12 +670,12 @@ fn do_test_completed_payment_not_retryable_on_reload(use_dust: bool) {
|
|||
assert!(nodes[0].node.has_pending_payments());
|
||||
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0).len(), 1);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
// Now nodes[1] should send a channel reestablish, which nodes[0] will respond to with an
|
||||
// error, as the channel has hit the chain.
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
|
||||
let as_err = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
|
|
@ -73,7 +73,7 @@ impl RoutingMessageHandler for IgnoringMessageHandler {
|
|||
fn get_next_channel_announcement(&self, _starting_point: u64) ->
|
||||
Option<(msgs::ChannelAnnouncement, Option<msgs::ChannelUpdate>, Option<msgs::ChannelUpdate>)> { None }
|
||||
fn get_next_node_announcement(&self, _starting_point: Option<&PublicKey>) -> Option<msgs::NodeAnnouncement> { None }
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _init: &msgs::Init) {}
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _init: &msgs::Init) -> Result<(), ()> { Ok(()) }
|
||||
fn handle_reply_channel_range(&self, _their_node_id: &PublicKey, _msg: msgs::ReplyChannelRange) -> Result<(), LightningError> { Ok(()) }
|
||||
fn handle_reply_short_channel_ids_end(&self, _their_node_id: &PublicKey, _msg: msgs::ReplyShortChannelIdsEnd) -> Result<(), LightningError> { Ok(()) }
|
||||
fn handle_query_channel_range(&self, _their_node_id: &PublicKey, _msg: msgs::QueryChannelRange) -> Result<(), LightningError> { Ok(()) }
|
||||
|
@ -88,7 +88,7 @@ impl OnionMessageProvider for IgnoringMessageHandler {
|
|||
}
|
||||
impl OnionMessageHandler for IgnoringMessageHandler {
|
||||
fn handle_onion_message(&self, _their_node_id: &PublicKey, _msg: &msgs::OnionMessage) {}
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _init: &msgs::Init) {}
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _init: &msgs::Init) -> Result<(), ()> { Ok(()) }
|
||||
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
|
||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
|
||||
|
@ -209,7 +209,7 @@ impl ChannelMessageHandler for ErroringMessageHandler {
|
|||
// msgs::ChannelUpdate does not contain the channel_id field, so we just drop them.
|
||||
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelUpdate) {}
|
||||
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _init: &msgs::Init) -> Result<(), ()> { Ok(()) }
|
||||
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
|
||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
|
||||
|
@ -1213,14 +1213,18 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
|
|||
peer_lock.sync_status = InitSyncTracker::ChannelsSyncing(0);
|
||||
}
|
||||
|
||||
if !msg.features.supports_static_remote_key() {
|
||||
log_debug!(self.logger, "Peer {} does not support static remote key, disconnecting with no_connection_possible", log_pubkey!(their_node_id));
|
||||
if let Err(()) = self.message_handler.route_handler.peer_connected(&their_node_id, &msg) {
|
||||
log_debug!(self.logger, "Route Handler decided we couldn't communicate with peer {}", log_pubkey!(their_node_id));
|
||||
return Err(PeerHandleError{ no_connection_possible: true }.into());
|
||||
}
|
||||
if let Err(()) = self.message_handler.chan_handler.peer_connected(&their_node_id, &msg) {
|
||||
log_debug!(self.logger, "Channel Handler decided we couldn't communicate with peer {}", log_pubkey!(their_node_id));
|
||||
return Err(PeerHandleError{ no_connection_possible: true }.into());
|
||||
}
|
||||
if let Err(()) = self.message_handler.onion_message_handler.peer_connected(&their_node_id, &msg) {
|
||||
log_debug!(self.logger, "Onion Message Handler decided we couldn't communicate with peer {}", log_pubkey!(their_node_id));
|
||||
return Err(PeerHandleError{ no_connection_possible: true }.into());
|
||||
}
|
||||
|
||||
self.message_handler.route_handler.peer_connected(&their_node_id, &msg);
|
||||
self.message_handler.chan_handler.peer_connected(&their_node_id, &msg);
|
||||
self.message_handler.onion_message_handler.peer_connected(&their_node_id, &msg);
|
||||
|
||||
peer_lock.their_features = Some(msg.features);
|
||||
return Ok(None);
|
||||
|
|
|
@ -142,8 +142,8 @@ fn test_priv_forwarding_rejection() {
|
|||
check_added_monitors!(nodes[1], 2);
|
||||
nodes[1].node = &nodes_1_deserialized;
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let as_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_reestablish);
|
||||
|
@ -151,8 +151,8 @@ fn test_priv_forwarding_rejection() {
|
|||
get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
|
||||
get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.peer_connected(&nodes[2].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[2].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[2].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[2].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[2]).pop().unwrap();
|
||||
let cs_reestablish = get_chan_reestablish_msgs!(nodes[2], nodes[1]).pop().unwrap();
|
||||
nodes[2].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
|
||||
|
|
|
@ -247,9 +247,9 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let node_0_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let node_1_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &node_0_reestablish);
|
||||
|
@ -309,9 +309,9 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
let node_1_2nd_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
if recv_count == 0 {
|
||||
// If all closing_signeds weren't delivered we can just resume where we left off...
|
||||
let node_0_2nd_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
|
|
|
@ -51,8 +51,8 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
|
|||
let mut features = InitFeatures::known();
|
||||
features.set_onion_messages_optional();
|
||||
let init_msg = msgs::Init { features, remote_network_address: None };
|
||||
nodes[i].messenger.peer_connected(&nodes[i + 1].get_node_pk(), &init_msg.clone());
|
||||
nodes[i + 1].messenger.peer_connected(&nodes[i].get_node_pk(), &init_msg.clone());
|
||||
nodes[i].messenger.peer_connected(&nodes[i + 1].get_node_pk(), &init_msg.clone()).unwrap();
|
||||
nodes[i + 1].messenger.peer_connected(&nodes[i].get_node_pk(), &init_msg.clone()).unwrap();
|
||||
}
|
||||
nodes
|
||||
}
|
||||
|
|
|
@ -335,11 +335,12 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessageHandler for OnionMessenger<Si
|
|||
};
|
||||
}
|
||||
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init: &msgs::Init) {
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init: &msgs::Init) -> Result<(), ()> {
|
||||
if init.features.supports_onion_messages() {
|
||||
let mut peers = self.pending_messages.lock().unwrap();
|
||||
peers.insert(their_node_id.clone(), VecDeque::new());
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn peer_disconnected(&self, their_node_id: &PublicKey, _no_connection_possible: bool) {
|
||||
|
|
|
@ -368,10 +368,12 @@ where C::Target: chain::Access, L::Target: Logger
|
|||
/// to request gossip messages for each channel. The sync is considered complete
|
||||
/// when the final reply_scids_end message is received, though we are not
|
||||
/// tracking this directly.
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init_msg: &Init) {
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init_msg: &Init) -> Result<(), ()> {
|
||||
// We will only perform a sync with peers that support gossip_queries.
|
||||
if !init_msg.features.supports_gossip_queries() {
|
||||
return ();
|
||||
// Don't disconnect peers for not supporting gossip queries. We may wish to have
|
||||
// channels with peers even without being able to exchange gossip.
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
// The lightning network's gossip sync system is completely broken in numerous ways.
|
||||
|
@ -445,6 +447,7 @@ where C::Target: chain::Access, L::Target: Logger
|
|||
timestamp_range: u32::max_value(),
|
||||
},
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_reply_channel_range(&self, _their_node_id: &PublicKey, _msg: ReplyChannelRange) -> Result<(), LightningError> {
|
||||
|
@ -2614,7 +2617,7 @@ mod tests {
|
|||
// It should ignore if gossip_queries feature is not enabled
|
||||
{
|
||||
let init_msg = Init { features: InitFeatures::known().clear_gossip_queries(), remote_network_address: None };
|
||||
gossip_sync.peer_connected(&node_id_1, &init_msg);
|
||||
gossip_sync.peer_connected(&node_id_1, &init_msg).unwrap();
|
||||
let events = gossip_sync.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 0);
|
||||
}
|
||||
|
@ -2622,7 +2625,7 @@ mod tests {
|
|||
// It should send a gossip_timestamp_filter with the correct information
|
||||
{
|
||||
let init_msg = Init { features: InitFeatures::known(), remote_network_address: None };
|
||||
gossip_sync.peer_connected(&node_id_1, &init_msg);
|
||||
gossip_sync.peer_connected(&node_id_1, &init_msg).unwrap();
|
||||
let events = gossip_sync.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
match &events[0] {
|
||||
|
|
|
@ -350,9 +350,10 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
|
|||
self.received_msg(wire::Message::ChannelReestablish(msg.clone()));
|
||||
}
|
||||
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) -> Result<(), ()> {
|
||||
// Don't bother with `received_msg` for Init as its auto-generated and we don't want to
|
||||
// bother re-generating the expected Init message in all tests.
|
||||
Ok(())
|
||||
}
|
||||
fn handle_error(&self, _their_node_id: &PublicKey, msg: &msgs::ErrorMessage) {
|
||||
self.received_msg(wire::Message::Error(msg.clone()));
|
||||
|
@ -465,9 +466,9 @@ impl msgs::RoutingMessageHandler for TestRoutingMessageHandler {
|
|||
None
|
||||
}
|
||||
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init_msg: &msgs::Init) {
|
||||
fn peer_connected(&self, their_node_id: &PublicKey, init_msg: &msgs::Init) -> Result<(), ()> {
|
||||
if !init_msg.features.supports_gossip_queries() {
|
||||
return ();
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
#[allow(unused_mut, unused_assignments)]
|
||||
|
@ -491,6 +492,7 @@ impl msgs::RoutingMessageHandler for TestRoutingMessageHandler {
|
|||
timestamp_range: u32::max_value(),
|
||||
},
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_reply_channel_range(&self, _their_node_id: &PublicKey, _msg: msgs::ReplyChannelRange) -> Result<(), msgs::LightningError> {
|
||||
|
|
Loading…
Add table
Reference in a new issue