Skip to content

Commit

Permalink
Fail RGS data processing early if there is a chain hash mismatch
Browse files Browse the repository at this point in the history
No point in doing any extra processing if we don't even have a match
for the chain hash.
  • Loading branch information
dunxen committed May 29, 2023
1 parent 4dce209 commit 142fdca
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lightning-background-processor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1124,7 +1124,7 @@ mod tests {
fn create_nodes(num_nodes: usize, persist_dir: &str) -> (String, Vec<Node>) {
let persist_temp_path = env::temp_dir().join(persist_dir);
let persist_dir = persist_temp_path.to_string_lossy().to_string();
let network = Network::Testnet;
let network = Network::Bitcoin;
let mut nodes = Vec::new();
for i in 0..num_nodes {
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster::new(network));
Expand All @@ -1135,7 +1135,7 @@ mod tests {
let scorer = Arc::new(Mutex::new(TestScorer::new()));
let seed = [i as u8; 32];
let router = Arc::new(DefaultRouter::new(network_graph.clone(), logger.clone(), seed, scorer.clone(), ()));
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Bitcoin));
let persister = Arc::new(FilesystemPersister::new(format!("{}_persister_{}", &persist_dir, i)));
let now = Duration::from_secs(genesis_block.header.time as u64);
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos()));
Expand Down
28 changes: 28 additions & 0 deletions lightning-rapid-gossip-sync/src/processing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,16 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
}

let chain_hash: BlockHash = Readable::read(read_cursor)?;
let ng_genesis_hash = self.network_graph.get_genesis_hash();
if chain_hash != ng_genesis_hash {
return Err(
LightningError {
err: "Rapid Gossip Sync data's chain hash does not match the network graph's".to_owned(),
action: ErrorAction::IgnoreError,
}.into()
);
}

let latest_seen_timestamp: u32 = Readable::read(read_cursor)?;

if let Some(time) = current_time_unix {
Expand Down Expand Up @@ -667,4 +677,22 @@ mod tests {
panic!("Unexpected update result: {:?}", update_result)
}
}

#[test]
fn fails_early_on_chain_hash_mismatch() {
let logger = TestLogger::new();
// Set to testnet so that the VALID_RGS_BINARY chain hash of mainnet does not match.
let network_graph = NetworkGraph::new(Network::Testnet, &logger);

assert_eq!(network_graph.read_only().channels().len(), 0);

let rapid_sync = RapidGossipSync::new(&network_graph, &logger);
let update_result = rapid_sync.update_network_graph_no_std(&VALID_RGS_BINARY, Some(0));
assert!(update_result.is_err());
if let Err(GraphSyncError::LightningError(err)) = update_result {
assert_eq!(err.err, "Rapid Gossip Sync data's chain hash does not match the network graph's");
} else {
panic!("Unexpected update result: {:?}", update_result)
}
}
}
5 changes: 5 additions & 0 deletions lightning/src/routing/gossip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,11 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
},
}
}

/// Gets the genesis hash for this network graph.
pub fn get_genesis_hash(&self) -> BlockHash {
self.genesis_hash
}
}

macro_rules! secp_verify_sig {
Expand Down

0 comments on commit 142fdca

Please sign in to comment.