mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-25 07:17:40 +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 i in 0..num_nodes {
|
||||||
for j in (i+1)..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[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 });
|
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 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_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 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_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_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(()) }
|
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();
|
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 {
|
if *their_node_id == self.expected_pubkey {
|
||||||
self.pubkey_connected.clone().try_send(()).unwrap();
|
self.pubkey_connected.clone().try_send(()).unwrap();
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &ChannelReestablish) {}
|
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &ChannelReestablish) {}
|
||||||
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &ErrorMessage) {}
|
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[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_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]);
|
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||||
assert_eq!(reestablish_1.len(), 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]);
|
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||||
assert_eq!(reestablish_2.len(), 1);
|
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_events().is_empty());
|
||||||
assert!(nodes[0].node.get_and_clear_pending_msg_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]);
|
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||||
assert_eq!(reestablish_1.len(), 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]);
|
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||||
assert_eq!(reestablish_2.len(), 1);
|
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);
|
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);
|
||||||
|
|
||||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
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[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::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 as_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().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();
|
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[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_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[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::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();
|
||||||
|
|
||||||
assert_eq!(get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap(), as_reestablish);
|
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);
|
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);
|
check_added_monitors!(nodes[1], 1);
|
||||||
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
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[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::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 as_reconnect = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().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();
|
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[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_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();
|
||||||
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 as_reconnect = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().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();
|
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[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_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();
|
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();
|
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);
|
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[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_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();
|
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();
|
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);
|
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);
|
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||||
|
|
||||||
// Now reconnect the two
|
// 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]);
|
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||||
assert_eq!(reestablish_1.len(), 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]);
|
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||||
assert_eq!(reestablish_2.len(), 1);
|
assert_eq!(reestablish_2.len(), 1);
|
||||||
|
|
||||||
|
|
|
@ -3550,6 +3550,12 @@ impl<Signer: Sign> Channel<Signer> {
|
||||||
return;
|
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 {
|
if self.announcement_sigs_state == AnnouncementSigsState::MessageSent || self.announcement_sigs_state == AnnouncementSigsState::Committed {
|
||||||
self.announcement_sigs_state = AnnouncementSigsState::NotSent;
|
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));
|
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);
|
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
|
retain
|
||||||
});
|
});
|
||||||
//TODO: Also re-broadcast announcement_signatures
|
//TODO: Also re-broadcast announcement_signatures
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_error(&self, counterparty_node_id: &PublicKey, msg: &msgs::ErrorMessage) {
|
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 payer_pubkey = nodes[0].node.get_our_node_id();
|
||||||
let payee_pubkey = nodes[1].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[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 });
|
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 _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||||
let route_params = RouteParameters {
|
let route_params = RouteParameters {
|
||||||
|
@ -7524,8 +7530,8 @@ mod tests {
|
||||||
|
|
||||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||||
let payee_pubkey = nodes[1].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[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 });
|
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 _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||||
let route_params = RouteParameters {
|
let route_params = RouteParameters {
|
||||||
|
@ -7803,8 +7809,8 @@ pub mod bench {
|
||||||
});
|
});
|
||||||
let node_b_holder = NodeHolder { node: &node_b };
|
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_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 });
|
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_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_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()));
|
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 i in 0..node_count {
|
||||||
for j in (i+1)..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[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 });
|
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
|
/// pending_htlc_adds includes both the holding cell and in-flight update_add_htlcs, whereas
|
||||||
/// for claims/fails they are separated out.
|
/// 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)) {
|
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);
|
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);
|
let reestablish_2 = get_chan_reestablish_msgs!(node_b, node_a);
|
||||||
|
|
||||||
if send_channel_ready.0 {
|
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();
|
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
|
||||||
assert!(events_2.is_empty());
|
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();
|
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();
|
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.
|
// 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[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_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]);
|
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||||
assert_eq!(reestablish_1.len(), 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]);
|
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||||
assert_eq!(reestablish_2.len(), 1);
|
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);
|
assert_eq!(nodes[0].node.list_channels().len(), 1);
|
||||||
check_added_monitors!(nodes[0], 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]);
|
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]);
|
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]);
|
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);
|
assert_eq!(nodes[0].node.list_channels().len(), 1);
|
||||||
check_added_monitors!(nodes[0], 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]);
|
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]);
|
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]);
|
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!
|
//... and we can even still claim the payment!
|
||||||
claim_payment(&nodes[2], &[&nodes[0], &nodes[1]], our_payment_preimage);
|
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();
|
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);
|
nodes[0].node.handle_channel_reestablish(&nodes[3].node.get_our_node_id(), &reestablish);
|
||||||
let mut found_err = false;
|
let mut found_err = false;
|
||||||
for msg_event in nodes[0].node.get_and_clear_pending_msg_events() {
|
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
|
//Disconnect and Reconnect
|
||||||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
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_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]);
|
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||||
assert_eq!(reestablish_1.len(), 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]);
|
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||||
assert_eq!(reestablish_2.len(), 1);
|
assert_eq!(reestablish_2.len(), 1);
|
||||||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &reestablish_2[0]);
|
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);
|
check_added_monitors!(nodes[0], 1);
|
||||||
|
|
||||||
if reconnect_panicing {
|
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[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::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_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
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
|
// after the warning message sent by B, we should not able to
|
||||||
// use the channel, or reconnect with success to the channel.
|
// use the channel, or reconnect with success to the channel.
|
||||||
assert!(nodes[0].node.list_usable_channels().is_empty());
|
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[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::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 retry_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
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]);
|
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
|
// 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]);
|
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||||
assert_eq!(reestablish_1.len(), 3);
|
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]);
|
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||||
assert_eq!(reestablish_2.len(), 3);
|
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 payer_pubkey = nodes[0].node.get_our_node_id();
|
||||||
let payee_pubkey = nodes[1].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[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 });
|
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 _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||||
let route_params = RouteParameters {
|
let route_params = RouteParameters {
|
||||||
|
@ -10264,9 +10264,9 @@ fn do_test_partial_claim_before_restart(persist_both_monitors: bool) {
|
||||||
if !persist_both_monitors {
|
if !persist_both_monitors {
|
||||||
// If one of the two channels is still live, reveal the payment preimage over it.
|
// 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]);
|
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]);
|
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]);
|
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
|
/// 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
|
/// understand or indicate they require unknown feature bits), no_connection_possible is set
|
||||||
/// and any outstanding channels should be failed.
|
/// 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);
|
fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
|
||||||
|
|
||||||
/// Handle a peer reconnecting, possibly generating channel_reestablish message(s).
|
/// 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.
|
/// Handle an incoming channel_reestablish message from the given peer.
|
||||||
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &ChannelReestablish);
|
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
|
/// Called when a connection is established with a peer. This can be used to
|
||||||
/// perform routing table synchronization using a strategy defined by the
|
/// perform routing table synchronization using a strategy defined by the
|
||||||
/// implementor.
|
/// 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
|
/// 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
|
/// for a given range of blocks. We can expect to receive one or more
|
||||||
/// replies to a single query.
|
/// replies to a single query.
|
||||||
|
@ -976,9 +987,16 @@ pub trait OnionMessageHandler : OnionMessageProvider {
|
||||||
fn handle_onion_message(&self, peer_node_id: &PublicKey, msg: &OnionMessage);
|
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
|
/// Called when a connection is established with a peer. Can be used to track which peers
|
||||||
/// advertise onion message support and are online.
|
/// 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
|
/// 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.
|
/// 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);
|
fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
|
||||||
|
|
||||||
// Handler information:
|
// 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 chanmon_cfgs = create_chanmon_cfgs(4);
|
||||||
let mut node_cfgs = create_node_cfgs(4, &chanmon_cfgs);
|
let mut node_cfgs = create_node_cfgs(4, &chanmon_cfgs);
|
||||||
|
|
||||||
// Set `node[1]` config to `InitFeatures::empty()` which return `false` for
|
// Set `node[1]` config to `InitFeatures::empty()` + `static_remote_key` which implies
|
||||||
// `supports_variable_length_onion()`
|
// `!supports_variable_length_onion()` but still supports the required static-remote-key
|
||||||
|
// feature.
|
||||||
let mut node_1_cfg = &mut node_cfgs[1];
|
let mut node_1_cfg = &mut node_cfgs[1];
|
||||||
node_1_cfg.features = InitFeatures::empty();
|
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 node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||||
let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
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);
|
assert_eq!(as_broadcasted_txn[0], as_commitment_tx);
|
||||||
|
|
||||||
nodes[1].node.peer_disconnected(&nodes[0].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();
|
||||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
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
|
// Now nodes[1] should send a channel reestablish, which nodes[0] will respond to with an
|
||||||
// error, as the channel has hit the chain.
|
// 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();
|
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);
|
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();
|
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!(nodes[0].node.has_pending_payments());
|
||||||
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0).len(), 1);
|
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());
|
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
|
// Now nodes[1] should send a channel reestablish, which nodes[0] will respond to with an
|
||||||
// error, as the channel has hit the chain.
|
// 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();
|
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);
|
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();
|
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) ->
|
fn get_next_channel_announcement(&self, _starting_point: u64) ->
|
||||||
Option<(msgs::ChannelAnnouncement, Option<msgs::ChannelUpdate>, Option<msgs::ChannelUpdate>)> { None }
|
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 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_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_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(()) }
|
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 {
|
impl OnionMessageHandler for IgnoringMessageHandler {
|
||||||
fn handle_onion_message(&self, _their_node_id: &PublicKey, _msg: &msgs::OnionMessage) {}
|
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 peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
|
||||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
||||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
|
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.
|
// 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 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_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 handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
|
||||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
||||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
|
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);
|
peer_lock.sync_status = InitSyncTracker::ChannelsSyncing(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if !msg.features.supports_static_remote_key() {
|
if let Err(()) = self.message_handler.route_handler.peer_connected(&their_node_id, &msg) {
|
||||||
log_debug!(self.logger, "Peer {} does not support static remote key, disconnecting with no_connection_possible", log_pubkey!(their_node_id));
|
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());
|
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);
|
peer_lock.their_features = Some(msg.features);
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
|
|
|
@ -142,8 +142,8 @@ fn test_priv_forwarding_rejection() {
|
||||||
check_added_monitors!(nodes[1], 2);
|
check_added_monitors!(nodes[1], 2);
|
||||||
nodes[1].node = &nodes_1_deserialized;
|
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[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::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 as_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().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();
|
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);
|
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[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
|
||||||
get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].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[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::empty(), remote_network_address: None });
|
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 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();
|
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);
|
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[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_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();
|
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();
|
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);
|
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[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_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();
|
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 recv_count == 0 {
|
||||||
// If all closing_signeds weren't delivered we can just resume where we left off...
|
// 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();
|
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();
|
let mut features = InitFeatures::known();
|
||||||
features.set_onion_messages_optional();
|
features.set_onion_messages_optional();
|
||||||
let init_msg = msgs::Init { features, remote_network_address: None };
|
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].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());
|
nodes[i + 1].messenger.peer_connected(&nodes[i].get_node_pk(), &init_msg.clone()).unwrap();
|
||||||
}
|
}
|
||||||
nodes
|
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() {
|
if init.features.supports_onion_messages() {
|
||||||
let mut peers = self.pending_messages.lock().unwrap();
|
let mut peers = self.pending_messages.lock().unwrap();
|
||||||
peers.insert(their_node_id.clone(), VecDeque::new());
|
peers.insert(their_node_id.clone(), VecDeque::new());
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn peer_disconnected(&self, their_node_id: &PublicKey, _no_connection_possible: bool) {
|
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
|
/// 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
|
/// when the final reply_scids_end message is received, though we are not
|
||||||
/// tracking this directly.
|
/// 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.
|
// We will only perform a sync with peers that support gossip_queries.
|
||||||
if !init_msg.features.supports_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.
|
// 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(),
|
timestamp_range: u32::max_value(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_reply_channel_range(&self, _their_node_id: &PublicKey, _msg: ReplyChannelRange) -> Result<(), LightningError> {
|
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
|
// It should ignore if gossip_queries feature is not enabled
|
||||||
{
|
{
|
||||||
let init_msg = Init { features: InitFeatures::known().clear_gossip_queries(), remote_network_address: None };
|
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();
|
let events = gossip_sync.get_and_clear_pending_msg_events();
|
||||||
assert_eq!(events.len(), 0);
|
assert_eq!(events.len(), 0);
|
||||||
}
|
}
|
||||||
|
@ -2622,7 +2625,7 @@ mod tests {
|
||||||
// It should send a gossip_timestamp_filter with the correct information
|
// It should send a gossip_timestamp_filter with the correct information
|
||||||
{
|
{
|
||||||
let init_msg = Init { features: InitFeatures::known(), remote_network_address: None };
|
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();
|
let events = gossip_sync.get_and_clear_pending_msg_events();
|
||||||
assert_eq!(events.len(), 1);
|
assert_eq!(events.len(), 1);
|
||||||
match &events[0] {
|
match &events[0] {
|
||||||
|
|
|
@ -350,9 +350,10 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
|
||||||
self.received_msg(wire::Message::ChannelReestablish(msg.clone()));
|
self.received_msg(wire::Message::ChannelReestablish(msg.clone()));
|
||||||
}
|
}
|
||||||
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
|
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
|
// 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.
|
// bother re-generating the expected Init message in all tests.
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
fn handle_error(&self, _their_node_id: &PublicKey, msg: &msgs::ErrorMessage) {
|
fn handle_error(&self, _their_node_id: &PublicKey, msg: &msgs::ErrorMessage) {
|
||||||
self.received_msg(wire::Message::Error(msg.clone()));
|
self.received_msg(wire::Message::Error(msg.clone()));
|
||||||
|
@ -465,9 +466,9 @@ impl msgs::RoutingMessageHandler for TestRoutingMessageHandler {
|
||||||
None
|
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() {
|
if !init_msg.features.supports_gossip_queries() {
|
||||||
return ();
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused_mut, unused_assignments)]
|
#[allow(unused_mut, unused_assignments)]
|
||||||
|
@ -491,6 +492,7 @@ impl msgs::RoutingMessageHandler for TestRoutingMessageHandler {
|
||||||
timestamp_range: u32::max_value(),
|
timestamp_range: u32::max_value(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_reply_channel_range(&self, _their_node_id: &PublicKey, _msg: msgs::ReplyChannelRange) -> Result<(), msgs::LightningError> {
|
fn handle_reply_channel_range(&self, _their_node_id: &PublicKey, _msg: msgs::ReplyChannelRange) -> Result<(), msgs::LightningError> {
|
||||||
|
|
Loading…
Add table
Reference in a new issue