Skip to content

Commit 1887a2e

Browse files
committed
Move broadcast_node_announcement to PeerManager
Some `NodeFeatures` will, in the future, represent features which are not enabled by the `ChannelManager`, but by other message handlers handlers. Thus, it doesn't make sense to determine the node feature bits in the `ChannelManager`. The simplest fix for this is to change to generating the node_announcement in `PeerManager`, asking all the connected handlers which feature bits they support and simply OR'ing them together. While this may not be sufficient in the future as it doesn't consider feature bit dependencies, support for those could be handled at the feature level in the future. This commit moves the `broadcast_node_announcement` function to `PeerHandler` but does not yet implement feature OR'ing.
1 parent 8396856 commit 1887a2e

File tree

8 files changed

+98
-127
lines changed

8 files changed

+98
-127
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ mod tests {
746746
let p2p_gossip_sync = Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone()));
747747
let rapid_gossip_sync = Arc::new(RapidGossipSync::new(network_graph.clone()));
748748
let msg_handler = MessageHandler { chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new()), route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new()), onion_message_handler: IgnoringMessageHandler{}};
749-
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(Recipient::Node).unwrap(), &seed, logger.clone(), IgnoringMessageHandler{}));
749+
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(Recipient::Node).unwrap(), 0, &seed, logger.clone(), IgnoringMessageHandler{}));
750750
let scorer = Arc::new(Mutex::new(test_utils::TestScorer::with_penalty(0)));
751751
let node = Node { node: manager, p2p_gossip_sync, rapid_gossip_sync, peer_manager, chain_monitor, persister, tx_broadcaster, network_graph, logger, best_block, scorer };
752752
nodes.push(node);

lightning-net-tokio/src/lib.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ mod tests {
546546
use lightning::ln::features::*;
547547
use lightning::ln::msgs::*;
548548
use lightning::ln::peer_handler::{MessageHandler, PeerManager};
549+
use lightning::ln::features::NodeFeatures;
549550
use lightning::util::events::*;
550551
use bitcoin::secp256k1::{Secp256k1, SecretKey, PublicKey};
551552

@@ -612,6 +613,7 @@ mod tests {
612613
}
613614
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &ChannelReestablish) {}
614615
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &ErrorMessage) {}
616+
fn get_provided_node_features(&self) -> NodeFeatures { NodeFeatures::known() }
615617
}
616618
impl MessageSendEventsProvider for MsgHandler {
617619
fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent> {
@@ -657,7 +659,7 @@ mod tests {
657659
chan_handler: Arc::clone(&a_handler),
658660
route_handler: Arc::clone(&a_handler),
659661
onion_message_handler: Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{}),
660-
}, a_key.clone(), &[1; 32], Arc::new(TestLogger()), Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{})));
662+
}, a_key.clone(), 0, &[1; 32], Arc::new(TestLogger()), Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{})));
661663

662664
let (b_connected_sender, mut b_connected) = mpsc::channel(1);
663665
let (b_disconnected_sender, mut b_disconnected) = mpsc::channel(1);
@@ -672,7 +674,7 @@ mod tests {
672674
chan_handler: Arc::clone(&b_handler),
673675
route_handler: Arc::clone(&b_handler),
674676
onion_message_handler: Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{}),
675-
}, b_key.clone(), &[2; 32], Arc::new(TestLogger()), Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{})));
677+
}, b_key.clone(), 0, &[2; 32], Arc::new(TestLogger()), Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{})));
676678

677679
// We bind on localhost, hoping the environment is properly configured with a local
678680
// address. This may not always be the case in containers and the like, so if this test is
@@ -725,7 +727,7 @@ mod tests {
725727
chan_handler: Arc::new(lightning::ln::peer_handler::ErroringMessageHandler::new()),
726728
onion_message_handler: Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{}),
727729
route_handler: Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{}),
728-
}, a_key, &[1; 32], Arc::new(TestLogger()), Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{})));
730+
}, a_key, 0, &[1; 32], Arc::new(TestLogger()), Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler{})));
729731

