Load block roots from fork choice where possible when serving BlocksByRange requests (#7058)

* Load block roots from fork choice where possible to avoid loading state from disk when serving block by range requests.

* Check if the start slot is newer than finalization (`start_slot >= finalized_slot`), and use fork choice in that case.
This commit is contained in:
Jimmy Chen
2025-03-01 08:41:24 +11:00
committed by GitHub
parent 9f15f31942
commit 8706040094
3 changed files with 160 additions and 197 deletions

View File

@@ -7282,6 +7282,31 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
Ok(None)
}
/// Retrieves block roots (in ascending slot order) within some slot range from fork choice.
pub fn block_roots_from_fork_choice(&self, start_slot: u64, count: u64) -> Vec<Hash256> {
let head_block_root = self.canonical_head.cached_head().head_block_root();
let fork_choice_read_lock = self.canonical_head.fork_choice_read_lock();
let block_roots_iter = fork_choice_read_lock
.proto_array()
.iter_block_roots(&head_block_root);
let end_slot = start_slot.saturating_add(count);
let mut roots = vec![];
for (root, slot) in block_roots_iter {
if slot < end_slot && slot >= start_slot {
roots.push(root);
}
if slot < start_slot {
break;
}
}
drop(fork_choice_read_lock);
// return in ascending slot order
roots.reverse();
roots
}
}
impl<T: BeaconChainTypes> Drop for BeaconChain<T> {