Summary
Finalized app-shard frames can be dropped by state-dependent revalidation, potentially stalling a replica indefinitely.
Details
When an app-shard frame finalizes, handle_cw_finalized_frame re-runs full frame validation before materializing it, as a guard against a BlockStore substitution after the committee verified the proposal (app_engine.rs:2344). On any validation failure it silently drops the frame.
This revalidation can produce different results because it reads mutable local state:
- The storage-attestation check reads registered leaf roots from the local prover-registry cache (frame_validator.rs:902). That cache is cleared and rebuilt from the local persisted hypergraph. A refresh can change whether a given (member, leaf, epoch) entry exists. In particular, registration vertices retain PrevEpoch, Epoch, and NextEpoch, while the cache decoder currently loads only the main Epoch slot..
- The ρ_N derivation resolves the anchored global frame from the local clock store (frame_validator.rs:607). If the node is momentarily behind on the global chain, the anchor is "unavailable" and validation fails.
So an honest, committee-certified frame can pass validation at vote time and fail the same validation seconds later at finalize time — or pass on some replicas and fail on others.
Summary
Finalized app-shard frames can be dropped by state-dependent revalidation, potentially stalling a replica indefinitely.
Details
When an app-shard frame finalizes,
handle_cw_finalized_framere-runs full frame validation before materializing it, as a guard against aBlockStoresubstitution after the committee verified the proposal (app_engine.rs:2344). On any validation failure it silently drops the frame.This revalidation can produce different results because it reads mutable local state:
So an honest, committee-certified frame can pass validation at vote time and fail the same validation seconds later at finalize time — or pass on some replicas and fail on others.