730732
// Make two connections, one for an inbound and one for an outbound connection
731733
let conn_a = {

lightning/src/ln/channelmanager.rs

Lines changed: 4 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -764,10 +764,6 @@ pub struct ChannelManager<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref,
764764
/// keeping additional state.
765765
probing_cookie_secret: [u8; 32],
766766

767-
/// Used to track the last value sent in a node_announcement "timestamp" field. We ensure this
768-
/// value increases strictly since we don't assume access to a time source.
769-
last_node_announcement_serial: AtomicUsize,
770-
771767
/// The highest block timestamp we've seen, which is usually a good guess at the current time.
772768
/// Assuming most miners are generating blocks with reasonable timestamps, this shouldn't be
773769
/// very far in the past, and can only ever be up to two hours in the future.
@@ -1617,7 +1613,6 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
16171613

16181614
probing_cookie_secret: keys_manager.get_secure_random_bytes(),
16191615

1620-
last_node_announcement_serial: AtomicUsize::new(0),
16211616
highest_seen_timestamp: AtomicUsize::new(0),
16221617

16231618
per_peer_state: RwLock::new(HashMap::new()),
@@ -2940,68 +2935,6 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
29402935
// smaller than 100:
29412936
const STATIC_ASSERT: u32 = Self::HALF_MESSAGE_IS_ADDRS - 100;
29422937

2943-
/// Regenerates channel_announcements and generates a signed node_announcement from the given
2944-
/// arguments, providing them in corresponding events via
2945-
/// [`get_and_clear_pending_msg_events`], if at least one public channel has been confirmed
2946-
/// on-chain. This effectively re-broadcasts all channel announcements and sends our node
2947-
/// announcement to ensure that the lightning P2P network is aware of the channels we have and
2948-
/// our network addresses.
2949-
///
2950-
/// `rgb` is a node "color" and `alias` is a printable human-readable string to describe this
2951-
/// node to humans. They carry no in-protocol meaning.
2952-
///
2953-
/// `addresses` represent the set (possibly empty) of socket addresses on which this node
2954-
/// accepts incoming connections. These will be included in the node_announcement, publicly
2955-
/// tying these addresses together and to this node. If you wish to preserve user privacy,
2956-
/// addresses should likely contain only Tor Onion addresses.
2957-
///
2958-
/// Panics if `addresses` is absurdly large (more than 100).
2959-
///
2960-
/// [`get_and_clear_pending_msg_events`]: MessageSendEventsProvider::get_and_clear_pending_msg_events
2961-
pub fn broadcast_node_announcement(&self, rgb: [u8; 3], alias: [u8; 32], mut addresses: Vec<NetAddress>) {
2962-
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
2963-
2964-
if addresses.len() > 100 {
2965-
panic!("More than half the message size was taken up by public addresses!");
2966-
}
2967-
2968-
// While all existing nodes handle unsorted addresses just fine, the spec requires that
2969-
// addresses be sorted for future compatibility.
2970-
addresses.sort_by_key(|addr| addr.get_id());
2971-
2972-
let announcement = msgs::UnsignedNodeAnnouncement {
2973-
features: NodeFeatures::known(),
2974-
timestamp: self.last_node_announcement_serial.fetch_add(1, Ordering::AcqRel) as u32,
2975-
node_id: self.get_our_node_id(),
2976-
rgb, alias, addresses,
2977-
excess_address_data: Vec::new(),
2978-
excess_data: Vec::new(),
2979-
};
2980-
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
2981-
let node_announce_sig = sign(&self.secp_ctx, &msghash, &self.our_network_key);
2982-
2983-
let mut channel_state_lock = self.channel_state.lock().unwrap();
2984-
let channel_state = &mut *channel_state_lock;
2985-
2986-
let mut announced_chans = false;
2987-
for (_, chan) in channel_state.by_id.iter() {
2988-
if chan.get_signed_channel_announcement(self.get_our_node_id(), self.genesis_hash.clone(), self.best_block.read().unwrap().height()).is_some()
2989-
&& self.get_channel_update_for_broadcast(chan).is_ok()
2990-
{
2991-
announced_chans = true;
2992-
}
2993-
}
2994-
2995-
if announced_chans {
2996-
channel_state.pending_msg_events.push(events::MessageSendEvent::BroadcastNodeAnnouncement {
2997-
msg: msgs::NodeAnnouncement {
2998-
signature: node_announce_sig,
2999-
contents: announcement
3000-
},
3001-
});
3002-
}
3003-
}
3004-
30052938
/// Atomically updates the [`ChannelConfig`] for the given channels.
30062939
///
30072940
/// Once the updates are applied, each eligible channel (advertised with a known short channel
@@ -5784,7 +5717,6 @@ where
57845717
}
57855718
}
57865719
}
5787-
max_time!(self.last_node_announcement_serial);
57885720
max_time!(self.highest_seen_timestamp);
57895721
let mut payment_secrets = self.pending_inbound_payments.lock().unwrap();
57905722
payment_secrets.retain(|_, inbound_payment| {
@@ -6136,7 +6068,6 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
61366068
&events::MessageSendEvent::SendChannelReestablish { ref node_id, .. } => node_id != counterparty_node_id,
61376069
&events::MessageSendEvent::SendChannelAnnouncement { ref node_id, .. } => node_id != counterparty_node_id,
61386070
&events::MessageSendEvent::BroadcastChannelAnnouncement { .. } => true,
6139-
&events::MessageSendEvent::BroadcastNodeAnnouncement { .. } => true,
61406071
&events::MessageSendEvent::BroadcastChannelUpdate { .. } => true,
61416072
&events::MessageSendEvent::SendChannelUpdate { ref node_id, .. } => node_id != counterparty_node_id,
61426073
&events::MessageSendEvent::HandleError { ref node_id, .. } => node_id != counterparty_node_id,
@@ -6241,6 +6172,10 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
62416172
let _ = self.force_close_channel_with_peer(&msg.channel_id, counterparty_node_id, Some(&msg.data), true);
62426173
}
62436174
}
6175+
6176+
fn get_provided_node_features(&self) -> NodeFeatures {
6177+
NodeFeatures::known()
6178+
}
62446179
}
62456180

