Make ExecutionEngine highly recommended but optional#5151
Make ExecutionEngine highly recommended but optional#5151barnabasbusa wants to merge 4 commits intoethereum:masterfrom
ExecutionEngine highly recommended but optional#5151Conversation
Mirror the fire-and-forget pattern used for ProofEngine by dropping the assert on `execution_engine.verify_and_notify_new_payload`. With EIP-8025 execution proofs, consensus correctness is established via the proof engine path, so gating consensus on the execution engine's response is no longer strictly required. Running an execution engine remains highly recommended for defense-in-depth.
…ted by proofs The previous phrasing "consensus correctness is established via the proof engine path" was misleading -- `process_execution_proof` runs during gossip validation, not as part of block state-transition, and proofs are explicitly optional in this EIP. With the execution-engine assert removed, consensus no longer verifies execution validity at all; validity becomes an out-of-band concern handled by a locally-run execution engine and/or by asynchronously gossiped execution proofs. State this explicitly so the trade-off is visible to readers.
Introduce a validator SHOULD-rule that gates attestation on having an independent execution-validity signal: either a local ExecutionEngine VALID response or a verified SignedExecutionProof for the corresponding NewPayloadRequest. This restores the missed-attestation penalty signal for validators that opt out of running a local execution engine, so that opt-out validators who also fail to verify a proof before the attestation deadline self-correct via standard inactivity penalties rather than silently attesting to invalid blocks. Addresses reviewer concern that merely removing the consensus-level assert left validators free to attest to any syntactically valid block without any execution-validity verification.
ExecutionEngine highly recommended but optional
|
I've opened #5161 as a draft alternative that handles the optional-engine aspect of EIP-8025 entirely in Short version of the rationale:
@mkalinin — thanks for the Optimistic Sync routing suggestion on frisitano#3. I've taken that direction in #5161 but kept EE and PE disjoint rather than coupling them inside I don't have strong conviction on what the best approach is; wanted to provide this as a potential direction for our discussions. |
Agreed. But then I would prefer to have a maybe abstract but explicit definition of the second source of payload validity in the spec, i.e. |
Currently, the |
Adds prose to sync/optimistic.md covering two EIP-8025-specific cases without changing any function signatures or pseudocode in beacon-chain.md: 1. Engine absence: when a consensus engine is not configured with an ExecutionEngine (or ProofEngine), the corresponding signal is treated as NOT_VALIDATED for the purposes of optimistic import. A block is non-optimistic only after at least one signal source returns VALID. 2. ProofEngine as parallel VALID signal source: when the ProofEngine returns VALID for a SignedExecutionProof whose public_input.new_payload_request_root matches a block's NewPayloadRequest, the consensus engine transitions the block from NOT_VALIDATED -> VALID in the same manner as an ExecutionEngine VALID response. This keeps ExecutionEngine and ProofEngine strictly disjoint at the function level, with unification at the fork-choice / optimistic-sync layer. No changes to beacon-chain.md pseudocode, no Optional[] cascade through the fork hierarchy, no new validator.md file. Existing optimistic-sync attestation rules cover honest-validator behaviour. Alternative direction to ethereum#5151. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
This PR extends the fire-and-forget pattern used for the
ProofEngine(introduced in #5055) to theExecutionEnginein EIP-8025, while adding a validator-level rule that preserves the missed-attestation penalty signal for validators that opt out of running a local EL.This was originally opened as frisitano#3 against the
feat/eip8025-refactorbranch. Since #5055 is now merged upstream, this PR re-targetsethereum/consensus-specs:master. See the original thread for prior review discussion from @frisitano and @mkalinin — summarized in the "Prior review" section below.Proposal
Two changes:
assertonexecution_engine.verify_and_notify_new_payloadinprocess_execution_payload, matching the fire-and-forgetProofEnginetreatment. A node that chooses not to run a local execution engine (e.g. a stateless client consuming proofs) should not be forced to by the consensus spec.validator.md(SHOULD-level): a validator SHOULD NOT attest to a block whoseexecution_payloadhas not been independently validated — either by a local EL returningVALID, or by a verifiedSignedExecutionProofwhosepublic_input.new_payload_request_rootmatches the block'sNewPayloadRequest, received by the attestation deadline. If neither signal is available, the validator SHOULD withhold attestation.Why both changes are needed
Removing the consensus-level
assertalone would be unsafe during the optional-proof phase:proof_engine.notify_new_payloadis fire-and-forget; it performs no verification.process_execution_proof(which does verify proofs) is only invoked viaexecution_proofgossip validation — it is not part of block state-transition.Change (2) restores the penalty signal. Validators that opt out of the EL and also fail to receive a valid proof in time simply miss their attestation and pay the standard inactivity penalty — making the opt-out economically self-regulating rather than a silent safety risk.
What changed
specs/_features/eip8025/beacon-chain.mdassertwrapper onexecution_engine.verify_and_notify_new_payload(...).*Note*aboveprocess_execution_payloadto describe both engines as fire-and-forget notifications and to be explicit that execution-validity verification becomes out-of-band.specs/_features/eip8025/validator.md(new file)Why "highly recommended" rather than "removed"
Running an execution engine remains the right default for defense-in-depth: independent check against proof-engine bugs/malicious provers, needed for local block building and fast attesting, useful fallback while proof availability/latency matures. Validators who want to opt out now pay the cost of either running a proof subscription or missing attestations — which seems like the right incentive shape for an optional-proof phase.
Prior review on frisitano#3
Not repeated here verbatim — please read the linked thread for full context — but the main discussion points were:
NOT_VALIDATED/ optimistic import semantics.verify_and_notify_new_payloadto returnNOT_VALIDATEDwhen no EL is configured.verify_and_notify_new_payloadto returnTrueonly when EL returnedVALIDor aVALIDproof has been received from p2p; let Optimistic Sync handle the pending-proof state (analogous to howSYNCING/ACCEPTEDis handled today).Happy to iterate on these in this PR.
Open questions for discussion
execution_engine.notify_new_payload(returningNone) to match the proof engine signature exactly? That is more invasive sinceverify_and_notify_new_payloadis defined up the fork hierarchy (Bellatrix onwards), so I kept this PR to the minimal semantic change.Test plan
eip8025/beacon-chain.md(verified locally — Python blocks AST-parse cleanly; only change isassertremoval).validator.mdsection for correctness of the proof-matching condition (public_input.new_payload_request_rootagainsthash_tree_root(new_payload_request)).