Skip to content

[pull] develop from OffchainLabs:develop#1037

Merged
pull[bot] merged 1 commit into
All-Blockchains:developfrom
OffchainLabs:develop
May 24, 2026
Merged

[pull] develop from OffchainLabs:develop#1037
pull[bot] merged 1 commit into
All-Blockchains:developfrom
OffchainLabs:develop

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 24, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

## Summary

On a Gloas-genesis devnet (Kurtosis, glamsterdam-devnet-4), Prysm
reconstructs a genesis block whose `body_root` does **not** match
`state.latest_block_header.body_root`. Every Lodestar/Lighthouse node
returns canonical genesis root `0x2ed167c76d353b77…`; both Prysm nodes
return `0xfef8248511dc8b91…` (orphaned). All clients agree on the state
root (`0xf29bc0bb3aff0efa…`), so the divergence is purely in Prysm's
locally-constructed `BeaconBlockBodyGloas`, not in the loaded SSZ state.

The validator client surfaces the inconsistency at slot 1 with the BN's
own state:

```
ERROR rpc/validator: Finished building block error=… could not process block header:
parent root 0xfef8248511… does not match the latest block header signing root in
state 0x2ed167c7…
```

Diffing the JSON of the genesis block body returned by Lighthouse vs
Prysm reveals exactly two fields differ, both inside
`signed_execution_payload_bid.message`:

| field | Lighthouse / Lodestar (canonical) | Prysm (orphan) |
|---|---|---|
| `parent_block_hash` | `0xab172d9e48985f0dc7789…` (==
`state.latest_block_hash`) | `0x0000…0000` |
| `execution_requests_root` | `0x85e253b40599d0df756be…` (==
`hash_tree_root(ExecutionRequests())`) | `0x0000…0000` |

Both of those values appear verbatim in
`state.latest_execution_payload_bid` (verified against the genesis SSZ
from `eth-beacon-genesis`). The genesis distribution tool commits to
`body.signed_execution_payload_bid.message ==
state.latest_execution_payload_bid`; Prysm's `gloasGenesisBlock` was
using zero defaults instead.

This PR threads `state.LatestExecutionPayloadBid` into
`gloasGenesisBlock` so the reconstructed body matches what the state
header committed to. Also initializes `parent_execution_requests` to a
non-nil empty `ExecutionRequests`, since the proto field was added but
never populated here — `BeaconBlockBodyGloas.HashTreeRoot()`
dereferences `ParentExecutionRequests` unconditionally (`gloas.ssz.go`).

## Test plan

- [x] `go build ./...`
- [x] `go test ./beacon-chain/core/blocks/ -run TestGenesis`
- [ ] Verify on a Gloas Kurtosis devnet that:
- All Prysm nodes return the same genesis `block_root` as
Lighthouse/Lodestar/Teku.
- Validator proposes successfully at slot 1 (no "parent root … does not
match" error).
- [ ] Walk a fresh chain from genesis through the Gloas fork epoch
(non-Gloas-genesis path) to confirm no regression for `upgrade_to_gloas`
flows.
@pull pull Bot locked and limited conversation to collaborators May 24, 2026
@pull pull Bot added the ⤵️ pull label May 24, 2026
@pull pull Bot merged commit 6fc8ac5 into All-Blockchains:develop May 24, 2026
0 of 8 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant