PR #9178 added this Gloas-only test using ApiTester::new() which
produces a phase0 chain even under FORK_NAME=gloas, so
head.beacon_state.get_ptc(...) errored with IncorrectStateVariant.
After switching to new_with_hard_forks() three further issues
surfaced:
1. The slot clock is left at head_slot + 1 by the harness setup, so
a payload attestation for head_slot fails gossip propagation as a
PastSlot. Rewind the clock to head_slot in
make_valid_payload_attestation_message.
2. With VALIDATOR_COUNT = 32 and 32 slots/epoch, a slot's committees
often hold only a single validator. The PTC for that slot then
has one distinct validator regardless of PTCSize. The original
test chained JSON and SSZ sub-tests on the same harness with
ptc_offset 0 and 1 and asserted both gossip-published, but the
second message is a duplicate (same slot/validator) and is
silently dropped as PriorPayloadAttestationMessageKnown — so the
second recv() hangs forever. Split the SSZ variant into its own
test with its own harness so the two don't collide in the
ObservedPayloadAttesters cache.
3. Switching the JSON test to new_with_hard_forks() so the chain
actually reaches Gloas under FORK_NAME=gloas (same fix as the
sibling tests added in #8415 and #9100).
Verified locally: full Gloas suite 197/197 passed (350s).
#6689
Inspired by the initial implementation of #9108, credit to @chong-he.
This adds an extension trait to `Hash256` and add a `short` method to provide smaller formatted hashes for logging.
Co-Authored-By: Mac L <mjladson@pm.me>
PR #8415 added Gloas-only payload-timeliness-committee assertions to
test_get_validator_duties_early but kept the test using
ApiTester::new() (default mainnet spec). With FORK_NAME=gloas this
produces a phase0 chain, so post_validator_duties_ptc returns 500
with BeaconStateError(IncorrectStateVariant).
Two issues fixed:
1. Switch the test wrapper to ApiTester::new_with_hard_forks() so the
chain is actually at Gloas under FORK_NAME=gloas. This is the same
pattern already used by get_validator_duties_ptc and
get_validator_payload_attestation_data.
2. Compute dependent_root using
ChainSpec::proposer_shuffling_decision_slot rather than the
hardcoded "(current_epoch - 1).end_slot()" formula. Post-Fulu the
proposer shuffling decision slot moved to the end of epoch N - 2,
so the cache is now keyed by that root. The old formula matched
the legacy cache key and silently passed on phase0 chains.
Verified locally with FORK_NAME=gloas (195/195) and FORK_NAME=fulu
(195/195).
Two tests fail under FORK_NAME=gloas; only the first surfaces in CI
because nextest aborts on the first failure.
1. status_tests::node_health_el_online_and_not_synced
The test simulates "EL online but not synced" via
mock_el.server.all_payloads_syncing(true), expecting the head to
become optimistic so the endpoint returns 206. In Gloas, blocks
don't carry execution payloads — the payload arrives via an
envelope, so newPayload is never called during block import and
the head is never marked optimistic. The endpoint correctly
returns 200. Skip the test for Gloas, matching the existing
pattern on el_error_on_new_payload.
2. tests::get_validator_payload_attestation_data
Two issues stacked:
- The test used ApiTester::new() (default phase0 spec) so the
chain wasn't actually at the Gloas fork even with
FORK_NAME=gloas. Switch to new_with_hard_forks(), which uses
test_spec() and respects FORK_NAME.
- produce_payload_attestation_data requires
head.slot == request_slot, but the harness leaves the slot
clock at head_slot + 1 with no block produced for that slot.
Rewind the slot clock to the head slot in the test helper.
Full Gloas http-api suite: 193 tests run: 193 passed.
For gloas `attestation.data.index` should be set to 1 if we are attesting to a block whose slot is not the attestation duty slot and slot payload_status is `FULL`
Co-Authored-By: Eitan Seri- Levi <eserilev@gmail.com>
Co-Authored-By: Eitan Seri-Levi <eserilev@ucsc.edu>
Co-Authored-By: dapplion <35266934+dapplion@users.noreply.github.com>
When producing a block at the fork, treat parent payload status as full
I've been testing on kurtosis and this fixes an issue where we cant propose a block at the fork.
This is a screenshot of the fix. The envelope shows missing because we are missing an SSE event, but the envelope is in fact being imported and the chain is progressing just fine
<img width="652" height="748" alt="image" src="https://github.com/user-attachments/assets/7764a68c-33fb-4987-a691-0af71f0bea02" />
Co-Authored-By: Eitan Seri-Levi <eserilev@ucsc.edu>
Just a little naming cleanup (no semantic changes) to remove mentions of pending and full states that were still lurking.
This hopefully helps Claude forget about the concept (it defaults to naming variables `pending_state`s without this change).
Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
This reverts commit 2749e18d0e, from:
- #9092
We no longer need those changes since the abolition of pending/full states.
Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
Fix a vulnerability in the slasher whereby it would OOM upon processing an invalid attestation with an artificially high `validator_index`. This fix has already been made available to affected users on the `slasher-fix` branch.
- Prevent attestations from being passed to the slasher prior to signature verification. This was unnecessary, as they would later be passed on successful validation as well.
- Add a defensive cap on the maximum validator index processable by the slasher. The cap is high enough that it shouldn't be reached for several years, and will quickly result in warning logs if forgotten.
- Add a regression test that confirms that the issue is fixed.
Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
N/A
Adds lints for rust 1.95. Mostly cosmetic.
1. .zip(a.into_iter()) -> .zip(a) . Also a few more places where into_iter is not required
2. replace sort_by with sort_by_key
3. move if statements inside match block.
4. use checked_div instead of if statements. I think this is debatable in terms of being better, happy to remove it if others also feel its unnecessary
Co-Authored-By: Pawan Dhananjay <pawandhananjay@gmail.com>
Closes#8949
Implements peer penalties and REJECT/IGNORE message propagation for `SignedExecutionPayloadEnvelope` gossip handling, completing follow-up work from #8806.
Feedback on the error classification would be appreciated.
### Key Implementation Details
- Maps all 15 `EnvelopeError` variants to REJECT/IGNORE based on [Gloas p2p spec](https://github.com/ethereum/consensus-specs/blob/master/specs/gloas/p2p-interface.md#execution_payload)
- Follows `ExecutionPayloadError` handling pattern from block gossip (`penalize_peer()` method)
- Uses explicit variant matching (rather than catch-all `_`) for type safety
- Applies `LowToleranceError` penalty for protocol violations (invalid signatures, mismatches, etc.)
- Ignores without penalty for spec-defined cases (unknown block root, prior to finalization) and internal errors
Co-Authored-By: 0u-Y <yyw1000@naver.com>
Co-Authored-By: Eitan Seri-Levi <eserilev@gmail.com>
Gossip verify and cache bids and proposer preferences. This PR also ensures we subscribe to new fork topics one epoch early instead of two slots early. This is required for proposer preferences.
Co-Authored-By: Eitan Seri- Levi <eserilev@gmail.com>
- #6689
The intention is to only modify the INFO logs that's emitted regularly to reduce the verbosity. But I understand that this change will affect other display in the logs too that uses the `ExecutionBlockHash` display. So would love some feedbacks about the change.
Co-Authored-By: Tan Chee Keong <tanck@sigmaprime.io>
Co-Authored-By: Mac L <mjladson@pm.me>
#9077
Where possible replaces all instances of `validator_monitor::timestamp_now` with `chain.slot_clock.now_duration().unwrap_or_default()`.
Where chain/slot_clock is not available, instead replace it with a convenience function `slot_clock::timestamp_now`.
Remove the `validator_monitor::timestamp_now` function.
Co-Authored-By: Mac L <mjladson@pm.me>
Emit `execution_payload_gossip` on successful gossip verification of an execution payload. This is done as last step inside the verification function.
Co-Authored-By: Daniel Knopik <daniel@dknopik.de>
Implement boilerplate for new SSE events as specified in
- https://github.com/ethereum/beacon-APIs/pull/588
While that one is not merged yet, I believe the SSE events might be utilized in Dora already.
Implement the boilerplate, i.e. subscription tracking and publish queues. A PR to implement to fully implement already implementable events will follow.
Co-Authored-By: Daniel Knopik <daniel@dknopik.de>
Closes:
- https://github.com/sigp/lighthouse/issues/9002
- Commit `config.yaml` for minimal and mainnet to `consensus/types/configs`. For now we omit any auto-downloading logic, to avoid the hassles of dealing with Github rate limits etc on CI. Unfortunately these files are NOT bundled inside the spec tests.
- Fix the values of `min_builder_withdrawability_delay` for minimal and mainnet. These discrepancies aren't caught by the current spec tests, because the spec tests are missing data: https://github.com/ethereum/consensus-specs/pull/5005. Will be fixed in the next release/when we update to nightly.
- Fix the blob schedule for `minimal`, which should be empty, NOT inherited from mainnet.
- Keep `SECONDS_PER_SLOT` for now because the Kurtosis tests fail upon their complete removal. We will be able to completely remove `SECONDS_PER_SLOT` soon.
Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
`serde_yaml` is now deprecated. The API-compatible `yaml_serde` should be used instead.
Replace `serde_yaml` with `yaml_serde`. This is purely mechanical as the API is 1-to-1.
Co-Authored-By: Mac L <mjladson@pm.me>