Ethereum Block Header Explained: Fields, Roots, and RPC Checks
Learn how Ethereum block header fields link blocks, commit to state and receipts, meter gas, and differ from Beacon blocks and JSON-RPC objects.

A block explorer can show hundreds of transactions, yet Ethereum identifies that block with one hash. The bridge between the long payload and that compact identity is the block header. It is a small, structured summary that links blockchain basics such as parent hashes, state commitments, gas accounting, and time into one object clients can verify.
Think of the header as a tamper-evident shipping label. The label does not contain every item in the container. It records identifiers, totals, and sealed fingerprints that let a receiver check whether the container belongs in the route and whether its contents match the manifest. This guide explains the execution-layer fields you see through JSON-RPC, how they relate to the proof-of-stake Beacon block, and what a header can—and cannot—prove.
What an Ethereum block header does
An execution block header has four practical jobs:
- Link history.
parentHashpoints to the previous execution block, so changing an older header changes the descendants that refer to it. - Commit to data and results. Root fields summarize the transactions, receipts, and post-execution state.
- Record execution constraints. Gas, fee, time, and block-number fields give clients inputs they need to validate the block.
- Produce a block hash. The protocol encodes the header fields in their consensus-defined order and hashes that encoding. It does not hash an arbitrary JSON object from a provider.
The official Ethereum blocks documentation separates the proof-of-stake Beacon block from its execution payload. That distinction matters after The Merge: the consensus layer chooses and finalizes Beacon blocks, while the execution layer processes transactions and checks the execution payload.
The core execution header fields
Field sets grow when network upgrades add protocol features, so applications should use the specification for their target fork. The following groups cover the durable fields most readers encounter in eth_getBlockByNumber responses.
| Field | What it represents | Common mistake |
|---|---|---|
parentHash | Hash of the parent execution block | Treating the link as proof the block is finalized |
number | Execution block height | Assuming every Beacon slot has a block |
timestamp | Block time in Unix seconds | Using it as a precise wall-clock oracle |
stateRoot | Commitment to the post-block execution state | Treating the root as the state database itself |
transactionsRoot | Commitment to the ordered transaction list | Confusing it with one transaction hash |
receiptsRoot | Commitment to ordered execution receipts | Assuming it contains full traces or return values |
logsBloom | Probabilistic filter over receipt logs | Treating a bloom match as a confirmed event |
gasLimit | Maximum execution gas available to the block | Reading it as gas actually spent |
gasUsed | Execution gas consumed by included transactions | Assuming it includes every separate data-fee dimension |
baseFeePerGas | Protocol base fee for execution gas | Treating it as the full fee every user paid |
feeRecipient / miner | Address receiving execution-layer priority fees | Assuming the RPC name means proof-of-work mining continues |
extraData | A bounded byte field | Trusting it as authenticated human-readable metadata |
The standard Ethereum Execution API method returns a developer-friendly block object. Names can differ from consensus-spec names: RPC commonly exposes miner, while the post-Merge execution payload specification calls the role fee_recipient. Legacy-shaped fields such as difficulty, mixHash, or nonce can also remain in RPC responses for compatibility even though proof-of-stake validation does not use them like proof of work did.
How the three root fields differ
The three most important commitments answer different questions.
State root: what did execution produce?
stateRoot commits to Ethereum's global execution state after all transactions in the block run. That state covers account nonces and balances plus contract code and storage commitments. An execution client starts from the parent state, runs the ordered transactions, applies protocol rules, and checks that its resulting root matches the header.
The Ethereum Merkle Patricia Trie guide explains why the 32-byte root is a fingerprint of a much larger key-value structure rather than a compressed copy of every account.
Transactions root: what inputs were included, and in what order?
transactionsRoot commits to the exact ordered transaction encodings. Order is part of the result because two valid transactions can touch the same state and produce different outcomes when swapped. A list of transaction hashes shown by an explorer is useful, but proof construction requires the consensus encoding and trie position.
Receipts root: what execution records survived?
receiptsRoot commits to the ordered receipt encodings. Receipts include status or the historical state-root form, cumulative gas, bloom data, and logs under the rules applicable to the transaction. They do not include a complete opcode trace.
If any committed transaction or receipt changes, its trie root changes. If execution produces a different state, stateRoot changes. Because those roots sit in the header, the block hash changes too.
Gas, fees, and fork-added fields
gasLimit is the block's execution budget; gasUsed is how much of that budget the included transactions consumed. baseFeePerGas, introduced by EIP-1559, is the protocol-calculated base price for execution gas. A user's actual effective price can also include a priority fee, so the header's base fee is not a universal per-transaction cost.
Protocol upgrades append fields when the block must commit to new data:
- EIP-4895 added a withdrawals commitment for consensus-layer withdrawals processed by the execution layer.
- EIP-4844 added
blobGasUsedandexcessBlobGasfor the separate blob-data fee market. - Later forks may add other commitments. Software should feature-detect fields and follow the specification for the selected block instead of assuming one frozen header shape.
This is also why gasUsed alone is not always a complete cost summary. Blob gas uses separate accounting. For ordinary user transactions, receipts provide the per-transaction gasUsed and effective price needed for fee analysis.
Execution header vs Beacon block header
Ethereum now has two closely related structures that are easy to collapse into one.
The Beacon block header belongs to the consensus layer. It contains a slot, proposer index, parent root, state root, and body root. The Beacon block body carries attestations and an execution payload among other consensus objects.
The execution payload header summarizes the execution payload: parent execution hash, fee recipient, execution state and receipt roots, gas fields, timestamp, transactions root, and fork-specific additions. The Bellatrix consensus specification shows how consensus processing checks the execution payload's parent hash, randomness input, timestamp, and execution validity before caching its header.
One Beacon slot can be empty if its selected proposer misses the opportunity, so a slot number and execution block number are not interchangeable counters. Likewise, the Beacon state_root commits to consensus state; the execution stateRoot commits to EVM account and contract state. Same phrase, different state machine.
How to inspect a block safely with JSON-RPC
The standard method accepts a block selector and a boolean choosing transaction hashes or full transaction objects:
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_getBlockByNumber",
"params": ["finalized", false]
}A practical check looks like this:
- Choose the trust point. Use a specific block number or hash for reproducibility. Use
safeorfinalizedwhen your consequence requires stronger reorganization protection. - Record both number and hash. A number alone can later refer to a different block after a reorganization near the head.
- Check the parent link. The child's
parentHashshould equal the selected parent's hash. - Interpret roots by role. State, transactions, and receipts are separate commitments; none substitutes for the others.
- Decode hexadecimal quantities. JSON-RPC quantities are hexadecimal strings, not decimal text.
- Do not rehash JSON. Reproducing the block hash requires the fork-correct consensus header and encoding, not alphabetically sorted RPC keys.
The guide to Ethereum JSON-RPC block tags covers the difference between latest, safe, finalized, pending, and explicit identifiers.
Risks and limitations
- A valid header is not automatically finalized. A recent valid block can still leave the canonical chain. Apply a consequence-appropriate finality policy.
- A trusted root is required for proofs. A Merkle proof against a header supplied by the same untrusted party does not independently authenticate that header.
- RPC objects are interfaces, not consensus bytes. Providers may omit optional or fork-specific fields, and
pendingresponses can contain null values. - Bloom filters admit false positives.
logsBloomcan rule data out, but a candidate match must be checked against actual logs. - Timestamps are bounded protocol inputs, not precision clocks. Do not treat block time as a guaranteed real-world event timestamp.
- Header validity does not certify an application. Correct roots can commit to a successful scam transaction, a vulnerable contract, or an economically harmful trade.
Warning
A block hash gives you a compact identity for a specific header. It does not by itself establish finality, prove that your RPC endpoint chose the canonical chain, or make the committed transactions safe.
Verification checklist
- Confirm the chain and the block selector you intended
- Save block number and block hash together
- Match
parentHashagainst the parent block - Separate Beacon roots from execution roots
- Distinguish
gasLimit,gasUsed, base fee, and blob gas - Use receipt fields for per-transaction outcomes and costs
- Treat bloom matches as candidates, then inspect logs
- Use fork-correct consensus encoding before recomputing a block hash
- Apply an explicit safe/finalized policy for high-consequence actions
- Verify proof roots through an independently trusted consensus path
FAQ
Is the block hash the same as the state root?
No. The state root commits to post-execution state. The block hash identifies the whole execution header, which includes that root plus the parent link, transaction and receipt commitments, gas fields, time, and other fork-defined fields.
Does the header contain every transaction?
No. It commits to their ordered encodings through transactionsRoot. The execution payload or RPC block object can carry the transaction list separately.
Why does JSON-RPC still show miner or difficulty?
The API preserves a block-object shape used across Ethereum's history. After The Merge, the fee-recipient role and randomness field have proof-of-stake meanings, while some legacy fields remain as compatibility values. Do not infer active proof-of-work mining from a field name alone.
Can I verify a transaction from only its hash and a block header?
Not from those two values alone. You need the correctly encoded transaction, its index or trie key, and a valid inclusion proof against the header's transaction root. You also need a reason to trust that header as canonical enough for your use case.
Is an execution block number the same as a Beacon slot?
No. Slots advance on the consensus clock even when no block is proposed. Execution block numbers advance when execution blocks are produced.
Primary sources
- Ethereum.org: Blocks
- Ethereum Execution APIs: eth_getBlockByNumber
- Ethereum.org: JSON-RPC API
- Ethereum consensus specs: Bellatrix Beacon Chain
- EIP-1559: Fee market change
- EIP-4895: Beacon chain push withdrawals
- EIP-4844: Shard blob transactions
The practical takeaway
An Ethereum block header is a compact verification surface, not a miniature copy of the block. Parent linkage orders history; roots commit to inputs and outcomes; gas and time fields constrain execution; fork additions extend what the block must account for. Read each field according to its layer and fork, authenticate the header before trusting proofs built on it, and use finality rules that match the consequence.
This article is educational, not financial advice. Protocol-valid blocks can still contain risky assets, malicious contracts, and irreversible mistakes. Test tooling carefully, verify primary specifications, use only funds you can afford to lose, and do your own research (DYOR).
Keep learning

Ethereum Merkle Patricia Trie: How the State Root Proves the Network
Ethereum uses Merkle Patricia tries to commit accounts, contract storage, transactions, and receipts to compact roots. Learn how the structure works.

Ethereum Transaction Receipts Explained: Status, Gas, Logs, and Proofs
Learn how Ethereum transaction receipts record execution status, gas used, logs, contract creation, typed transactions, and receipt-root commitments.

Ethereum JSON-RPC Block Tags: latest, safe, finalized, and pending
Learn how Ethereum JSON-RPC block tags choose state, why latest is not final, and when to use safe, finalized, pending, a number, or a hash.
Explore related topics

Ethereum Glamsterdam Upgrade: ePBS, BALs, and What Is Actually Planned
Ethereum Glamsterdam reached Sepolia, but its Hoodi activation was postponed. Learn why, what ePBS and BALs change, and what remains uncertain.
Crypto Address Poisoning: How to Verify Wallet Addresses Before You Send
Crypto address poisoning plants a lookalike address in your transaction history. Learn how it works and follow a safer verification checklist.