diff --git a/beacon_node/beacon_chain/src/data_availability_checker/overflow_lru_cache.rs b/beacon_node/beacon_chain/src/data_availability_checker/overflow_lru_cache.rs index 5eebffdd2c4..b5eba1c4a5f 100644 --- a/beacon_node/beacon_chain/src/data_availability_checker/overflow_lru_cache.rs +++ b/beacon_node/beacon_chain/src/data_availability_checker/overflow_lru_cache.rs @@ -272,6 +272,7 @@ impl PendingComponents { &self, spec: &Arc, num_expected_columns_opt: Option, + min_proofs_required_opt: Option, recover: R, ) -> Result>, AvailabilityCheckError> where @@ -349,11 +350,8 @@ impl PendingComponents { return Ok(None); }; - // Check if this node needs execution proofs to validate blocks. - let needs_execution_proofs = spec.zkvm_min_proofs_required().is_some(); - - if needs_execution_proofs { - let min_proofs = spec.zkvm_min_proofs_required().unwrap(); + // Check if this block needs execution proofs. + if let Some(min_proofs) = min_proofs_required_opt { let num_proofs = self.execution_proof_subnet_count(); if num_proofs < min_proofs { // Not enough execution proofs yet @@ -605,7 +603,13 @@ impl DataAvailabilityCheckerInner { ); }); - self.check_availability_and_cache_components(block_root, pending_components, None) + let min_proofs_required_opt = self.get_min_proofs_required(epoch); + self.check_availability_and_cache_components( + block_root, + pending_components, + None, + min_proofs_required_opt, + ) } #[allow(clippy::type_complexity)] @@ -645,10 +649,12 @@ impl DataAvailabilityCheckerInner { ); }); + let min_proofs_required_opt = self.get_min_proofs_required(epoch); self.check_availability_and_cache_components( block_root, pending_components, Some(num_expected_columns), + min_proofs_required_opt, ) } @@ -682,6 +688,7 @@ impl DataAvailabilityCheckerInner { })?; let num_expected_columns_opt = self.get_num_expected_columns(epoch); + let min_proofs_required_opt = self.get_min_proofs_required(epoch); pending_components.span.in_scope(|| { debug!( @@ -696,6 +703,7 @@ impl DataAvailabilityCheckerInner { block_root, pending_components, num_expected_columns_opt, + min_proofs_required_opt, ) } @@ -704,10 +712,12 @@ impl DataAvailabilityCheckerInner { block_root: Hash256, pending_components: MappedRwLockReadGuard<'_, PendingComponents>, num_expected_columns_opt: Option, + min_proofs_required_opt: Option, ) -> Result, AvailabilityCheckError> { if let Some(available_block) = pending_components.make_available( &self.spec, num_expected_columns_opt, + min_proofs_required_opt, |block, span| self.state_cache.recover_pending_executed_block(block, span), )? { // Explicitly drop read lock before acquiring write lock @@ -876,6 +886,7 @@ impl DataAvailabilityCheckerInner { })?; let num_expected_columns_opt = self.get_num_expected_columns(epoch); + let min_proofs_required_opt = self.get_min_proofs_required(epoch); pending_components.span.in_scope(|| { debug!( @@ -889,6 +900,7 @@ impl DataAvailabilityCheckerInner { block_root, pending_components, num_expected_columns_opt, + min_proofs_required_opt, ) } @@ -903,6 +915,16 @@ impl DataAvailabilityCheckerInner { } } + /// Returns the minimum number of execution proofs required for a block at the given epoch. + /// Returns `None` if proofs are not required (zkVM not enabled for this epoch). + fn get_min_proofs_required(&self, epoch: Epoch) -> Option { + if self.spec.is_zkvm_enabled_for_epoch(epoch) { + self.spec.zkvm_min_proofs_required() + } else { + None + } + } + /// maintain the cache pub fn do_maintenance(&self, cutoff_epoch: Epoch) -> Result<(), AvailabilityCheckError> { // clean up any lingering states in the state cache