Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fail RGS data processing early if there is a chain hash mismatch #2324

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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