Skip to main content
Breaking Schema ChangesEthereum’s Glamsterdam upgrade introduces EIP-7732: Enshrined Proposer-Builder Separation (ePBS), which fundamentally changes how beacon blocks are structured.Action Required: Queries using the execution_payload, blob_kzg_commitments, or execution_requests fields in beacon.raw.blocks and beacon_hoodi.raw.blocks will return NULL values for all slots after the Glamsterdam activation.
Timeline update (October 24, 2026): Glamsterdam is delayed. The Hoodi testnet activation originally scheduled for October 26, 2026 has been postponed while Ethereum core developers review how the proposed gas-accounting changes (EIP-8037) interact with existing smart contracts. No replacement date has been announced. The schema changes described on this page will take effect later than previously expected. Nothing changes in your data or queries today. We are monitoring the situation and will update this page as the timeline firms up. See the Ethereum Foundation announcement for details.

Devnet Progress Updates

We track the state of the Glamsterdam devnet here on each check-in, most recent first, so you can see what changed between updates rather than just the current status. Source: Forkcast — Glamsterdam.
Hoodi activation postponed. The October 26, 2026 Hoodi activation was removed from the schedule on October 22, along with the Amsterdam (execution layer) and Gloas (consensus layer) activations on Hoodi. Core developers are assessing the interaction between the new gas-accounting rules and already-deployed contracts before setting a new date. No replacement Hoodi or mainnet date has been announced.What this means for Allium. The beacon_hoodi and beacon schema changes below are deferred until the fork is rescheduled. Existing columns continue to be populated as they are today, and the Gloas tables remain not yet live. We will confirm the new Allium rollout timing once a Hoodi date is set, and will continue to give at least four weeks of notice on beacon_hoodi before mainnet. Source: Ethereum Foundation blog — Glamsterdam Hoodi delay.
Allium schema: new block fields are columns on raw.blocks. The three new Gloas block-body fields (signed_execution_payload_bid, payload_attestations, parent_execution_requests) are stored as columns on raw.blocks, alongside the other body fields such as attestations and deposits. There will be no separately ingested tables for data that comes from the beacon block.
  • raw.execution_payload_bids and raw.payload_attestations keep their names but are now views over those raw.blocks columns, like raw.attestations and raw.deposits.
  • raw.execution_requests is a view: pre-Gloas rows come from raw.blocks.execution_requests, Gloas rows from raw.execution_payload_envelopes.
  • Only data that does not come from the beacon block is ingested into its own table: raw.execution_payload_envelopes (a separate Beacon API endpoint, and can be missing) and raw.builders (beacon state, once per epoch).
  • builder_snapshot is renamed raw.builders: one row per builder per epoch, with balance in ETH and raw_balance in Gwei, as in raw.balances.
  • raw.block_rewards gets no new columns. Builder payments are in raw.execution_payload_bids (value, execution_payment).
  • raw.blocks.eth1_*, transaction_count, withdrawal_count and withdrawals stay populated after the fork, read from the revealed execution payload. raw.blocks.blob_kzg_commitments is NULL after the fork: the commitments move into the bid (raw.execution_payload_bids), where they are promised rather than guaranteed published.
Allium schema. The Gloas tables below (execution_payload_bids, payload_attestations, execution_requests, builder_snapshot, execution_payload_envelopes) are built and validated. They are not yet live on beacon_hoodi or beacon mainnet; schemas may change until the Hoodi cutover.Devnet timeline (Forkcast). Forkcast lists Glamsterdam as Upcoming for 2026 with no public-testnet (Hoodi/Sepolia) or mainnet activation date set yet. The Gloas fork has so far run only on short-lived devnets:Source: Forkcast — Glamsterdam, checked October 6, 2026.
Glamsterdam remains in Devnet. No change to the schema plan below — actively monitoring and will implement schema changes once ePBS is live on Hoodi testnet.

What Is Changing

The Glamsterdam upgrade restructures how beacon blocks are produced by enshrining the proposer-builder separation protocol directly into the consensus layer.

Key Change: Block Body Structure

Before Glamsterdam, a beacon block body contains the full execution payload with transaction data:
After Glamsterdam, the proposer commits only a bid from the builder — the execution payload is revealed separately:
The execution_payload and blob_kzg_commitments fields are absent from the block body for all slots after the fork — blob_kzg_commitments moves into the bid itself rather than the revealed payload. execution_requests is also gone from its old position, though the body retains a parent_execution_requests field (the previous slot’s requests, kept for verification) — it isn’t a clean removal.
builder_index is an index into a new, separate builder registry (beacon.raw.builders), not a validator index. Builders register and exit independently of the validator set via BuilderDepositRequest / BuilderExitRequest, and hold their own balance, deposit_epoch, and withdrawable_epoch. Do not join builder_index against beacon.raw.validators.
Why This MattersePBS separates the roles of block proposers and block builders at the protocol level. Proposers commit to a builder’s bid without seeing the full payload contents, which is then attested by a Payload Timeliness Committee (PTC). This reduces MEV centralization risks and improves censorship resistance.

Impact to Allium Tables

beacon.raw.blocks — Breaking Changes