62466181
const SERIALIZATION_VERSION: u8 = 1;
@@ -6663,7 +6598,6 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Writeable f
66636598
}
66646599
}
66656600

6666-
(self.last_node_announcement_serial.load(Ordering::Acquire) as u32).write(writer)?;
66676601
(self.highest_seen_timestamp.load(Ordering::Acquire) as u32).write(writer)?;
66686602

66696603
(pending_inbound_payments.len() as u64).write(writer)?;
@@ -6982,7 +6916,6 @@ impl<'a, Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
69826916
}
69836917
}
69846918

6985-
let last_node_announcement_serial: u32 = Readable::read(reader)?;
69866919
let highest_seen_timestamp: u32 = Readable::read(reader)?;
69876920

69886921
let pending_inbound_payment_count: u64 = Readable::read(reader)?;
@@ -7243,7 +7176,6 @@ impl<'a, Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
72437176
our_network_pubkey,
72447177
secp_ctx,
72457178

7246-
last_node_announcement_serial: AtomicUsize::new(last_node_announcement_serial as usize),
72477179
highest_seen_timestamp: AtomicUsize::new(highest_seen_timestamp as usize),
72487180

72497181
per_peer_state: RwLock::new(per_peer_state),

lightning/src/ln/functional_test_utils.rs

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -826,34 +826,10 @@ pub fn create_unannounced_chan_between_nodes_with_value<'a, 'b, 'c, 'd>(nodes: &
826826
}
827827

828828
pub fn update_nodes_with_chan_announce<'a, 'b, 'c, 'd>(nodes: &'a Vec<Node<'b, 'c, 'd>>, a: usize, b: usize, ann: &msgs::ChannelAnnouncement, upd_1: &msgs::ChannelUpdate, upd_2: &msgs::ChannelUpdate) {
829-
nodes[a].node.broadcast_node_announcement([0, 0, 0], [0; 32], Vec::new());
830-
let a_events = nodes[a].node.get_and_clear_pending_msg_events();
831-
assert_eq!(a_events.len(), 1);
832-
833-
let a_node_announcement = match a_events.last().unwrap() {
834-
MessageSendEvent::BroadcastNodeAnnouncement { ref msg } => {
835-
(*msg).clone()
836-
},
837-
_ => panic!("Unexpected event"),
838-
};
839-
840-
nodes[b].node.broadcast_node_announcement([1, 1, 1], [1; 32], Vec::new());
841-
let b_events = nodes[b].node.get_and_clear_pending_msg_events();
842-
assert_eq!(b_events.len(), 1);
843-
844-
let b_node_announcement = match b_events.last().unwrap() {
845-
MessageSendEvent::BroadcastNodeAnnouncement { ref msg } => {
846-
(*msg).clone()
847-
},
848-
_ => panic!("Unexpected event"),
849-
};
850-
851829
for node in nodes {
852830
assert!(node.gossip_sync.handle_channel_announcement(ann).unwrap());
853831
node.gossip_sync.handle_channel_update(upd_1).unwrap();
854832
node.gossip_sync.handle_channel_update(upd_2).unwrap();
855-
node.gossip_sync.handle_node_announcement(&a_node_announcement).unwrap();
856-
node.gossip_sync.handle_node_announcement(&b_node_announcement).unwrap();
857833

858834
// Note that channel_updates are also delivered to ChannelManagers to ensure we have
859835
// forwarding info for local channels even if its not accepted in the network graph.

lightning/src/ln/msgs.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,12 @@ pub trait ChannelMessageHandler : MessageSendEventsProvider {
896896
// Error:
897897
/// Handle an incoming error message from the given peer.
898898
fn handle_error(&self, their_node_id: &PublicKey, msg: &ErrorMessage);
899+
900+
// Handler information:
901+
/// Gets the node feature flags which this handler itself supports. All available handlers are
902+
/// queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`]
903+
/// which are broadcasted in our node_announcement message.
904+
fn get_provided_node_features(&self) -> NodeFeatures;
899905
}
900906

901907
/// A trait to describe an object which can receive routing messages.

0 commit comments

Comments
 (0)