Skip to content

Commit 45700d3

Browse files
committed
Add genesis block hash to NetworkGraph
This changes adds the genesis block hash as a BlockHash to the NetworkGraph struct. Making the NetworkGraph aware allows the message handler to validate the chain_hash for received messages. This change also adds the hash value to the Writeable and Readable methods.
1 parent 8e62de9 commit 45700d3

File tree

3 files changed

+16
-13
lines changed

3 files changed

+16
-13
lines changed

lightning/src/ln/functional_test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1171,7 +1171,7 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
11711171
let payment_count = Rc::new(RefCell::new(0));
11721172

11731173
for i in 0..node_count {
1174-
let net_graph_msg_handler = NetGraphMsgHandler::new(None, cfgs[i].logger);
1174+
let net_graph_msg_handler = NetGraphMsgHandler::new(cfgs[i].chain_source.genesis_hash, None, cfgs[i].logger);
11751175
nodes.push(Node{ chain_source: cfgs[i].chain_source,
11761176
tx_broadcaster: cfgs[i].tx_broadcaster, chain_monitor: &cfgs[i].chain_monitor,
11771177
keys_manager: &cfgs[i].keys_manager, node: &chan_mgrs[i], net_graph_msg_handler,

lightning/src/routing/network_graph.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ const MAX_REPLY_CHANNEL_RANGE_PER_QUERY: usize = 250;
5555
/// Represents the network as nodes and channels between them
5656
#[derive(PartialEq)]
5757
pub struct NetworkGraph {
58+
genesis_hash: BlockHash,
5859
channels: BTreeMap<u64, ChannelInfo>,
5960
nodes: BTreeMap<PublicKey, NodeInfo>,
6061
}
@@ -87,13 +88,10 @@ impl<C: Deref, L: Deref> NetGraphMsgHandler<C, L> where C::Target: chain::Access
8788
/// Chain monitor is used to make sure announced channels exist on-chain,
8889
/// channel data is correct, and that the announcement is signed with
8990
/// channel owners' keys.
90-
pub fn new(chain_access: Option<C>, logger: L) -> Self {
91+
pub fn new(genesis_hash: BlockHash, chain_access: Option<C>, logger: L) -> Self {
9192
NetGraphMsgHandler {
9293
secp_ctx: Secp256k1::verification_only(),
93-
network_graph: RwLock::new(NetworkGraph {
94-
channels: BTreeMap::new(),
95-
nodes: BTreeMap::new(),
96-
}),
94+
network_graph: RwLock::new(NetworkGraph::new(genesis_hash)),
9795
full_syncs_requested: AtomicUsize::new(0),
9896
chain_access,
9997
pending_events: Mutex::new(vec![]),
@@ -903,6 +901,7 @@ impl Readable for NodeInfo {
903901

904902
impl Writeable for NetworkGraph {
905903
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
904+
self.genesis_hash.write(writer)?;
906905
(self.channels.len() as u64).write(writer)?;
907906
for (ref chan_id, ref chan_info) in self.channels.iter() {
908907
(*chan_id).write(writer)?;
@@ -919,6 +918,7 @@ impl Writeable for NetworkGraph {
919918

920919
impl Readable for NetworkGraph {
921920
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<NetworkGraph, DecodeError> {
921+
let genesis_hash: BlockHash = Readable::read(reader)?;
922922
let channels_count: u64 = Readable::read(reader)?;
923923
let mut channels = BTreeMap::new();
924924
for _ in 0..channels_count {
@@ -934,6 +934,7 @@ impl Readable for NetworkGraph {
934934
nodes.insert(node_id, node_info);
935935
}
936936
Ok(NetworkGraph {
937+
genesis_hash,
937938
channels,
938939
nodes,
939940
})
@@ -979,8 +980,9 @@ impl NetworkGraph {
979980
}
980981

981982
/// Creates a new, empty, network graph.
982-
pub fn new() -> NetworkGraph {
983+
pub fn new(genesis_hash: BlockHash) -> NetworkGraph {
983984
Self {
985+
genesis_hash,
984986
channels: BTreeMap::new(),
985987
nodes: BTreeMap::new(),
986988
}
@@ -1365,7 +1367,8 @@ mod tests {
13651367
fn create_net_graph_msg_handler() -> (Secp256k1<All>, NetGraphMsgHandler<Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>) {
13661368
let secp_ctx = Secp256k1::new();
13671369
let logger = Arc::new(test_utils::TestLogger::new());
1368-
let net_graph_msg_handler = NetGraphMsgHandler::new(None, Arc::clone(&logger));
1370+
let genesis_hash = genesis_block(Network::Testnet).header.block_hash();
1371+
let net_graph_msg_handler = NetGraphMsgHandler::new(genesis_hash, None, Arc::clone(&logger));
13691372
(secp_ctx, net_graph_msg_handler)
13701373
}
13711374

@@ -1526,7 +1529,7 @@ mod tests {
15261529
};
15271530

15281531
// Test if the UTXO lookups were not supported
1529-
let mut net_graph_msg_handler = NetGraphMsgHandler::new(None, Arc::clone(&logger));
1532+
let mut net_graph_msg_handler = NetGraphMsgHandler::new(genesis_block(Network::Testnet).header.block_hash(), None, Arc::clone(&logger));
15301533
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
15311534
Ok(res) => assert!(res),
15321535
_ => panic!()
@@ -1550,7 +1553,7 @@ mod tests {
15501553
// Test if an associated transaction were not on-chain (or not confirmed).
15511554
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
15521555
*chain_source.utxo_ret.lock().unwrap() = Err(chain::AccessError::UnknownTx);
1553-
net_graph_msg_handler = NetGraphMsgHandler::new(Some(chain_source.clone()), Arc::clone(&logger));
1556+
net_graph_msg_handler = NetGraphMsgHandler::new(chain_source.clone().genesis_hash, Some(chain_source.clone()), Arc::clone(&logger));
15541557
unsigned_announcement.short_channel_id += 1;
15551558

15561559
msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
@@ -1674,7 +1677,7 @@ mod tests {
16741677
let secp_ctx = Secp256k1::new();
16751678
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
16761679
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
1677-
let net_graph_msg_handler = NetGraphMsgHandler::new(Some(chain_source.clone()), Arc::clone(&logger));
1680+
let net_graph_msg_handler = NetGraphMsgHandler::new(genesis_block(Network::Testnet).header.block_hash(), Some(chain_source.clone()), Arc::clone(&logger));
16781681

16791682
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
16801683
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();

lightning/src/routing/router.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ mod tests {
538538
fn build_graph() -> (Secp256k1<All>, NetGraphMsgHandler<std::sync::Arc<crate::util::test_utils::TestChainSource>, std::sync::Arc<crate::util::test_utils::TestLogger>>, std::sync::Arc<test_utils::TestLogger>) {
539539
let secp_ctx = Secp256k1::new();
540540
let logger = Arc::new(test_utils::TestLogger::new());
541-
let net_graph_msg_handler = NetGraphMsgHandler::new(None, Arc::clone(&logger));
541+
let net_graph_msg_handler = NetGraphMsgHandler::new(genesis_block(Network::Testnet).header.block_hash(), None, Arc::clone(&logger));
542542
// Build network from our_id to node7:
543543
//
544544
// -1(1)2- node0 -1(3)2-
@@ -1258,7 +1258,7 @@ mod tests {
12581258
inbound_capacity_msat: 100000,
12591259
is_live: true,
12601260
}];
1261-
let route = get_route(&source_node_id, &NetworkGraph::new(), &target_node_id, Some(&our_chans.iter().collect::<Vec<_>>()), &last_hops.iter().collect::<Vec<_>>(), 100, 42, Arc::new(test_utils::TestLogger::new())).unwrap();
1261+
let route = get_route(&source_node_id, &NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash()), &target_node_id, Some(&our_chans.iter().collect::<Vec<_>>()), &last_hops.iter().collect::<Vec<_>>(), 100, 42, Arc::new(test_utils::TestLogger::new())).unwrap();
12621262

12631263
assert_eq!(route.paths[0].len(), 2);
12641264

0 commit comments

Comments
 (0)