feat: glamsterdam-devnet-7 - #9587
Conversation
There was a problem hiding this comment.
Code Review
This pull request upgrades the @chainsafe/ssz and @chainsafe/persistent-merkle-tree dependencies to integrate EIP-7688 progressive containers and lists for the Gloas fork. It refactors various SSZ types, state transition operations, and light-client components to use these progressive types and their corresponding generalized indices. Additionally, it enhances the robustness of range sync and payload envelope processing during periods of poor chain liveness by preventing deadlocks on empty epochs and deduplicating in-flight imports. As there are no review comments, I have no feedback to provide.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Performance Report✔️ no performance regression detected Full benchmark results
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## unstable #9587 +/- ##
============================================
+ Coverage 52.50% 52.54% +0.03%
============================================
Files 848 848
Lines 60531 60472 -59
Branches 4476 4473 -3
============================================
- Hits 31781 31772 -9
+ Misses 28688 28638 -50
Partials 62 62 🚀 New features to boost your workflow:
|
22af939 to
e6f0368
Compare
Squashed eip7688 implementation from the eip-7688 branch (#9390): progressive containers/lists for Gloas, @chainsafe/ssz ^1.6.1, light-client gindices, apply_parent_execution_payload length asserts, MAX_SIGNED_BEACON_BLOCK_SIZE synced to alpha.12 (4027336/1938012), and block-gossip count REJECTs.
e6f0368 to
451c93b
Compare
see ethereum/consensus-specs#5439 Builder deposit requests are ignored unless the withdrawal credentials start with `BUILDER_WITHDRAWAL_PREFIX`. Accepted new builders are registered with `PAYLOAD_BUILDER_VERSION`. Checks: - `pnpm exec biome check packages/state-transition/src/block/processBuilderDepositRequest.ts packages/state-transition/test/unit/block/processBuilderDepositRequest.test.ts packages/state-transition/test/unit/block/processBuilderExitRequest.test.ts` - `pnpm --filter @lodestar/state-transition check-types` > This PR was written primarily by Codex.
) Port of #9401 (stateless `publishExecutionPayloadEnvelope`) onto `glamsterdam-devnet-5` instead of `unstable`. Same 7 commits, cherry-picked clean. - Accepts both `SignedExecutionPayloadEnvelopeContents` (envelope + blobs + KZG proofs, stateless) and bare `SignedExecutionPayloadEnvelope` (stateful), discriminated by JSON key / first SSZ offset. - KZG-verifies supplied blobs and proofs against bid `kzg_commitments`; rejects partial wrapper inputs. - Endpoint paths already pluralized on gd5 base per beacon-APIs #613 (`execution_payload_envelopes`, `execution_payload_bids`). Path, request shape, headers, query, and body codec match #580's `envelope_post.yaml`. Known gaps left as-is (pre-existing TODOs referencing #580): - `broadcast_validation` not yet honored (always gossip-level). - No `202` response branch (success always `200`). - [ ] `pnpm check-types` - [ ] `pnpm test:unit` (api + beacon-node envelope publish tests) - [ ] Devnet smoke test of envelope publish (stateless + stateful) Branch creation, cherry-pick, and this PR description were AI-assisted (Claude Code). --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # packages/beacon-node/test/unit/network/gossip/topic.test.ts
All lodestar nodes on glamsterdam-devnet-7 were permanently stuck at the last pre-gloas slot: importing any gloas block threw "RangeError: Maximum call stack size exceeded" from getNodesAtProgressiveDepth, which spread >125k subtree nodes as function arguments when iterating the 503,600-entry validator registry (EIP-7688 makes BeaconState.validators a ProgressiveList at gloas). ssz 1.6.2 replaces the spread with an index loop. Verified locally: forEachValue over 503,600 validators completes in ~13ms. Fixes #9656 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
**Motivation** Port of an outstanding fix from the `glamsterdam-devnet-7` branch (#9587) that never landed on `unstable`. #9050 added the `ExecutionPayloadEnvelopesByRange` req/resp method with a `byPeer` quota of `MAX_REQUEST_BLOCKS_DENEB` (128), while the spec caps envelope range requests at `MAX_REQUEST_PAYLOADS` per https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.12/specs/gloas/p2p-interface.md#executionpayloadenvelopesbyrange-v1. The `getRequestCount` side already uses `MAX_REQUEST_PAYLOADS`; the `byPeer` quota was left inconsistent. **Description** - Use `config.MAX_REQUEST_PAYLOADS` for the `ExecutionPayloadEnvelopesByRange` `byPeer` quota - Add a unit test asserting the quota matches `MAX_REQUEST_PAYLOADS` Cherry-picked from `glamsterdam-devnet-7` (88b8052, original author @nflaig); applied without conflicts. **AI Assistance Disclosure** - [x] I have read the [contributor guidelines](https://github.com/ChainSafe/lodestar/blob/unstable/CONTRIBUTING.md#ai-assistance-notice) and disclosed my usage of AI below. Cherry-pick selection and verification done with AI assistance (Claude Code); original commit authored by @nflaig on the devnet-7 branch. 🤖 Generated with [Claude Code](https://claude.com/claude-code)

No description provided.