> **Can't find what you're looking for?** Use `search_docs` on the docs MCP server at `https://docs.ampdb.io/api/mcp` to find what you need.

# Ethereum Beacon Tables

Every Ethereum Beacon [raw dataset](/datasets/raw-datasets) (`"kind": "eth-beacon"`) has these tables: [`blocks`](/datasets/tables/eth-beacon#blocks), [`attestations`](/datasets/tables/eth-beacon#attestations), [`execution_payloads`](/datasets/tables/eth-beacon#execution_payloads), and [`validators`](/datasets/tables/eth-beacon#validators). Query one through its dataset's name, like `SELECT * FROM "acme/eth_beacon".blocks`. Column types are [Arrow types](/datasets/manifests#data-types), and a nullable column can be `NULL`.

## `blocks`

One row per block on the Beacon chain, Ethereum's consensus layer, where validators (accounts that stake ether) agree on the chain's history. Amp only extracts finalized blocks, and a slot without a block has no row.

| Column                     | Type                                                                                                | Nullable | Description                                                                                                                                                                                                                                                                                                 |
| -------------------------- | --------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `_block_num`               | `UInt64`                                                                                            | No       | The slot the row comes from, the same as `slot`. Amp adds it to every raw table, and uses it to order the data, split it into files, and track which slots it has.                                                                                                                                          |
| `_ts`                      | `Timestamp(Nanosecond, +00:00)`                                                                     | No       | The time the slot starts, in UTC, the same as the `blocks` table's `timestamp`.                                                                                                                                                                                                                             |
| `slot`                     | `UInt64`                                                                                            | No       | The slot the block was proposed in. A slot is a fixed window of time (12 seconds on Ethereum) in which one validator can propose a block; a slot where none did is skipped.                                                                                                                                 |
| `timestamp`                | `Timestamp(Nanosecond, +00:00)`                                                                     | No       | The time the slot starts, in UTC: the chain's genesis time plus `slot` times the slot length. Beacon blocks don't record a time of their own.                                                                                                                                                               |
| `hash`                     | `FixedSizeBinary(32)`                                                                               | No       | The block's root, the hash that identifies it: a 32-byte fingerprint of its header, stored as raw bytes rather than a hex string.                                                                                                                                                                           |
| `version`                  | `Utf8`                                                                                              | No       | The consensus upgrade the block follows, which decides its fields: `phase0`, `altair`, `bellatrix`, `capella`, `deneb`, `electra`, `fulu`, or a later one.                                                                                                                                                  |
| `finalized`                | `Boolean`                                                                                           | No       | Whether, when Amp fetched the block, the node reported it as finalized: settled for good, so it can't be reverted. Amp only extracts finalized slots, so it's normally `true`.                                                                                                                              |
| `execution_optimistic`     | `Boolean`                                                                                           | No       | Whether, when Amp fetched the block, the node had accepted it without its execution client checking the block's transactions yet (optimistic sync).                                                                                                                                                         |
| `proposer_index`           | `UInt64`                                                                                            | No       | The index of the validator that proposed the block. Joins to `validators.validator_index`.                                                                                                                                                                                                                  |
| `parent_hash`              | `FixedSizeBinary(32)`                                                                               | No       | The `hash` of the block before this one. When the slots before this one were skipped, the last block before them.                                                                                                                                                                                           |
| `state_root`               | `FixedSizeBinary(32)`                                                                               | No       | A hash that fingerprints the Beacon chain's state after the block, like every validator's balance and status. The `validators` table's snapshots come from this state.                                                                                                                                      |
| `body_root`                | `FixedSizeBinary(32)`                                                                               | No       | A hash that fingerprints the block's body: everything it carries, like attestations and the execution payload.                                                                                                                                                                                              |
| `signature`                | `FixedSizeBinary(96)`                                                                               | No       | The proposer's signature over the block, made with BLS, the signature scheme validators use.                                                                                                                                                                                                                |
| `randao_reveal`            | `FixedSizeBinary(96)`                                                                               | No       | The proposer's signature over the current epoch, which the chain mixes into its source of randomness. An epoch is a group of slots (32 on Ethereum).                                                                                                                                                        |
| `eth1_data`                | `Struct(deposit_root: FixedSizeBinary(32), deposit_count: UInt64, block_hash: FixedSizeBinary(32))` | No       | The proposer's vote on the state of the deposit contract, where new validators deposit their stake on the execution layer: its `deposit_root` (a hash of the deposits so far), its `deposit_count`, and the `block_hash` of the execution block the vote is about.                                          |
| `graffiti`                 | `FixedSizeBinary(32)`                                                                               | No       | 32 bytes the proposer chose freely, often text naming its client or staking pool.                                                                                                                                                                                                                           |
| `sync_aggregate`           | `Utf8`                                                                                              | Yes      | The sync committee's signatures for the previous block, as JSON text from the Beacon API: `sync_committee_bits` says which of the committee's 512 validators signed, and `sync_committee_signature` combines their signatures. Null for blocks before the Altair upgrade, which introduced sync committees. |
| `proposer_slashings`       | `Utf8`                                                                                              | No       | Proofs that validators proposed two different blocks for the same slot, as a JSON array from the Beacon API. Each gets the validator slashed: penalized and forced to exit.                                                                                                                                 |
| `attester_slashings`       | `Utf8`                                                                                              | No       | Proofs that validators made conflicting attestations (their votes on the chain's head and on finality), as a JSON array from the Beacon API. Each gets the validators it names slashed.                                                                                                                     |
| `deposits`                 | `Utf8`                                                                                              | No       | Deposits to the deposit contract that the block brings onto the Beacon chain, each adding a validator or topping one up, as a JSON array from the Beacon API. Since the Electra upgrade, new deposits arrive in `execution_requests` instead.                                                               |
| `voluntary_exits`          | `Utf8`                                                                                              | No       | Validators' signed requests to stop validating, as a JSON array from the Beacon API.                                                                                                                                                                                                                        |
| `bls_to_execution_changes` | `Utf8`                                                                                              | Yes      | Validators' requests to send their withdrawals to an execution-layer address, replacing the BLS key they started with, as a JSON array from the Beacon API. Null for blocks before the Capella upgrade, which introduced withdrawals.                                                                       |
| `blob_kzg_commitments`     | `List(FixedSizeBinary(48))`                                                                         | Yes      | One commitment per blob the block's transactions carry: blobs are large chunks of data, mostly from layer 2 chains, and each commitment fingerprints one. Null for blocks before the Deneb upgrade, which introduced blobs.                                                                                 |
| `execution_requests`       | `Utf8`                                                                                              | Yes      | The requests the execution layer passes to the Beacon chain in the block, as JSON text from the Beacon API: `deposits`, `withdrawals`, and `consolidations` (merging validators). Null for blocks before the Electra upgrade, which introduced them.                                                        |

## `attestations`

One row per attestation a block includes. An attestation is a vote by a committee of validators on the chain's head and on which checkpoints to finalize, their signatures combined into one.

| Column             | Type                                                                                                                                                                                              | Nullable | Description                                                                                                                                                                                                                                                                                                       |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `_block_num`       | `UInt64`                                                                                                                                                                                          | No       | The slot the row comes from, the same as `slot`. Amp adds it to every raw table, and uses it to order the data, split it into files, and track which slots it has.                                                                                                                                                |
| `_ts`              | `Timestamp(Nanosecond, +00:00)`                                                                                                                                                                   | No       | The time the slot starts, in UTC, the same as the `blocks` table's `timestamp`.                                                                                                                                                                                                                                   |
| `slot`             | `UInt64`                                                                                                                                                                                          | No       | The slot of the block that includes the attestation. Joins to `blocks.slot`.                                                                                                                                                                                                                                      |
| `block_root`       | `FixedSizeBinary(32)`                                                                                                                                                                             | No       | The root of the block that includes the attestation. Joins to `blocks.hash`.                                                                                                                                                                                                                                      |
| `index`            | `UInt32`                                                                                                                                                                                          | No       | The attestation's position in its block, counting from `0`.                                                                                                                                                                                                                                                       |
| `aggregation_bits` | `Binary`                                                                                                                                                                                          | No       | Which of the committee's validators voted, one bit each in committee order, starting from the lowest bit of the first byte, with an extra `1` bit marking the end. Since the Electra upgrade, it covers each committee in `committee_bits`, one after the other.                                                  |
| `committee_bits`   | `FixedSizeBinary(8)`                                                                                                                                                                              | Yes      | Which committees the attestation combines, one bit per committee index, starting from the lowest bit of the first byte. Null for blocks before the Electra upgrade, when an attestation covered the one committee in `data.index`.                                                                                |
| `data`             | `Struct(slot: UInt64, index: UInt64, beacon_block_root: FixedSizeBinary(32), source: Struct(epoch: UInt64, root: FixedSizeBinary(32)), target: Struct(epoch: UInt64, root: FixedSizeBinary(32)))` | No       | What the validators voted for: the `slot` they voted in, their committee's `index` (`0` since the Electra upgrade, which moved it to `committee_bits`), the `beacon_block_root` they saw as the chain's head, and the `source` and `target` checkpoints (an epoch and a block root each) that finality builds on. |
| `signature`        | `FixedSizeBinary(96)`                                                                                                                                                                             | No       | The validators' BLS signatures, combined into one.                                                                                                                                                                                                                                                                |

## `execution_payloads`

One row per execution payload: the execution-layer block, with Ethereum's transactions, that a Beacon block carries. Blocks before the Bellatrix upgrade carry none, and those between it and the Merge, Ethereum's 2022 switch from mining to staking, carry an empty one, all zeros.

| Column             | Type                                                                                                 | Nullable | Description                                                                                                                                                                                                                                                                                                                      |
| ------------------ | ---------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `_block_num`       | `UInt64`                                                                                             | No       | The slot the row comes from, the same as `slot`. Amp adds it to every raw table, and uses it to order the data, split it into files, and track which slots it has.                                                                                                                                                               |
| `_ts`              | `Timestamp(Nanosecond, +00:00)`                                                                      | No       | The time the slot starts, in UTC, the same as the `blocks` table's `timestamp`.                                                                                                                                                                                                                                                  |
| `slot`             | `UInt64`                                                                                             | No       | The slot of the Beacon block that carries the payload. Joins to `blocks.slot`.                                                                                                                                                                                                                                                   |
| `block_root`       | `FixedSizeBinary(32)`                                                                                | No       | The root of the Beacon block that carries the payload. Joins to `blocks.hash`.                                                                                                                                                                                                                                                   |
| `block_number`     | `UInt64`                                                                                             | No       | The execution block's number, the `block_num` in an EVM RPC dataset of the same chain.                                                                                                                                                                                                                                           |
| `parent_hash`      | `FixedSizeBinary(32)`                                                                                | No       | The hash of the execution block before this one.                                                                                                                                                                                                                                                                                 |
| `fee_recipient`    | `FixedSizeBinary(20)`                                                                                | No       | The address that receives the block's priority fees, the tips transactions pay on top of the base fee, as the proposer chose: the `miner` in an EVM RPC dataset. Addresses are their 20 raw bytes.                                                                                                                               |
| `state_root`       | `FixedSizeBinary(32)`                                                                                | No       | A hash that fingerprints every account's state on the execution layer (balance, code, and storage) after the block.                                                                                                                                                                                                              |
| `receipts_root`    | `FixedSizeBinary(32)`                                                                                | No       | A hash that fingerprints the block's receipts, the outcome of each transaction: whether it succeeded, the gas it used, and its logs.                                                                                                                                                                                             |
| `logs_bloom`       | `FixedSizeBinary(256)`                                                                               | No       | A Bloom filter of the addresses and topics in the block's logs: a compact summary that tells you a block certainly lacks a given log, or may have it.                                                                                                                                                                            |
| `prev_randao`      | `FixedSizeBinary(32)`                                                                                | No       | The Beacon chain's randomness for the block, which contracts can read (`PREVRANDAO`).                                                                                                                                                                                                                                            |
| `gas_limit`        | `UInt64`                                                                                             | No       | The most gas the block's transactions can use in total. Gas is the unit the execution layer measures computation in, and each transaction pays for the gas it uses.                                                                                                                                                              |
| `gas_used`         | `UInt64`                                                                                             | No       | The gas the block's transactions used in total.                                                                                                                                                                                                                                                                                  |
| `timestamp`        | `UInt64`                                                                                             | No       | The execution block's time, in seconds since 1970-01-01 UTC (Unix time). It matches the slot's start, `_ts`.                                                                                                                                                                                                                     |
| `extra_data`       | `Binary`                                                                                             | No       | Up to 32 bytes the block's builder chose freely, often text naming it.                                                                                                                                                                                                                                                           |
| `base_fee_per_gas` | `Utf8`                                                                                               | No       | The minimum price per unit of gas a transaction pays to be in the block, in wei, as a decimal string: 10^18 wei make one ether.                                                                                                                                                                                                  |
| `block_hash`       | `FixedSizeBinary(32)`                                                                                | No       | The execution block's hash, the `hash` in an EVM RPC dataset's `blocks` table.                                                                                                                                                                                                                                                   |
| `transactions`     | `List(Binary)`                                                                                       | No       | The block's transactions, in order, each as its raw encoded bytes (hashing them gives the transaction's hash). An EVM RPC dataset of the same chain has them decoded, in its `transactions` table.                                                                                                                               |
| `withdrawals`      | `List(Struct(index: UInt64, validator_index: UInt64, address: FixedSizeBinary(20), amount: UInt64))` | Yes      | The withdrawals the block pays out from validators' balances to execution-layer addresses: each has its `index` (a counter across all withdrawals), its `validator_index`, the `address` it pays, and the `amount` in gwei (10^9 gwei make one ether). Null for blocks before the Capella upgrade, which introduced withdrawals. |
| `blob_gas_used`    | `UInt64`                                                                                             | Yes      | The blob gas the block's transactions used: blob gas prices blobs apart from gas. Null for blocks before the Deneb upgrade, which introduced blobs.                                                                                                                                                                              |
| `excess_blob_gas`  | `UInt64`                                                                                             | Yes      | How far blob gas use has run above its target over recent blocks, which sets the price of blob gas. Null for blocks before the Deneb upgrade.                                                                                                                                                                                    |

## `validators`

One row per validator per epoch: a snapshot of every validator, taken from the state after the block in the epoch's first slot. An epoch whose first slot was skipped has no snapshot.

| Column                         | Type                            | Nullable | Description                                                                                                                                                                                                                                                          |
| ------------------------------ | ------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `_block_num`                   | `UInt64`                        | No       | The slot the row comes from, the same as `slot`. Amp adds it to every raw table, and uses it to order the data, split it into files, and track which slots it has.                                                                                                   |
| `_ts`                          | `Timestamp(Nanosecond, +00:00)` | No       | The time the slot starts, in UTC, the same as the `blocks` table's `timestamp`.                                                                                                                                                                                      |
| `slot`                         | `UInt64`                        | No       | The epoch's first slot, whose block's resulting state the snapshot comes from. Joins to `blocks.slot`.                                                                                                                                                               |
| `epoch`                        | `UInt64`                        | No       | The snapshot's epoch: `slot` divided by the slots per epoch (32 on Ethereum).                                                                                                                                                                                        |
| `validator_index`              | `UInt64`                        | No       | The validator's index, its permanent number in the registry of validators. Joins to `blocks.proposer_index`.                                                                                                                                                         |
| `status`                       | `Utf8`                          | No       | The validator's status in the epoch, as the Beacon API names it: `pending_initialized`, `pending_queued`, `active_ongoing`, `active_exiting`, `active_slashed`, `exited_unslashed`, `exited_slashed`, `withdrawal_possible`, or `withdrawal_done`.                   |
| `pubkey`                       | `FixedSizeBinary(48)`           | No       | The validator's BLS public key, which identifies it across the chain's history.                                                                                                                                                                                      |
| `withdrawal_credentials`       | `FixedSizeBinary(32)`           | No       | Where the validator's withdrawals go. The first byte says how: `0x00` for a BLS key that hasn't set an address yet, `0x01` or `0x02` for the execution-layer address in the last 20 bytes (`0x02` validators, since the Electra upgrade, keep their rewards staked). |
| `balance`                      | `UInt64`                        | No       | The validator's balance, in gwei: 10^9 gwei make one ether.                                                                                                                                                                                                          |
| `effective_balance`            | `UInt64`                        | No       | The balance the chain weighs the validator's votes and rewards by, in gwei: roughly `balance` rounded down to a whole ether, and capped at 32 ether (2,048 for `0x02` validators).                                                                                   |
| `slashed`                      | `Boolean`                       | No       | Whether the validator has been slashed: penalized and forced to exit for breaking the protocol's rules.                                                                                                                                                              |
| `activation_eligibility_epoch` | `UInt64`                        | No       | The epoch the validator became eligible to join the queue to activate. `18446744073709551615`, the largest value, while it isn't yet.                                                                                                                                |
| `activation_epoch`             | `UInt64`                        | No       | The epoch the validator became, or becomes, active. `18446744073709551615`, the largest value, while it isn't scheduled.                                                                                                                                             |
| `exit_epoch`                   | `UInt64`                        | No       | The epoch the validator exited, or will exit. `18446744073709551615`, the largest value, while it isn't scheduled.                                                                                                                                                   |
| `withdrawable_epoch`           | `UInt64`                        | No       | The epoch from which the validator's whole balance can be withdrawn. `18446744073709551615`, the largest value, while it isn't scheduled.                                                                                                                            |
