> ## Documentation Index
> Fetch the complete documentation index at: https://docs.allium.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Schema Changes: Glamsterdam ePBS Upgrade

> Breaking schema changes to beacon.raw.blocks and beacon_hoodi.raw.blocks due to EIP-7732 (Enshrined Proposer-Builder Separation)

<Warning>
  **Breaking Schema Changes**

  Ethereum's **Glamsterdam** upgrade (estimated May–June 2026) introduces **EIP-7732: Enshrined Proposer-Builder Separation (ePBS)**, which fundamentally changes how beacon blocks are structured.

  **Action Required**: Queries using `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**: Changes will be available on `beacon_hoodi` testnet in early April 2026, approximately 4+ weeks before mainnet activation.
</Warning>

## 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:

```json theme={null}
{
  "body": {
    "execution_payload": {
      "block_hash": "0xabc...",
      "block_number": "21000000",
      "timestamp": "1700000000",
      "fee_recipient": "0xdef...",
      "transactions": [...],
      "withdrawals": [...]
    },
    "blob_kzg_commitments": [...],
    "execution_requests": {...}
  }
}
```

**After Glamsterdam**, the proposer commits only a *bid* from the builder — the execution payload is revealed separately:

```json theme={null}
{
  "body": {
    "signed_execution_payload_bid": {
      "message": {
        "slot": "...",
        "block_hash": "0xabc...",
        "parent_hash": "0x...",
        "builder_index": "12345",
        "fee_recipient": "0xdef...",
        "gas_limit": "30000000",
        "value": "1500000000"
      },
      "signature": "0x..."
    },
    "payload_attestations": [
      {
        "aggregation_bits": "0x...",
        "data": {
          "beacon_block_root": "0x...",
          "slot": "...",
          "payload_present": true
        },
        "signature": "0x..."
      }
    ]
  }
}
```

The `execution_payload`, `blob_kzg_commitments`, and `execution_requests` fields are **absent from the block body** for all slots after the fork.

<Info>
  **Why This Matters**

  ePBS 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.
</Info>

## Impact to Allium Tables

### `beacon.raw.blocks` — Breaking Changes

The following columns will be affected for all slots after Glamsterdam activation:

| Column                         | Current Behavior            | Post-Glamsterdam Behavior        |
| ------------------------------ | --------------------------- | -------------------------------- |
| `execution_payload`            | Always present (object)     | **NULL** or missing              |
| `eth1_block_hash`              | Execution block hash        | **NULL**                         |
| `eth1_block_number`            | Execution block number      | **NULL**                         |
| `eth1_block_timestamp`         | Execution block timestamp   | **NULL**                         |
| `transaction_count`            | Integer ≥ 0                 | **0** (no payload in block body) |
| `withdrawal_count`             | Integer ≥ 0                 | **0** (no payload in block body) |
| `withdrawals`                  | Array of withdrawal objects | **NULL**                         |
| `blob_kzg_commitments`         | Array (if blobs present)    | **NULL**                         |
| `execution_requests`           | Object (post-Pectra)        | **NULL**                         |
| `signed_execution_payload_bid` | Does not exist              | **NEW** — builder's signed bid   |
| `payload_attestations`         | Does not exist              | **NEW** — PTC attestation array  |

**Migration Path**: Use the new `beacon.raw.execution_payload_bids` table (see below) to look up execution block hashes and builder information for post-fork slots.

### `beacon.raw.block_rewards` — Additive Changes

New columns will be added to provide explicit builder payment tracking:

| Column               | Current Behavior          | Post-Glamsterdam Behavior                           |
| -------------------- | ------------------------- | --------------------------------------------------- |
| `total`              | Consensus proposer reward | **Unchanged**                                       |
| `attestations`       | Component breakdown       | **Unchanged**                                       |
| `sync_aggregate`     | Component breakdown       | **Unchanged**                                       |
| `proposer_slashings` | Component breakdown       | **Unchanged**                                       |
| `attester_slashings` | Component breakdown       | **Unchanged**                                       |
| `builder_index`      | Does not exist            | **NEW** — validator index of winning builder        |
| `builder_payment`    | Does not exist            | **NEW** — explicit Gwei paid by builder to proposer |

**No Breaking Changes**: All existing columns remain available. The new `builder_payment` field provides explicit execution reward attribution, replacing the current fee-recipient inference method for post-fork slots.

### `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

