Commit Graph

930 Commits

Author SHA1 Message Date
Michael Sproul
bc6cf0f882 Remove payload attestation queueing and more cleanups 2026-04-01 11:17:33 +11:00
Michael Sproul
1ee2ce4258 Fix schema migrations 2026-04-01 10:38:03 +11:00
dapplion
993cecee83 Clear best_child/best_descendant during V28->V29 conversion 2026-03-31 15:22:31 -05:00
Eitan Seri-Levi
e1cabb8d67 Merge branch 'unstable' into gloas-walk-always 2026-04-01 02:24:42 +09:00
Michael Sproul
cd60ea80bb Update to spec v1.7.0-alpha.4 (#9046)
Update our consensus code to v1.7.0-alpha.4


Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
2026-03-31 10:42:51 -05:00
Michael Sproul
a1534bbfb3 Check ChainSpec consistency with upstream config.yaml (#9008)
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>
2026-03-31 10:42:51 -05:00
Daniel Knopik
37a948cf32 Never use MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS for networks that started with Fulu enabled (#8731)
Lighthouse uses `MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS` for blob **and column retention** instead of `MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS` if Fulu activated less than `MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS` epochs ago - also if Fulu activated at genesis. This causes unexpected behaviour, as there are no blob sidecars to be stored or requested in such networks.


  ~~Add a special case to avoid that logic in post-Fulu genesis networks (`fulu_fork_epoch == 0`)~~

If the blob retention period would start in the fulu fork epoch, use the `min_epochs_for_data_column_sidecars_requests`, as there are no blobs to retain in Fulu.


Co-Authored-By: Daniel Knopik <daniel@dknopik.de>
2026-03-31 11:54:10 +00:00
Michael Sproul
d92efc1e0f Update to spec v1.7.0-alpha.4 (#9046)
Update our consensus code to v1.7.0-alpha.4


Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
2026-03-31 05:59:36 +00:00
dapplion
5353710e0a Fix compilation, clear best_child/best_descendant in migration
- Fix leaf detection in heads_descended_from_finalization (parent()
  method call, map away enumerate index)
- Clear best_child and best_descendant in v28->v29 migration (no
  longer used, replaced by virtual tree walk)
- Migration now rewrites fork choice data instead of being a no-op
2026-03-31 00:51:19 -05:00
Michael Sproul
b6728c2030 Start removing more best_child/best_descend 2026-03-31 16:02:19 +11:00
Michael Sproul
517d16f2fd Revert parent->child optimisation 2026-03-31 15:47:50 +11:00
Michael Sproul
991dc92d8f Check ChainSpec consistency with upstream config.yaml (#9008)
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>
2026-03-30 06:43:57 +00:00
Michael Sproul
4c3fd70dbf Merge remote-tracking branch 'origin/unstable' into gloas-walk-always 2026-03-30 16:10:35 +11:00
Mac L
a5e748f808 Use yaml_serde in place of deprecated serde_yaml (#9040)
`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>
2026-03-29 18:39:20 +00:00
Michael Sproul
e1a2cfe202 Merge remote-tracking branch 'origin/stable' into unstable 2026-03-26 16:51:14 +11:00
Michael Sproul
12f5ab04f3 Load the state corresponding to head payload status yay 2026-03-26 16:03:55 +11:00
dapplion
c7670ede02 Cleanup and spec parity fixes
- Add missing payload attestation slot check: spec returns early when
  data.slot != block.slot (PTC votes only for assigned block)
- Remove dead ignored tests (need mock EL Gloas support to run)
- Remove unused new_with_gloas and inspect_queued_payload_attestations
- Remove gloas entries from bin.rs (not part of this PR)
- Collapse nested if in payload attestation error handling (clippy)
- Rename env -> envelope in load_parent
- Add TODO(gloas) for parent_head_hash in re-org path
- Remove head_payload_status from ForkchoiceUpdateParameters (lives on
  CachedHead, sourced from get_head return)
2026-03-25 23:07:45 -05:00
dapplion
e676c33c92 Merge sigp/unstable into gloas-walk-always 2026-03-25 22:02:08 -05:00
dapplion
93f987f3cf Remove head_payload_status from ForkchoiceUpdateParameters
head_payload_status is internal fork choice state, not an EL
forkchoiceUpdated parameter. It already lives on CachedHead — source
it directly from get_head() return in recompute_head_at_slot instead
of threading through ForkchoiceUpdateParameters.

Also add TODO(gloas) for parent_head_hash in re-org path (V29 nodes
don't carry execution_status).
2026-03-25 21:16:06 -05:00
Michael Sproul
bd34bb1430 Remove schema migrations for v28 and earlier (#9031)
With LH v8.1.3 supporting Fulu-on-Gnosis, we no longer need these DB migrations. All Lighthouse nodes running in prod will soon be updated to LH v8.0.0+ and schema v28+.

This PR helps with Gloas fork choice changes, by allowing us to avoid updating old schema migrations when adding V29 for Gloas:

- https://github.com/sigp/lighthouse/pull/9025


  


Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
2026-03-26 02:10:34 +00:00
dapplion
bc28e63585 Revert "Fix arithmetic lint in committee_cache (saturating_sub)"
This reverts commit bb3e9e12d2.
2026-03-25 20:42:18 -05:00
dapplion
bb3e9e12d2 Fix arithmetic lint in committee_cache (saturating_sub) 2026-03-25 20:38:15 -05:00
dapplion
a34b7c99dc Fix CI: collapse nested if, ignore payload attestation test
- Collapse nested if in build_children_index (clippy::collapsible_if)
- Ignore payload_attestation_for_previous_slot_is_accepted_at_next_slot
  — test uses pre-Gloas blocks (V17) but on_payload_attestation requires
  V29 nodes. Needs mock EL Gloas block support.
2026-03-25 20:33:17 -05:00
dapplion
f31a93697e Fix test review issues
- Remove wrong latest_message assertions from payload attestation test
  (on_payload_attestation writes to PTC bitfields, not vote tracker)
- Fix corrupted comment: "votes.gloas_enabled() to the genesis block"
  → "votes to the genesis block"
- Fix http_api test fallback string: "n/a" → "irrelevant" to match
  production code
- Add issue link to #[ignore] test
- Add comment explaining head_payload_status as u8 cast
2026-03-25 20:08:43 -05:00
dapplion
e7f027badd O(n) children index, fix load_parent for gloas blocks
- Build parent->children index once per find_head call, replacing O(n)
  scans in filter_block_tree and get_node_children with O(1) lookups.
- Skip zero block_hash in is_parent_block_full check — default/zero
  hashes don't indicate a real payload relationship.
- Fall back to block state_root for genesis when envelope not stored.
- Store execution payload envelope in EF test harness during
  on_execution_payload step.
2026-03-25 19:38:54 -05:00
Michael Sproul
d58df3a656 Make proposer_index mandatory in on_block 2026-03-26 11:07:38 +11:00
Michael Sproul
f1b261f336 Safeguard attestation index check 2026-03-26 11:00:08 +11:00
Michael Sproul
a69a848590 Remove expect 2026-03-26 10:48:18 +11:00
Michael Sproul
9f1f68c3ee Add back AttestationFromBlock 2026-03-26 10:39:57 +11:00
Michael Sproul
c7c82f83d4 Merge remote-tracking branch 'origin/gloas-walk-always' into gloas-walk-always 2026-03-26 10:26:55 +11:00
dapplion
84679b1c07 Remove redundant invalid-node check from filter_block_tree
The children filter already skips invalid nodes, so a valid parent
whose only children are invalid becomes a leaf and gets rejected by
node_is_viable_for_head. The top-level check was redundant.
2026-03-25 18:22:51 -05:00
Michael Sproul
2323b86ffa Merge remote-tracking branch 'origin/unstable' into gloas-walk-always 2026-03-26 10:07:46 +11:00
Michael Sproul
66f71b3f22 Remove unused params 2026-03-26 10:01:33 +11:00
dapplion
324c61d2e2 Implement get_filtered_block_tree and fix remaining test failures
- Add get_filtered_block_tree/filter_block_tree matching the spec's
  recursive viability pre-filter for get_head
- Skip invalid execution status nodes in the filter (they aren't in
  store.blocks in the spec)
- Fix attestation_score for V17 nodes: fall back to weight() for
  Empty/Full since pre-Gloas has no payload separation
- Include head_payload_status in ForkChoiceView so CachedHead updates
  when payload status changes
- Update votes test: branch with incompatible finalized leaf is now
  correctly excluded by the recursive filter
- Update execution_status test_03: stored weights no longer include
  proposer boost

All 30 proto_array/fork_choice tests pass.
All 9 EF fork_choice test suites pass.
2026-03-25 17:47:49 -05:00
dapplion
93ef1e395c Include head_payload_status in ForkChoiceView comparison
The early exit check in recompute_head_at_slot compared only
head_block_root and checkpoints. When on_execution_payload changed
the payload status from Empty to Full without changing the head root,
the CachedHead was not updated. Add head_payload_status to
ForkChoiceView so the change is detected.
2026-03-25 17:47:49 -05:00
dapplion
e943888ee7 Fix test_03: update weight assertions for spec-parity boost
Proposer boost is no longer baked into node.weight() — it is applied
on-the-fly in the walk's get_weight via is_supporting_vote. Update
the expected weights in test_03 to reflect pure attestation scores.
2026-03-25 17:47:49 -05:00
dapplion
9f56fd0751 Review fixes: cache should_apply_proposer_boost, improve error context
- Compute should_apply_proposer_boost once before the walk instead of
  per-child per-level
- Clear previous_proposer_boost in apply_score_changes
- Use correct node root in get_ancestor_node error messages
- Add comment explaining is_supporting_vote slot comparison behavior
2026-03-25 17:47:49 -05:00
dapplion
845831ce56 Align GLOAS fork choice with spec
- Move proposer boost from apply_score_changes to get_weight, matching
  the spec's structure where get_weight adds boost via is_supporting_vote
- Implement is_supporting_vote and get_ancestor_node spec functions
- Fix should_extend_payload: return true when proposer_boost_root is zero
- Compute record_block_timeliness from time_into_slot instead of hardcoding false
- Fix anchor block_timeliness to [true, true] per get_forkchoice_store spec
- Add equivocating_attestation_score for is_head_weak monotonicity
- Use payload-aware weight in is_parent_strong
- Add with_status helper on IndexedForkChoiceNode
- Simplify find_head_walk to return IndexedForkChoiceNode directly
2026-03-25 17:47:49 -05:00
Eitan Seri-Levi
c7055b604f Gloas serve envelope rpc (#8896)
Serves envelope by range and by root requests. Added PayloadEnvelopeStreamer so that we dont need to alter upstream code when we introduce blinded payload envelopes.


  


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>
2026-03-25 06:45:24 +00:00
Michael Sproul
cec5ce179d Undo botched optimisation 2026-03-25 14:12:46 +11:00
Michael Sproul
8b448864f0 Re-do head_payload_status 2026-03-25 14:05:11 +11:00
Michael Sproul
c841603003 Fix compilation issues 2026-03-25 13:43:30 +11:00
Michael Sproul
81b96a59d2 More spec compliance 2026-03-25 13:03:34 +11:00
Michael Sproul
52e397f8c1 Refactoring fork choice to look more like the spec 2026-03-24 15:58:54 +11:00
Lion - dapplion
91c25794fe Schedule Fulu fork for Gnosis mainnet (#9007)
Co-Authored-By: dapplion <35266934+dapplion@users.noreply.github.com>

Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
2026-03-24 03:50:14 +00:00
Michael Sproul
c451ae763c Use BTreeMap for state.validators pending updates (#9017)
Closes:

- https://github.com/sigp/lighthouse/issues/9003


  Milhouse `List`s use a map in front of the binary tree to cache updates. Ever since we adopted Milhouse, we've been using `VecMap`, which is essentially `Vec<Option<T>>`. Turns out, when you've got 2M indices and only 2 non-`None` entries (changes), this is inefficient.

Milhouse is generic in the choice of map (`U: UpdateMap`) and has always supported `BTreeMap`, so this PR switches us over to `BTreeMap`. In previous benchmarks (years ago) it had been slower than `VecMap`, but now it is vastly superior.


Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
2026-03-24 01:43:19 +00:00
hopinheimer
ce714710e9 passing ef tests ft. @dapplion 2026-03-23 14:40:41 -04:00
hopinheimer
cb35ba6869 Merge branch 'unstable' of github.com:sigp/lighthouse into fix-gloas-ef-tests 2026-03-23 14:40:04 -04:00
hopinheimer
cc8466dfa5 fixing recursive calls with caching 2026-03-20 16:10:43 -04:00
Michael Sproul
06025228ae Gloas cold DB (#8991)
Closes:

- https://github.com/sigp/lighthouse/issues/8958


  - Update the `HotColdStore` to handle storage of cold states.
- Update `BeaconSnapshot` to hold the execution envelope. This is required to make `chain_dump`-related checks sane, and will be generally useful (see: https://github.com/sigp/lighthouse/issues/8956).
- Bug fix in the `BlockReplayer` for the case where the starting state is already `Full` (we should not try to apply another payload). This happens on the cold DB path because we try to replay from the closest cached state (which is often full).
- Update `test_gloas_hot_state_hierarchy` to cover the cold DB migration.


Co-Authored-By: Michael Sproul <michael@sigmaprime.io>

Co-Authored-By: Michael Sproul <michaelsproul@users.noreply.github.com>
2026-03-19 09:09:13 +00:00