Skip to content

Commit d2b44ca

Browse files
authored
Merge pull request #133 from TheBlueMatt/2018-08-announcement_sigs
Clean up/clarify channel announcement_signatures handling
2 parents bec2595 + 30b47bb commit d2b44ca

File tree

2 files changed

+21
-19
lines changed

2 files changed

+21
-19
lines changed

src/ln/channel.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ impl Channel {
373373
}
374374

375375
fn derive_minimum_depth(_channel_value_satoshis_msat: u64, _value_to_self_msat: u64) -> u32 {
376+
// Note that in order to comply with BOLT 7 announcement_signatures requirements this must
377+
// be at least 6.
376378
const CONF_TARGET: u32 = 12; //TODO: Should be much higher
377379
CONF_TARGET
378380
}
@@ -2273,18 +2275,22 @@ impl Channel {
22732275

22742276
/// Gets an UnsignedChannelAnnouncement, as well as a signature covering it using our
22752277
/// bitcoin_key, if available, for this channel. The channel must be publicly announceable and
2276-
/// available for use (have exchanged FundingLocked messages in both directions. Should be used
2278+
/// available for use (have exchanged FundingLocked messages in both directions). Should be used
22772279
/// for both loose and in response to an AnnouncementSignatures message from the remote peer.
2278-
/// Note that you can get an announcement for a channel which is closing, though you should
2279-
/// likely not announce such a thing. In case its already been announced, a channel_update
2280-
/// message can mark the channel disabled.
2280+
/// Will only fail if we're not in a state where channel_announcement may be sent (including
2281+
/// closing).
2282+
/// Note that the "channel must be funded" requirement is stricter than BOLT 7 requires - see
2283+
/// https://github.com/lightningnetwork/lightning-rfc/issues/468
22812284
pub fn get_channel_announcement(&self, our_node_id: PublicKey, chain_hash: Sha256dHash) -> Result<(msgs::UnsignedChannelAnnouncement, Signature), HandleError> {
22822285
if !self.announce_publicly {
22832286
return Err(HandleError{err: "Channel is not available for public announcements", action: None});
22842287
}
2285-
if self.channel_state & (ChannelState::ChannelFunded as u32) != (ChannelState::ChannelFunded as u32) {
2288+
if self.channel_state & (ChannelState::ChannelFunded as u32) == 0 {
22862289
return Err(HandleError{err: "Cannot get a ChannelAnnouncement until the channel funding has been locked", action: None});
22872290
}
2291+
if (self.channel_state & (ChannelState::LocalShutdownSent as u32 | ChannelState::ShutdownComplete as u32)) != 0 {
2292+
return Err(HandleError{err: "Cannot get a ChannelAnnouncement once the channel is closing", action: None});
2293+
}
22882294

22892295
let were_node_one = our_node_id.serialize()[..] < self.their_node_id.serialize()[..];
22902296
let our_bitcoin_key = PublicKey::from_secret_key(&self.secp_ctx, &self.local_keys.funding_key);

src/ln/channelmanager.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,19 +1030,22 @@ impl ChannelManager {
10301030
}
10311031
}
10321032

1033-
fn get_announcement_sigs(&self, chan: &Channel) -> Result<Option<msgs::AnnouncementSignatures>, HandleError> {
1034-
if !chan.is_usable() || !chan.should_announce() { return Ok(None) }
1033+
fn get_announcement_sigs(&self, chan: &Channel) -> Option<msgs::AnnouncementSignatures> {
1034+
if !chan.should_announce() { return None }
10351035

1036-
let (announcement, our_bitcoin_sig) = chan.get_channel_announcement(self.get_our_node_id(), self.genesis_hash.clone())?;
1036+
let (announcement, our_bitcoin_sig) = match chan.get_channel_announcement(self.get_our_node_id(), self.genesis_hash.clone()) {
1037+
Ok(res) => res,
1038+
Err(_) => return None, // Only in case of state precondition violations eg channel is closing
1039+
};
10371040
let msghash = Message::from_slice(&Sha256dHash::from_data(&announcement.encode()[..])[..]).unwrap();
10381041
let our_node_sig = self.secp_ctx.sign(&msghash, &self.our_network_key);
10391042

1040-
Ok(Some(msgs::AnnouncementSignatures {
1043+
Some(msgs::AnnouncementSignatures {
10411044
channel_id: chan.channel_id(),
10421045
short_channel_id: chan.get_short_channel_id().unwrap(),
10431046
node_signature: our_node_sig,
10441047
bitcoin_signature: our_bitcoin_sig,
1045-
}))
1048+
})
10461049
}
10471050

10481051
/// Processes HTLCs which are pending waiting on random forward delay.
@@ -1379,14 +1382,7 @@ impl ChainListener for ChannelManager {
13791382
channel_state.by_id.retain(|_, channel| {
13801383
let chan_res = channel.block_connected(header, height, txn_matched, indexes_of_txn_matched);
13811384
if let Ok(Some(funding_locked)) = chan_res {
1382-
let announcement_sigs = match self.get_announcement_sigs(channel) {
1383-
Ok(res) => res,
1384-
Err(e) => {
1385-
log_error!(self, "Got error handling message: {}!", e.err);
1386-
//TODO: push e on events and blow up the channel (it has bad keys)
1387-
return true;
1388-
}
1389-
};
1385+
let announcement_sigs = self.get_announcement_sigs(channel);
13901386
new_events.push(events::Event::SendFundingLocked {
13911387
node_id: channel.get_their_node_id(),
13921388
msg: funding_locked,
@@ -1626,7 +1622,7 @@ impl ChannelMessageHandler for ChannelManager {
16261622
return Err(HandleError{err: "Got a message for a channel from the wrong node!", action: None})
16271623
}
16281624
chan.funding_locked(&msg)?;
1629-
return Ok(self.get_announcement_sigs(chan)?);
1625+
return Ok(self.get_announcement_sigs(chan));
16301626
},
16311627
None => return Err(HandleError{err: "Failed to find corresponding channel", action: None})
16321628
};

0 commit comments

Comments
 (0)