Skip to content

Commit 3d3f8d0

Browse files
committed
Send announcement_signatures msgs out-of-band for ordered delivery
1 parent e96eb52 commit 3d3f8d0

File tree

5 files changed

+75
-53
lines changed

5 files changed

+75
-53
lines changed

src/ln/channelmanager.rs

Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1762,8 +1762,9 @@ impl ChannelManager {
17621762
Ok(())
17631763
}
17641764

1765-
fn internal_funding_locked(&self, their_node_id: &PublicKey, msg: &msgs::FundingLocked) -> Result<Option<msgs::AnnouncementSignatures>, MsgHandleErrInternal> {
1766-
let mut channel_state = self.channel_state.lock().unwrap();
1765+
fn internal_funding_locked(&self, their_node_id: &PublicKey, msg: &msgs::FundingLocked) -> Result<(), MsgHandleErrInternal> {
1766+
let mut channel_state_lock = self.channel_state.lock().unwrap();
1767+
let channel_state = channel_state_lock.borrow_parts();
17671768
match channel_state.by_id.get_mut(&msg.channel_id) {
17681769
Some(chan) => {
17691770
if chan.get_their_node_id() != *their_node_id {
@@ -1772,10 +1773,16 @@ impl ChannelManager {
17721773
}
17731774
chan.funding_locked(&msg)
17741775
.map_err(|e| MsgHandleErrInternal::from_chan_maybe_close(e, msg.channel_id))?;
1775-
return Ok(self.get_announcement_sigs(chan));
1776+
if let Some(announcement_sigs) = self.get_announcement_sigs(chan) {
1777+
channel_state.pending_msg_events.push(events::MessageSendEvent::SendAnnouncementSignatures {
1778+
node_id: their_node_id.clone(),
1779+
msg: announcement_sigs,
1780+
});
1781+
}
1782+
Ok(())
17761783
},
1777-
None => return Err(MsgHandleErrInternal::send_err_msg_no_close("Failed to find corresponding channel", msg.channel_id))
1778-
};
1784+
None => Err(MsgHandleErrInternal::send_err_msg_no_close("Failed to find corresponding channel", msg.channel_id))
1785+
}
17791786
}
17801787

17811788
fn internal_shutdown(&self, their_node_id: &PublicKey, msg: &msgs::Shutdown) -> Result<(Option<msgs::Shutdown>, Option<msgs::ClosingSigned>), MsgHandleErrInternal> {
@@ -2363,12 +2370,16 @@ impl ChainListener for ChannelManager {
23632370
channel_state.by_id.retain(|_, channel| {
23642371
let chan_res = channel.block_connected(header, height, txn_matched, indexes_of_txn_matched);
23652372
if let Ok(Some(funding_locked)) = chan_res {
2366-
let announcement_sigs = self.get_announcement_sigs(channel);
23672373
pending_msg_events.push(events::MessageSendEvent::SendFundingLocked {
23682374
node_id: channel.get_their_node_id(),
23692375
msg: funding_locked,
2370-
announcement_sigs: announcement_sigs
23712376
});
2377+
if let Some(announcement_sigs) = self.get_announcement_sigs(channel) {
2378+
pending_msg_events.push(events::MessageSendEvent::SendAnnouncementSignatures {
2379+
node_id: channel.get_their_node_id(),
2380+
msg: announcement_sigs,
2381+
});
2382+
}
23722383
short_to_id.insert(channel.get_short_channel_id().unwrap(), channel.channel_id());
23732384
} else if let Err(e) = chan_res {
23742385
pending_msg_events.push(events::MessageSendEvent::HandleError {
@@ -2507,7 +2518,7 @@ impl ChannelMessageHandler for ChannelManager {
25072518
handle_error!(self, self.internal_funding_signed(their_node_id, msg), their_node_id)
25082519
}
25092520

2510-
fn handle_funding_locked(&self, their_node_id: &PublicKey, msg: &msgs::FundingLocked) -> Result<Option<msgs::AnnouncementSignatures>, HandleError> {
2521+
fn handle_funding_locked(&self, their_node_id: &PublicKey, msg: &msgs::FundingLocked) -> Result<(), HandleError> {
25112522
handle_error!(self, self.internal_funding_locked(their_node_id, msg), their_node_id)
25122523
}
25132524

@@ -2954,30 +2965,27 @@ mod tests {
29542965

29552966
fn create_chan_between_nodes_with_value_confirm(node_a: &Node, node_b: &Node, tx: &Transaction) -> ((msgs::FundingLocked, msgs::AnnouncementSignatures), [u8; 32]) {
29562967
confirm_transaction(&node_b.chain_monitor, &tx, tx.version);
2957-
let events_5 = node_b.node.get_and_clear_pending_msg_events();
2958-
assert_eq!(events_5.len(), 1);
2959-
match events_5[0] {
2960-
MessageSendEvent::SendFundingLocked { ref node_id, ref msg, ref announcement_sigs } => {
2961-
assert_eq!(*node_id, node_a.node.get_our_node_id());
2962-
assert!(announcement_sigs.is_none());
2963-
node_a.node.handle_funding_locked(&node_b.node.get_our_node_id(), msg).unwrap()
2964-
},
2965-
_ => panic!("Unexpected event"),
2966-
};
2968+
node_a.node.handle_funding_locked(&node_b.node.get_our_node_id(), &get_event_msg!(node_b, MessageSendEvent::SendFundingLocked, node_a.node.get_our_node_id())).unwrap();
29672969

29682970
let channel_id;
29692971

29702972
confirm_transaction(&node_a.chain_monitor, &tx, tx.version);
29712973
let events_6 = node_a.node.get_and_clear_pending_msg_events();
2972-
assert_eq!(events_6.len(), 1);
2973-
(match events_6[0] {
2974-
MessageSendEvent::SendFundingLocked { ref node_id, ref msg, ref announcement_sigs } => {
2974+
assert_eq!(events_6.len(), 2);
2975+
((match events_6[0] {
2976+
MessageSendEvent::SendFundingLocked { ref node_id, ref msg } => {
29752977
channel_id = msg.channel_id.clone();
29762978
assert_eq!(*node_id, node_b.node.get_our_node_id());
2977-
(msg.clone(), announcement_sigs.clone().unwrap())
2979+
msg.clone()
2980+
},
2981+
_ => panic!("Unexpected event"),
2982+
}, match events_6[1] {
2983+
MessageSendEvent::SendAnnouncementSignatures { ref node_id, ref msg } => {
2984+
assert_eq!(*node_id, node_b.node.get_our_node_id());
2985+
msg.clone()
29782986
},
29792987
_ => panic!("Unexpected event"),
2980-
}, channel_id)
2988+
}), channel_id)
29812989
}
29822990

29832991
fn create_chan_between_nodes_with_value_a(node_a: &Node, node_b: &Node, channel_value: u64, push_msat: u64) -> ((msgs::FundingLocked, msgs::AnnouncementSignatures), [u8; 32], Transaction) {
@@ -2987,11 +2995,9 @@ mod tests {
29872995
}
29882996

29892997
fn create_chan_between_nodes_with_value_b(node_a: &Node, node_b: &Node, as_funding_msgs: &(msgs::FundingLocked, msgs::AnnouncementSignatures)) -> (msgs::ChannelAnnouncement, msgs::ChannelUpdate, msgs::ChannelUpdate) {
2990-
let bs_announcement_sigs = {
2991-
let bs_announcement_sigs = node_b.node.handle_funding_locked(&node_a.node.get_our_node_id(), &as_funding_msgs.0).unwrap().unwrap();
2992-
node_b.node.handle_announcement_signatures(&node_a.node.get_our_node_id(), &as_funding_msgs.1).unwrap();
2993-
bs_announcement_sigs
2994-
};
2998+
node_b.node.handle_funding_locked(&node_a.node.get_our_node_id(), &as_funding_msgs.0).unwrap();
2999+
let bs_announcement_sigs = get_event_msg!(node_b, MessageSendEvent::SendAnnouncementSignatures, node_a.node.get_our_node_id());
3000+
node_b.node.handle_announcement_signatures(&node_a.node.get_our_node_id(), &as_funding_msgs.1).unwrap();
29953001

29963002
let events_7 = node_b.node.get_and_clear_pending_msg_events();
29973003
assert_eq!(events_7.len(), 1);
@@ -5034,9 +5040,14 @@ mod tests {
50345040

50355041
for chan_msgs in resp_1.drain(..) {
50365042
if pre_all_htlcs {
5037-
let a = node_a.node.handle_funding_locked(&node_b.node.get_our_node_id(), &chan_msgs.0.unwrap());
5038-
let _announcement_sigs_opt = a.unwrap();
5039-
//TODO: Test announcement_sigs re-sending when we've implemented it
5043+
node_a.node.handle_funding_locked(&node_b.node.get_our_node_id(), &chan_msgs.0.unwrap()).unwrap();
5044+
let announcement_event = node_a.node.get_and_clear_pending_msg_events();
5045+
if !announcement_event.is_empty() {
5046+
assert_eq!(announcement_event.len(), 1);
5047+
if let MessageSendEvent::SendAnnouncementSignatures { .. } = announcement_event[0] {
5048+
//TODO: Test announcement_sigs re-sending
5049+
} else { panic!("Unexpected event!"); }
5050+
}
50405051
} else {
50415052
assert!(chan_msgs.0.is_none());
50425053
}
@@ -5083,8 +5094,14 @@ mod tests {
50835094

50845095
for chan_msgs in resp_2.drain(..) {
50855096
if pre_all_htlcs {
5086-
let _announcement_sigs_opt = node_b.node.handle_funding_locked(&node_a.node.get_our_node_id(), &chan_msgs.0.unwrap()).unwrap();
5087-
//TODO: Test announcement_sigs re-sending when we've implemented it
5097+
node_b.node.handle_funding_locked(&node_a.node.get_our_node_id(), &chan_msgs.0.unwrap()).unwrap();
5098+
let announcement_event = node_b.node.get_and_clear_pending_msg_events();
5099+
if !announcement_event.is_empty() {
5100+
assert_eq!(announcement_event.len(), 1);
5101+
if let MessageSendEvent::SendAnnouncementSignatures { .. } = announcement_event[0] {
5102+
//TODO: Test announcement_sigs re-sending
5103+
} else { panic!("Unexpected event!"); }
5104+
}
50885105
} else {
50895106
assert!(chan_msgs.0.is_none());
50905107
}
@@ -5390,9 +5407,8 @@ mod tests {
53905407
let events_1 = nodes[0].node.get_and_clear_pending_msg_events();
53915408
assert_eq!(events_1.len(), 1);
53925409
match events_1[0] {
5393-
MessageSendEvent::SendFundingLocked { ref node_id, msg: _, ref announcement_sigs } => {
5410+
MessageSendEvent::SendFundingLocked { ref node_id, msg: _ } => {
53945411
assert_eq!(*node_id, nodes[1].node.get_our_node_id());
5395-
assert!(announcement_sigs.is_none());
53965412
},
53975413
_ => panic!("Unexpected event"),
53985414
}
@@ -5401,9 +5417,8 @@ mod tests {
54015417
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
54025418
assert_eq!(events_2.len(), 1);
54035419
match events_2[0] {
5404-
MessageSendEvent::SendFundingLocked { ref node_id, msg: _, ref announcement_sigs } => {
5420+
MessageSendEvent::SendFundingLocked { ref node_id, msg: _ } => {
54055421
assert_eq!(*node_id, nodes[0].node.get_our_node_id());
5406-
assert!(announcement_sigs.is_none());
54075422
},
54085423
_ => panic!("Unexpected event"),
54095424
}

src/ln/msgs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ pub trait ChannelMessageHandler : events::MessageSendEventsProvider + Send + Syn
536536
/// Handle an incoming funding_signed message from the given peer.
537537
fn handle_funding_signed(&self, their_node_id: &PublicKey, msg: &FundingSigned) -> Result<(), HandleError>;
538538
/// Handle an incoming funding_locked message from the given peer.
539-
fn handle_funding_locked(&self, their_node_id: &PublicKey, msg: &FundingLocked) -> Result<Option<AnnouncementSignatures>, HandleError>;
539+
fn handle_funding_locked(&self, their_node_id: &PublicKey, msg: &FundingLocked) -> Result<(), HandleError>;
540540

541541
// Channl close:
542542
/// Handle an incoming shutdown message from the given peer.

src/ln/peer_handler.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -576,11 +576,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
576576
},
577577
36 => {
578578
let msg = try_potential_decodeerror!(msgs::FundingLocked::read(&mut reader));
579-
let resp_option = try_potential_handleerror!(self.message_handler.chan_handler.handle_funding_locked(&peer.their_node_id.unwrap(), &msg));
580-
match resp_option {
581-
Some(resp) => encode_and_send_msg!(resp, 259),
582-
None => {},
583-
}
579+
try_potential_handleerror!(self.message_handler.chan_handler.handle_funding_locked(&peer.their_node_id.unwrap(), &msg));
584580
},
585581

586582
38 => {
@@ -828,19 +824,25 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
828824
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 35)));
829825
Self::do_attempt_write_data(&mut descriptor, peer);
830826
},
831-
MessageSendEvent::SendFundingLocked { ref node_id, ref msg, ref announcement_sigs } => {
832-
log_trace!(self, "Handling SendFundingLocked event in peer_handler for node {}{} for channel {}",
827+
MessageSendEvent::SendFundingLocked { ref node_id, ref msg } => {
828+
log_trace!(self, "Handling SendFundingLocked event in peer_handler for node {} for channel {}",
833829
log_pubkey!(node_id),
834-
if announcement_sigs.is_some() { " with announcement sigs" } else { "" },
835830
log_bytes!(msg.channel_id));
836831
let (mut descriptor, peer) = get_peer_for_forwarding!(node_id, {
837832
//TODO: Do whatever we're gonna do for handling dropped messages
838833
});
839834
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 36)));
840-
match announcement_sigs {
841-
&Some(ref announce_msg) => peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(announce_msg, 259))),
842-
&None => {},
843-
}
835+
Self::do_attempt_write_data(&mut descriptor, peer);
836+
},
837+
MessageSendEvent::SendAnnouncementSignatures { ref node_id, ref msg } => {
838+
log_trace!(self, "Handling SendAnnouncementSignatures event in peer_handler for node {} for channel {})",
839+
log_pubkey!(node_id),
840+
log_bytes!(msg.channel_id));
841+
let (mut descriptor, peer) = get_peer_for_forwarding!(node_id, {
842+
//TODO: generate a DiscardFunding event indicating to the wallet that
843+
//they should just throw away this funding transaction
844+
});
845+
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 259)));
844846
Self::do_attempt_write_data(&mut descriptor, peer);
845847
},
846848
MessageSendEvent::UpdateHTLCs { ref node_id, updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {

src/util/events.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,13 @@ pub enum MessageSendEvent {
127127
node_id: PublicKey,
128128
/// The funding_locked message which should be sent.
129129
msg: msgs::FundingLocked,
130-
/// An optional additional announcement_signatures message which should be sent.
131-
announcement_sigs: Option<msgs::AnnouncementSignatures>,
130+
},
131+
/// Used to indicate that an announcement_signatures message should be sent to the peer with the given node_id.
132+
SendAnnouncementSignatures {
133+
/// The node_id of the node which should receive these message(s)
134+
node_id: PublicKey,
135+
/// The announcement_signatures message which should be sent.
136+
msg: msgs::AnnouncementSignatures,
132137
},
133138
/// Used to indicate that a series of HTLC update messages, as well as a commitment_signed
134139
/// message should be sent to the peer with the given node_id.

src/util/test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
9898
fn handle_funding_signed(&self, _their_node_id: &PublicKey, _msg: &msgs::FundingSigned) -> Result<(), HandleError> {
9999
Err(HandleError { err: "", action: None })
100100
}
101-
fn handle_funding_locked(&self, _their_node_id: &PublicKey, _msg: &msgs::FundingLocked) -> Result<Option<msgs::AnnouncementSignatures>, HandleError> {
101+
fn handle_funding_locked(&self, _their_node_id: &PublicKey, _msg: &msgs::FundingLocked) -> Result<(), HandleError> {
102102
Err(HandleError { err: "", action: None })
103103
}
104104
fn handle_shutdown(&self, _their_node_id: &PublicKey, _msg: &msgs::Shutdown) -> Result<(Option<msgs::Shutdown>, Option<msgs::ClosingSigned>), HandleError> {

0 commit comments

Comments
 (0)