Skip to content

Commit 02c57f5

Browse files
committed
Rebroadcast channel_announcements when we broadcast a node_announce
1 parent a87053a commit 02c57f5

File tree

4 files changed

+154
-22
lines changed

4 files changed

+154
-22
lines changed

lightning/src/ln/channel.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3831,6 +3831,8 @@ impl<Signer: Sign> Channel<Signer> {
38313831
/// closing).
38323832
/// Note that the "channel must be funded" requirement is stricter than BOLT 7 requires - see
38333833
/// https://github.com/lightningnetwork/lightning-rfc/issues/468
3834+
///
3835+
/// This will only return ChannelError::Ignore upon failure.
38343836
pub fn get_channel_announcement(&self, node_id: PublicKey, chain_hash: BlockHash) -> Result<(msgs::UnsignedChannelAnnouncement, Signature), ChannelError> {
38353837
if !self.config.announced_channel {
38363838
return Err(ChannelError::Ignore("Channel is not available for public announcements".to_owned()));
@@ -3861,6 +3863,8 @@ impl<Signer: Sign> Channel<Signer> {
38613863
Ok((msg, sig))
38623864
}
38633865

3866+
/// Signs the given channel announcement, returning a ChannelError::Ignore if no keys are
3867+
/// available.
38643868
fn sign_channel_announcement(&self, our_node_secret: &SecretKey, our_node_id: PublicKey, msghash: secp256k1::Message, announcement: msgs::UnsignedChannelAnnouncement, our_bitcoin_sig: Signature) -> Result<msgs::ChannelAnnouncement, ChannelError> {
38653869
if let Some((their_node_sig, their_bitcoin_sig)) = self.announcement_sigs {
38663870
let were_node_one = announcement.node_id_1 == our_node_id;
@@ -3902,6 +3906,20 @@ impl<Signer: Sign> Channel<Signer> {
39023906
self.sign_channel_announcement(our_node_secret, our_node_id, msghash, announcement, our_bitcoin_sig)
39033907
}
39043908

3909+
/// Gets a signed channel_announcement for this channel, if we previously received an
3910+
/// announcement_signatures from our counterparty.
3911+
pub fn get_signed_channel_announcement(&self, our_node_secret: &SecretKey, our_node_id: PublicKey, chain_hash: BlockHash) -> Option<msgs::ChannelAnnouncement> {
3912+
let (announcement, our_bitcoin_sig) = match self.get_channel_announcement(our_node_id.clone(), chain_hash) {
3913+
Ok(res) => res,
3914+
Err(_) => return None,
3915+
};
3916+
let msghash = hash_to_message!(&Sha256d::hash(&announcement.encode()[..])[..]);
3917+
match self.sign_channel_announcement(our_node_secret, our_node_id, msghash, announcement, our_bitcoin_sig) {
3918+
Ok(res) => Some(res),
3919+
Err(_) => None,
3920+
}
3921+
}
3922+
39053923
/// May panic if called on a channel that wasn't immediately-previously
39063924
/// self.remove_uncommitted_htlcs_and_mark_paused()'d
39073925
pub fn get_channel_reestablish<L: Deref>(&self, logger: &L) -> msgs::ChannelReestablish where L::Target: Logger {

lightning/src/ln/channelmanager.rs

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1933,19 +1933,24 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
19331933
// smaller than 500:
19341934
const STATIC_ASSERT: u32 = Self::HALF_MESSAGE_IS_ADDRS - 500;
19351935

1936-
/// Generates a signed node_announcement from the given arguments and creates a
1937-
/// BroadcastNodeAnnouncement event. Note that such messages will be ignored unless peers have
1938-
/// seen a channel_announcement from us (ie unless we have public channels open).
1936+
/// Regenerates channel_announcements and generates a signed node_announcement from the given
1937+
/// arguments, providing them in corresponding events via
1938+
/// [`get_and_clear_pending_msg_events`], if at least one public channel has been confirmed
1939+
/// on-chain. This effectively re-broadcasts all channel announcements and sends our node
1940+
/// announcement to ensure that the lightning P2P network is aware of the channels we have and
1941+
/// our network addresses.
19391942
///
1940-
/// RGB is a node "color" and alias is a printable human-readable string to describe this node
1941-
/// to humans. They carry no in-protocol meaning.
1943+
/// `rgb` is a node "color" and `alias` is a printable human-readable string to describe this
1944+
/// node to humans. They carry no in-protocol meaning.
19421945
///
1943-
/// addresses represent the set (possibly empty) of socket addresses on which this node accepts
1944-
/// incoming connections. These will be broadcast to the network, publicly tying these
1945-
/// addresses together. If you wish to preserve user privacy, addresses should likely contain
1946-
/// only Tor Onion addresses.
1946+
/// `addresses` represent the set (possibly empty) of socket addresses on which this node
1947+
/// accepts incoming connections. These will be included in the node_announcement, publicly
1948+
/// tying these addresses together and to this node. If you wish to preserve user privacy,
1949+
/// addresses should likely contain only Tor Onion addresses.
19471950
///
1948-
/// Panics if addresses is absurdly large (more than 500).
1951+
/// Panics if `addresses` is absurdly large (more than 500).
1952+
///
1953+
/// [`get_and_clear_pending_msg_events`]: MessageSendEventsProvider::get_and_clear_pending_msg_events
19491954
pub fn broadcast_node_announcement(&self, rgb: [u8; 3], alias: [u8; 32], mut addresses: Vec<NetAddress>) {
19501955
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
19511956

@@ -1966,14 +1971,37 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
19661971
excess_data: Vec::new(),
19671972
};
19681973
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
1974+
let node_announce_sig = self.secp_ctx.sign(&msghash, &self.our_network_key);
19691975

1970-
let mut channel_state = self.channel_state.lock().unwrap();
1971-
channel_state.pending_msg_events.push(events::MessageSendEvent::BroadcastNodeAnnouncement {
1972-
msg: msgs::NodeAnnouncement {
1973-
signature: self.secp_ctx.sign(&msghash, &self.our_network_key),
1974-
contents: announcement
1975-
},
1976-
});
1976+
let mut channel_state_lock = self.channel_state.lock().unwrap();
1977+
let channel_state = &mut *channel_state_lock;
1978+
1979+
let mut announced_chans = false;
1980+
for (_, chan) in channel_state.by_id.iter() {
1981+
if let Some(msg) = chan.get_signed_channel_announcement(&self.our_network_key, self.get_our_node_id(), self.genesis_hash.clone()) {
1982+
channel_state.pending_msg_events.push(events::MessageSendEvent::BroadcastChannelAnnouncement {
1983+
msg,
1984+
update_msg: match self.get_channel_update(chan) {
1985+
Ok(msg) => msg,
1986+
Err(_) => continue,
1987+
},
1988+
});
1989+
announced_chans = true;
1990+
} else {
1991+
// If the channel is not public or has not yet reached funding_locked, check the
1992+
// next channel. If we don't yet have any public channels, we'll skip the broadcast
1993+
// below as peers may not accept it without channels on chain first.
1994+
}
1995+
}
1996+
1997+
if announced_chans {
1998+
channel_state.pending_msg_events.push(events::MessageSendEvent::BroadcastNodeAnnouncement {
1999+
msg: msgs::NodeAnnouncement {
2000+
signature: node_announce_sig,
2001+
contents: announcement
2002+
},
2003+
});
2004+
}
19772005
}
19782006

19792007
/// Processes HTLCs which are pending waiting on random forward delay.

lightning/src/ln/functional_test_utils.rs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -615,8 +615,22 @@ pub fn create_announced_chan_between_nodes_with_value<'a, 'b, 'c, 'd>(nodes: &'a
615615
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) {
616616
nodes[a].node.broadcast_node_announcement([0, 0, 0], [0; 32], Vec::new());
617617
let a_events = nodes[a].node.get_and_clear_pending_msg_events();
618-
assert_eq!(a_events.len(), 1);
619-
let a_node_announcement = match a_events[0] {
618+
assert!(a_events.len() >= 2);
619+
620+
// ann should be re-generated by broadcast_node_announcement - check that we have it.
621+
let mut found_ann_1 = false;
622+
for event in a_events.iter() {
623+
match event {
624+
MessageSendEvent::BroadcastChannelAnnouncement { ref msg, .. } => {
625+
if msg == ann { found_ann_1 = true; }
626+
},
627+
MessageSendEvent::BroadcastNodeAnnouncement { .. } => {},
628+
_ => panic!("Unexpected event {:?}", event),
629+
}
630+
}
631+
assert!(found_ann_1);
632+
633+
let a_node_announcement = match a_events.last().unwrap() {
620634
MessageSendEvent::BroadcastNodeAnnouncement { ref msg } => {
621635
(*msg).clone()
622636
},
@@ -625,8 +639,22 @@ pub fn update_nodes_with_chan_announce<'a, 'b, 'c, 'd>(nodes: &'a Vec<Node<'b, '
625639

626640
nodes[b].node.broadcast_node_announcement([1, 1, 1], [1; 32], Vec::new());
627641
let b_events = nodes[b].node.get_and_clear_pending_msg_events();
628-
assert_eq!(b_events.len(), 1);
629-
let b_node_announcement = match b_events[0] {
642+
assert!(b_events.len() >= 2);
643+
644+
// ann should be re-generated by broadcast_node_announcement - check that we have it.
645+
let mut found_ann_2 = false;
646+
for event in b_events.iter() {
647+
match event {
648+
MessageSendEvent::BroadcastChannelAnnouncement { ref msg, .. } => {
649+
if msg == ann { found_ann_2 = true; }
650+
},
651+
MessageSendEvent::BroadcastNodeAnnouncement { .. } => {},
652+
_ => panic!("Unexpected event"),
653+
}
654+
}
655+
assert!(found_ann_2);
656+
657+
let b_node_announcement = match b_events.last().unwrap() {
630658
MessageSendEvent::BroadcastNodeAnnouncement { ref msg } => {
631659
(*msg).clone()
632660
},

lightning/src/ln/functional_tests.rs

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3806,7 +3806,10 @@ fn test_funding_peer_disconnect() {
38063806
let chanmon_cfgs = create_chanmon_cfgs(2);
38073807
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
38083808
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
3809-
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
3809+
let persister: test_utils::TestPersister;
3810+
let new_chain_monitor: test_utils::TestChainMonitor;
3811+
let nodes_0_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
3812+
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
38103813
let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 100000, 10001, InitFeatures::known(), InitFeatures::known());
38113814

38123815
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
@@ -3884,6 +3887,61 @@ fn test_funding_peer_disconnect() {
38843887
let route = get_route(&nodes[0].node.get_our_node_id(), &net_graph_msg_handler.network_graph.read().unwrap(), &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 1000000, TEST_FINAL_CLTV, &logger).unwrap();
38853888
let (payment_preimage, _, _) = send_along_route(&nodes[0], route, &[&nodes[1]], 1000000);
38863889
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage);
3890+
3891+
// Check that after deserialization and reconnection we can still generate an identical
3892+
// channel_announcement from the cached signatures.
3893+
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
3894+
3895+
let nodes_0_serialized = nodes[0].node.encode();
3896+
let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
3897+
nodes[0].chain_monitor.chain_monitor.monitors.read().unwrap().iter().next().unwrap().1.write(&mut chan_0_monitor_serialized).unwrap();
3898+
3899+
persister = test_utils::TestPersister::new();
3900+
let keys_manager = &chanmon_cfgs[0].keys_manager;
3901+
new_chain_monitor = test_utils::TestChainMonitor::new(Some(nodes[0].chain_source), nodes[0].tx_broadcaster.clone(), nodes[0].logger, node_cfgs[0].fee_estimator, &persister, keys_manager);
3902+
nodes[0].chain_monitor = &new_chain_monitor;
3903+
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
3904+
let (_, mut chan_0_monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
3905+
&mut chan_0_monitor_read, keys_manager).unwrap();
3906+
assert!(chan_0_monitor_read.is_empty());
3907+
3908+
let mut nodes_0_read = &nodes_0_serialized[..];
3909+
let (_, nodes_0_deserialized_tmp) = {
3910+
let mut channel_monitors = HashMap::new();
3911+
channel_monitors.insert(chan_0_monitor.get_funding_txo().0, &mut chan_0_monitor);
3912+
<(BlockHash, ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
3913+
default_config: UserConfig::default(),
3914+
keys_manager,
3915+
fee_estimator: node_cfgs[0].fee_estimator,
3916+
chain_monitor: nodes[0].chain_monitor,
3917+
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
3918+
logger: nodes[0].logger,
3919+
channel_monitors,
3920+
}).unwrap()
3921+
};
3922+
nodes_0_deserialized = nodes_0_deserialized_tmp;
3923+
assert!(nodes_0_read.is_empty());
3924+
3925+
assert!(nodes[0].chain_monitor.watch_channel(chan_0_monitor.get_funding_txo().0, chan_0_monitor).is_ok());
3926+
nodes[0].node = &nodes_0_deserialized;
3927+
check_added_monitors!(nodes[0], 1);
3928+
3929+
reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
3930+
3931+
// as_announcement should be re-generated exactly by broadcast_node_announcement.
3932+
nodes[0].node.broadcast_node_announcement([0, 0, 0], [0; 32], Vec::new());
3933+
let msgs = nodes[0].node.get_and_clear_pending_msg_events();
3934+
let mut found_announcement = false;
3935+
for event in msgs.iter() {
3936+
match event {
3937+
MessageSendEvent::BroadcastChannelAnnouncement { ref msg, .. } => {
3938+
if *msg == as_announcement { found_announcement = true; }
3939+
},
3940+
MessageSendEvent::BroadcastNodeAnnouncement { .. } => {},
3941+
_ => panic!("Unexpected event"),
3942+
}
3943+
}
3944+
assert!(found_announcement);
38873945
}
38883946

38893947
#[test]

0 commit comments

Comments
 (0)