The following columns change for all slots after Glamsterdam activation:
When a builder does not reveal its payload, the slot still has a beacon block but no execution payload: eth1_* and withdrawals are NULL and transaction_count and withdrawal_count are 0 for that slot.
execution_requests isn’t a clean removal: the block body retains a parent_execution_requests field carrying the previous slot’s requests for verification. The current-slot requests move to the ExecutionPayloadEnvelope, gossiped separately by the builder — see beacon.raw.execution_payload_envelopes and beacon.raw.execution_requests. The ExecutionRequests schema also grows two new request types in Gloas, builder_deposits and builder_exits, alongside the existing deposits/withdrawals/consolidations.
blob_kzg_commitments moves into the builder’s bid, where it is a commitment, not proof that the blobs were published: the builder may never reveal the payload, the PTC may vote the blob data unavailable, or the next block may not build on it. Before Gloas, a block was only valid if its blobs were available, so raw.blocks.blob_kzg_commitments meant “blobs that landed”. To keep that meaning, the column is NULL after the fork rather than filled from the bid. The bid’s commitments are in beacon.raw.execution_payload_bids.blob_kzg_commitments; to count blobs that landed, join to beacon.raw.payload_attestations or beacon.raw.execution_payload_envelopes.
Migration Path: eth1_*, transaction_count, withdrawal_count and withdrawals stay populated, so no query changes are needed for those columns. Read blob commitments from beacon.raw.execution_payload_bids instead of raw.blocks. For builder and bid information (builder identity, bid value, gas limit), use beacon.raw.execution_payload_bids, a view over the new signed_execution_payload_bid column.

beacon.raw.block_rewards — No Changes

block_rewards comes from the Beacon API rewards endpoint, which has no Gloas fields, and gets no new columns. total remains the proposer’s consensus-layer reward. The builder’s payment to the proposer is in beacon.raw.execution_payload_bids: value (paid through the beacon chain) and execution_payment (paid at the execution layer). At most one of the two is non-zero; both are 0 when the proposer built the payload itself (builder_index 18446744073709551615). Join on slot_number.

beacon.validator.consensus_income — No Changes

This view aggregates consensus-layer rewards only (attestations, sync committee, block proposals). No structural changes are expected.

New Tables and Views

Tables built from fields of the beacon block are views over raw.blocks, like raw.attestations and raw.deposits. Only data from other Beacon API endpoints is ingested into its own table.

beacon.raw.execution_payload_bids

Provides one row per Gloas block with the builder’s committed bid from the beacon block body. A view over raw.blocks.signed_execution_payload_bid. Use this table for builder information and builder payments for post-Glamsterdam slots. Unique Key: slot_number
This table covers the bid only — block hash, builder, and committed values. Transactions, withdrawals, gas usage and state/receipts roots are only available once the builder reveals the SignedExecutionPayloadEnvelope; use beacon.raw.execution_payload_envelopes for those.

beacon.raw.payload_attestations

Provides one row per Payload Timeliness Committee (PTC) attestation included in a block, recording whether the builder revealed the execution payload on time. A view over raw.blocks.payload_attestations. Unique Key: (slot_number, array_index) — a block can carry several payload attestations.

beacon.raw.builders

Provides a per-epoch snapshot of each registered builder, tracking the builder lifecycle introduced in Gloas. Builders register and exit independently of the validator set via BuilderDepositRequest / BuilderExitRequest, and hold their own balance separate from any validator. To get the latest state of a builder, take the row with the highest slot_number for its builder_index. Unique Key: (slot_number, builder_index)

beacon.raw.execution_payload_envelopes

Provides one row per slot containing the ExecutionPayloadEnvelope the builder reveals after the block. This is the replacement source for post-fork execution payload data (transactions, withdrawals, gas usage, roots, and block_access_list from EIP-7928). A slot whose builder never revealed its payload has no row. Unique Key: slot_number

beacon.raw.execution_requests

Provides one row per slot with the execution requests as separate columns, including the two new Gloas request types. A view: pre-Gloas (Electra and later) rows come from raw.blocks.execution_requests, Gloas rows from raw.execution_payload_envelopes. Unique Key: slot_number

Migration Timeline

Additive-First StrategyAllium follows an additive-first migration approach: New columns and tables appear before old columns are deprecated. Deprecated fields return NULL for post-fork slots — columns are not dropped. All changes are live on beacon_hoodi testnet ≥4 weeks before mainnet. Historical data (pre-fork slots) remains unchanged.

Action Items

Deadlines are keyed to devnet/testnet/mainnet milestones rather than fixed calendar dates — see Devnet Progress Updates for the current schedule, since Glamsterdam has slipped past its original April/May 2026 estimates.

Additional Notes

EIP-7928 (Block-level Access Lists)

EIP-7928 is included in the Glamsterdam upgrade. The Gloas ExecutionPayload container itself gains a block_access_list field (plus a slot_number field), so this is not purely an execution-layer-internal change — it is available inside the payload column of beacon.raw.execution_payload_envelopes.

Reference Documentation

Support

If you have questions about migrating your queries or need assistance testing against Hoodi testnet data, please contact the Allium support team.
Last checked: October 15, 2026 — see Devnet Progress Updates for change history.