Skip to content

Commit 8799a2a

Browse files
authored
Merge pull request #828 from bmancini55/reply_channel_range
Handle query_channel_range gossip queries
2 parents 2cb5b1a + 7b842b6 commit 8799a2a

File tree

8 files changed

+515
-21
lines changed

8 files changed

+515
-21
lines changed

lightning/src/ln/channel.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use util::ser::{Readable, ReadableArgs, Writeable, Writer, VecWriter};
3737
use util::logger::Logger;
3838
use util::errors::APIError;
3939
use util::config::{UserConfig,ChannelConfig};
40+
use util::scid_utils::scid_from_parts;
4041

4142
use std;
4243
use std::{cmp,mem,fmt};
@@ -3550,14 +3551,11 @@ impl<Signer: Sign> Channel<Signer> {
35503551
}
35513552
}
35523553
}
3553-
if height > 0xff_ff_ff || (index_in_block) > 0xff_ff_ff {
3554-
panic!("Block was bogus - either height 16 million or had > 16 million transactions");
3555-
}
3556-
assert!(txo_idx <= 0xffff); // txo_idx is a (u16 as usize), so this is just listed here for completeness
35573554
self.funding_tx_confirmations = 1;
3558-
self.short_channel_id = Some(((height as u64) << (5*8)) |
3559-
((index_in_block as u64) << (2*8)) |
3560-
((txo_idx as u64) << (0*8)));
3555+
self.short_channel_id = match scid_from_parts(height as u64, index_in_block as u64, txo_idx as u64) {
3556+
Ok(scid) => Some(scid),
3557+
Err(_) => panic!("Block was bogus - either height was > 16 million, had > 16 million transactions, or had > 65k outputs"),
3558+
}
35613559
}
35623560
}
35633561
}

lightning/src/ln/channelmanager.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3596,6 +3596,7 @@ impl<Signer: Sign, M: Deref + Sync + Send, T: Deref + Sync + Send, K: Deref + Sy
35963596
&events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => true,
35973597
&events::MessageSendEvent::SendChannelRangeQuery { .. } => false,
35983598
&events::MessageSendEvent::SendShortIdsQuery { .. } => false,
3599+
&events::MessageSendEvent::SendReplyChannelRange { .. } => false,
35993600
}
36003601
});
36013602
}

lightning/src/ln/msgs.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,6 +1682,19 @@ impl Writeable for ReplyShortChannelIdsEnd {
16821682
}
16831683
}
16841684

1685+
impl QueryChannelRange {
1686+
/**
1687+
* Calculates the overflow safe ending block height for the query.
1688+
* Overflow returns `0xffffffff`, otherwise returns `first_blocknum + number_of_blocks`
1689+
*/
1690+
pub fn end_blocknum(&self) -> u32 {
1691+
match self.first_blocknum.checked_add(self.number_of_blocks) {
1692+
Some(block) => block,
1693+
None => u32::max_value(),
1694+
}
1695+
}
1696+
}
1697+
16851698
impl Readable for QueryChannelRange {
16861699
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
16871700
let chain_hash: BlockHash = Readable::read(r)?;
@@ -2523,6 +2536,24 @@ mod tests {
25232536
assert_eq!(msg.outgoing_cltv_value, 0xffffffff);
25242537
}
25252538

2539+
#[test]
2540+
fn query_channel_range_end_blocknum() {
2541+
let tests: Vec<(u32, u32, u32)> = vec![
2542+
(10000, 1500, 11500),
2543+
(0, 0xffffffff, 0xffffffff),
2544+
(1, 0xffffffff, 0xffffffff),
2545+
];
2546+
2547+
for (first_blocknum, number_of_blocks, expected) in tests.into_iter() {
2548+
let sut = msgs::QueryChannelRange {
2549+
chain_hash: BlockHash::from_hex("06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f").unwrap(),
2550+
first_blocknum,
2551+
number_of_blocks,
2552+
};
2553+
assert_eq!(sut.end_blocknum(), expected);
2554+
}
2555+
}
2556+
25262557
#[test]
25272558
fn encoding_query_channel_range() {
25282559
let mut query_channel_range = msgs::QueryChannelRange {

lightning/src/ln/peer_handler.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,17 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
12811281
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg)));
12821282
self.do_attempt_write_data(&mut descriptor, peer);
12831283
}
1284+
MessageSendEvent::SendReplyChannelRange { ref node_id, ref msg } => {
1285+
log_trace!(self.logger, "Handling SendReplyChannelRange event in peer_handler for node {} with num_scids={} first_blocknum={} number_of_blocks={}, sync_complete={}",
1286+
log_pubkey!(node_id),
1287+
msg.short_channel_ids.len(),
1288+
msg.first_blocknum,
1289+
msg.number_of_blocks,
1290+
msg.sync_complete);
1291+
let (mut descriptor, peer) = get_peer_for_forwarding!(node_id, {});
1292+
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg)));
1293+
self.do_attempt_write_data(&mut descriptor, peer);
1294+
}
12841295
}
12851296
}
12861297

0 commit comments

Comments
 (0)