### `beacon.raw.execution_payload_bids`

Provides one row per slot containing the builder's committed bid from the beacon block body.

**Use this table** to look up execution block hashes and builder information for post-Glamsterdam slots.

**Unique Key**: `slot_number`

| Column           | Type      | Description                                     |
| ---------------- | --------- | ----------------------------------------------- |
| `slot_number`    | bigint    | Beacon slot number                              |
| `slot_timestamp` | timestamp | Slot timestamp                                  |
| `proposer_index` | bigint    | Validator index of the proposer                 |
| `builder_index`  | bigint    | Validator index of the winning builder          |
| `value`          | numeric   | Bid value in Gwei (builder payment to proposer) |
| `parent_hash`    | varchar   | Parent execution block hash                     |
| `block_hash`     | varchar   | Committed execution block hash                  |
| `gas_limit`      | bigint    | Proposed gas limit                              |
| `fee_recipient`  | varchar   | Fee recipient address                           |

### `beacon.raw.payload_attestations`

Provides one row per Payload Timeliness Committee (PTC) attestation, recording whether the builder revealed the execution payload on time.

**Unique Key**: `slot_number`

| Column              | Type      | Description                                               |
| ------------------- | --------- | --------------------------------------------------------- |
| `slot_number`       | bigint    | Beacon slot being attested                                |
| `slot_timestamp`    | timestamp | Slot timestamp                                            |
| `payload_present`   | boolean   | Whether the PTC attested the payload was revealed on time |
| `aggregation_bits`  | varchar   | Bitfield of PTC members who signed this attestation       |
| `beacon_block_root` | varchar   | Root of the beacon block being attested                   |

## Migration Timeline

| Timeline                        | Estimated Date                             | Status                              |
| ------------------------------- | ------------------------------------------ | ----------------------------------- |
| Hoodi testnet ePBS activation   | Early April 2026                           | Awaiting node provider confirmation |
| Allium Hoodi schema update live | \~1 week after testnet activation          | Pending                             |
| Glamsterdam mainnet activation  | May–June 2026 (TBD by Ethereum Foundation) | Pending                             |
| Allium mainnet schema cutover   | Pre-emptively supported                    | Pending                             |

<Info>
  **Additive-First Strategy**

  Allium 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.
</Info>

## Action Items

| Action                                                                                                | Priority | Deadline                  |
| ----------------------------------------------------------------------------------------------------- | -------- | ------------------------- |
| Identify all queries referencing affected fields in `beacon.raw.blocks` and `beacon_hoodi.raw.blocks` | **High** | Before April 16, 2026     |
| Update queries to use `beacon.raw.execution_payload_bids` for block hash lookups                      | **High** | Before mainnet activation |
| Update execution reward reconciliation to use `builder_payment` in `beacon.raw.block_rewards`         | **High** | Before mainnet activation |
| Test updated queries against Hoodi testnet data                                                       | **High** | April 16 – May 23, 2026   |
| Optionally consume `beacon.raw.payload_attestations` to detect builder withholding events             | Low      | Post-mainnet              |

## Additional Notes

### EIP-7928 (Block-level Access Lists)

EIP-7928 is also included in the Glamsterdam upgrade but has **no impact** on beacon chain API structure or Allium tables. This EIP affects execution layer transaction processing only.

### Reference Documentation

* [Ethereum Consensus Specs - Gloas (Glamsterdam)](https://github.com/ethereum/consensus-specs/blob/master/specs/gloas/beacon-chain.md)
* [EIP-7732: Enshrined Proposer-Builder Separation](https://eips.ethereum.org/EIPS/eip-7732)

### Support

If you have questions about migrating your queries or need assistance testing against Hoodi testnet data, please contact the Allium support team.

***

*Last updated: March 27, 2026*
