Why not confirm transactions one by one?
“Someone broadcast a transaction” and “the network agrees where that transaction belongs in history” are two entirely different claims.
Once a wallet signs a transaction, it propagates across the peer-to-peer network. Different nodes can receive different transactions, in different orders, at different times. Each node’s transaction pool—or mempool—is therefore a set of candidate requests, not settled public history.
Suppose Alice has only 5 ETH and broadcasts “send Bob 5 ETH” and “send Carol 5 ETH” almost simultaneously. Both signatures may be authentic, but both transfers cannot succeed. Nodes must first agree on execution order before they can derive one result. A block’s first job is to turn a batch of candidates into a strictly ordered sequence.
Its second job is to define a clean boundary around a state transition. Starting from the same prior state, nodes replay transactions and protocol-level operations in block order, derive the next state, and record key results as root commitments. No one needs to trust the block builder’s word: every execution node can recompute the answer for itself.
Transaction pool
Nodes may see different candidate sets, and no network-wide order exists yet.
Block batch
The proposed transactions are fixed in index order; position is part of the committed data.
Verifiable next state
Every execution node replays the batch under the same rules and compares state and receipt roots, gas totals, and other results.
Why does a modern Ethereum block have two layers?
Since The Merge, consensus and execution clients divide the work. To understand a block, first separate its outer shell from its inner core.
In everyday speech, “an Ethereum block” may mean the beacon block, or it may mean the execution block shown by a block explorer. These are not two unrelated chains; they are two protocol views of the same Ethereum.
The consensus layer answers: “Which slot is this? Who proposed it? Which parent beacon block does it follow?
Which branch do validators recognize?” The execution layer answers: “In what order do these transactions run?
How much gas do they consume? What account and contract state results?” The beacon block’s body
carries an execution_payload, fastening the two together.
Beacon block
Uses SSZ serialization and Merkleization via hash_tree_root; signed by the proposer; carries consensus operations and the execution payload.
slotposition in protocol timeproposer_indexvalidator proposing this slotparent_rootparent beacon-block rootstate_rootconsensus-state rootbodyattestations, slashings, execution payload, blob commitments, and more
Execution payload
Maps to an execution block; contains header fields, full ordered transactions, withdrawals, and other execution data.
parent_hashparent execution-block hashtimestampUnix time derived from the slottransactionsfull, signed, strictly ordered transactionsstate_rootEVM world-state rootreceipts_rootexecution-receipt root
parent_root; an execution block links execution history through parent_hash. Unless noted otherwise, “block header” below means the execution layer’s RLP header.
Also separate the beacon block header from the full beacon block
The compact BeaconBlockHeader contains only
slot, proposer_index, parent_root,
state_root, and body_root.
A full BeaconBlock carries the body itself;
SignedBeaconBlock then wraps the message with the proposer’s BLS signature.
What is commonly called the beacon-block root is the SSZ hash_tree_root of the
block message; the outer signature is not part of that root. By contrast, today’s execution-block hash is
Keccak-256 over the RLP-encoded execution header.
The block header is an index and a seal—not the contents
A small set of fields points to parent history, commits to large bodies of data and execution results, and supplies context required by validation rules.
The execution block body stores full transactions and withdrawals. The execution header does not duplicate that data; it stores root commitments instead. Think of the header as a table of contents, tamper-evident seal, and protocol-parameter sheet combined.
As of July 2026, after Fusaka and BPO2, the mainnet execution header contains 21 fields. You do not need to memorize them all at once. Start with the parent hash, three essential roots, block number, timestamp, and gas; then place the later withdrawal, blob, and request commitments on the same map.
Block-header field inspector
Select a representative field to see what it commits to, how a node checks it, and what it is most often confused with.
parent_hash
The Keccak-256 hash of the parent execution header. It links this execution block to one specific parent.
View all 21 fields in the current execution header
| # | Field | Purpose |
|---|---|---|
| 01 | parent_hash | Keccak-256(RLP(header)) of the parent execution block. |
| 02 | ommers_hash | Ommers are empty after PoS, so this is fixed to Keccak-256(RLP([])). |
| 03 | coinbase / fee_recipient | Execution-layer address receiving priority fees; it need not be the proposer itself. |
| 04 | state_root | Root of the EVM world-state MPT after the entire block has executed. |
| 05 | transactions_root | Root of the ordered transaction MPT, keyed by in-block index. |
| 06 | receipts_root | Root of the MPT containing every transaction receipt. |
| 07 | logs_bloom | 2,048-bit event-log filter; permits false positives and is not the full log data. |
| 08 | difficulty | Fixed to 0 after PoS; no longer represents mining difficulty. |
| 09 | number | Execution-block height; increments only when a new execution block actually appears. |
| 10 | gas_limit | Maximum execution gas this block may consume. |
| 11 | gas_used | Total execution gas actually consumed by transactions in the block. |
| 12 | timestamp | Unix seconds; in PoS Ethereum, derived exactly from the corresponding slot. |
| 13 | extra_data | Up to 32 bytes of extra data. |
| 14 | prev_randao | Randomness from the beacon chain, reusing the former mixHash field position. |
| 15 | nonce | Fixed to eight zero bytes after PoS. |
| 16 | base_fee_per_gas | EIP-1559 base fee, adjusted by protocol according to block congestion. |
| 17 | withdrawals_root | Commitment to the list of validator withdrawals triggered by the consensus layer. |
| 18 | blob_gas_used | Blob gas consumed by blob transactions in this block. |
| 19 | excess_blob_gas | Accumulated excess that drives the blob base fee. |
| 20 | parent_beacon_block_root | SSZ hash_tree_root of the parent beacon block, linking the execution environment to consensus history. |
| 21 | requests_hash | Commitment to consensus requests triggered by execution: deposit requests, withdrawal requests, and consolidation requests. |
Why retain PoW fields that are no longer “used”?
The Merge changed the consensus mechanism without redesigning the execution header from scratch.
The positions of difficulty, nonce, and ommers_hash remain, but
protocol rules constrain them to fixed values. The old mixHash position acquired a new meaning
as prev_randao. This approach reduced disruptive changes to serialization and clients.
The timestamp is not an “approximate time” chosen by the validator
Proof-of-stake Ethereum first advances through 12-second slots, then derives the execution-payload timestamp from the slot. A slot may be empty.
A consensus-layer beacon block has no top-level timestamp; it has a slot.
The execution payload’s timestamp must equal the protocol time assigned to that slot.
A new slot begins every 12 seconds, but its proposer may be offline, propagation may be late, or the proposed
block may not be accepted. That slot can therefore remain empty. When the next block actually appears,
slot and timestamp skip over the gap, while the execution-block number still rises
by only one from the previous actual block.
Slot / timestamp / block-number lab
Switch between missed-block scenarios and watch the three counters advance independently.
#21,000,000
#21,000,001
#21,000,002
#21,000,003
#21,000,004
A block stores signed byte sequences—not “screenshots of transactions”
A block explorer presents a human-readable interface view. What enters the execution block is a deterministically parseable, signature-verifiable serialized transaction.
A transaction typically expresses who authorized it, which address to call, how much value to transfer, what data to carry, the maximum gas it may use, and the fees it is willing to pay. Exact fields depend on the transaction type, but all of them must ultimately become canonical serialized bytes.
Common current types include type 0 legacy transactions, type 1 access-list transactions, type 2 EIP-1559 transactions, type 3 blob transactions, and type 4 EIP-7702 set-code transactions. EIP-2718 gives us this unifying envelope model:
Four views of one transaction
Explorer JSON, canonical bytes, and human intent belong to different layers. Switch views to see which fields are derived.
“Call a contract with 1 ETH”
This is user-level intent. The wallet assembles the chain ID, account nonce, gas and fee parameters, destination, value, calldata, and other fields, then asks the private key to sign.
JSON-RPC / block-explorer view
The interface turns binary data into named fields and may add derived values for convenient querying. from and the transaction hash matter, but they are not ordinary independent fields laid out inside a type 2 transaction payload.
Typed, signed, serialized bytes
Nodes propagate and commit to canonical encoding, not indented JSON. A type 2 transaction starts with the type byte 0x02, followed by the RLP payload defined for that type.
The full blob is not inside the execution payload
A type 3 transaction commits to blob versioned hashes in the execution payload; the beacon block carries KZG commitments. After Fusaka, the actual blob data is propagated and sampled through PeerDAS data-column sidecars.
Why is order itself data?
The execution block’s transaction list has a strict order. A node uses each transaction’s in-block index as the
trie key and builds the transaction Merkle-Patricia Trie. Even if two transactions remain byte-for-byte
unchanged, swapping their positions changes transactions_root.
Order also changes meaning. Two calls may compete for the same balance, nonce, market price, or NFT. The transaction root commits to which inputs exist and the order in which they enter execution; the EVM then computes results in that same order.
Three roots commit to inputs, outcomes, and the new world
All three look like 32-byte hexadecimal strings, but each answers a different question.
transactionsRoot
Commits to the complete ordered transaction sequence. Replace one transaction, alter one byte, or change the order, and the root changes.
receiptsRoot
Commits to transaction-receipt results, including status, cumulative gas, logs bloom, and event logs.
stateRoot
Commits to the post-execution world state of every account, balance, nonce, code, and contract-storage value.
After receiving a block, a node does not merely check that “the transaction root looks like a hash.” It rebuilds the transaction trie according to the specification, replays every transaction, creates receipts, updates state, and compares all three locally computed roots to the header. If any one differs, the block is invalid.
Why is logsBloom not a fourth “exact root”?
logs_bloom is a 2,048-bit fast filter used to ask whether an address or event topic
“may be present.” It permits false positives, so it can only narrow a search. To confirm the actual logs, a
node must still inspect and verify transaction receipts. receipts_root is the cryptographic
commitment to the complete receipt set.
A root hash does not encrypt the underlying data
Hashing does not hide transaction contents. Public nodes can still read the transaction bytes. A root provides a compact commitment that exposes differences and supports membership proofs. Privacy and commitment are separate concerns.
How does one edit propagate into later history?
The current execution-block hash is the Keccak-256 fingerprint of the complete RLP header; the next block records it as parent_hash.
Altering a transaction changes at least transactions_root. Re-execution will usually also change
receipts_root, state_root, gas_used, and logs.
Once the header changes, the block hash changes; the old parent_hash recorded by the next block
immediately stops matching.
Tamper-propagation lab
Change the first transaction’s amount or swap transaction order, then watch “transaction → root → block hash → next parent hash” change layer by layer.
tx₁: C→D 1 ETH
Teaching fingerprint: The displayed values are deterministic abbreviations that make propagation easy to observe, not real Keccak-256 calculations.
Why does “the hash changed” not mean “history is absolutely immutable”?
Anyone can locally alter an old block’s bytes and recompute that block’s hash and every successor link. That alone does not create a valid competing history. Honest nodes already retain the original history, consensus rules determine which branch is canonical, validator votes and economic penalties raise the cost of rewriting, and finality makes finalized checkpoints extremely difficult to revert.
Keep four judgments separate: hash-consistent means only that content matches its fingerprint; valid means the block obeys the protocol and executes correctly; canonical means fork choice currently selects it; finalized means another branch will not replace it under normal protocol conditions.
What exactly does a node recheck after receiving a block?
Modern Ethereum does not “see a signature and accept.” Consensus and execution clients each perform a complete set of local checks.
A block producer supplies a candidate answer. A node rechecks the structure, parent relationships, transaction signatures, execution process, and root commitments. If any essential commitment disagrees, the entire block is invalid.
Valid
Structure, signatures, execution, and every commitment follow the protocol. Multiple valid branches may exist at once.
Canonical
Fork choice currently treats this branch as the chain head; blocks near the head can still undergo a short reorganization.
Finalized
The protocol has finalized a checkpoint through supermajority validator attestations; it will not revert under normal protocol conditions.
The block structure is an evolving protocol, not a stone tablet
Today’s 21 fields did not all exist at genesis. Each upgrade adds commitments for new validation responsibilities or redefines legacy fields.
- Base fee Added base_fee_per_gas so the fee market adjusts automatically with block congestion.
- Move to PoS Fixed difficulty and nonce; emptied ommers; reinterpreted mixHash as prev_randao.
- Validator withdrawals Added withdrawals to the body and withdrawals_root to the header.
- Blobs and a cross-layer root Added blob-gas fields and parent_beacon_block_root.
- Execution requests Added requests_hash; the consensus body carries execution_requests.
- PeerDAS Changed blob-data propagation and sampling; the current execution header still has 21 fields.
Why not memorize a single field list?
Fields evolve with hard forks, and names retain historical traces for compatibility. A more durable approach is to classify responsibilities: link history, commit to contents, commit to execution results, constrain resources, connect the layers, preserve compatibility. When a future field appears, you can first ask which responsibility it serves.
Why do execution-layer RLP and consensus-layer SSZ coexist?
Ethereum’s execution layer inherited its early RLP and Merkle-Patricia Trie systems. The beacon chain was designed around SSZ and SSZ Merkleization from the start. The two meet through the Engine API and the execution payload. This is why “hashing” cannot be reduced to one universal formula: different objects, serialization schemes, and hash-tree rules produce roots with different meanings.
Remove six misconceptions, then compress the lesson into one map
Understanding the structure means more than reciting fields. It means refusing to slide between concepts that merely look alike.
“The block header directly contains every transaction”
False. The execution block body stores full transactions; the header commits to their contents and order through transactions_root.
“blockHash is a field inside the header”
False. The current execution-block hash is computed from the RLP header; it cannot be one of its own inputs.
“Ethereum produces exactly one block every 12 seconds”
False. A slot begins every 12 seconds, but it may be empty. Actual blocks can be 24 seconds or more apart.
“The validator supplies an approximate timestamp”
False. A PoS execution-payload timestamp is derived exactly from genesis_time and the current slot.
“stateRoot has only one meaning”
False. The beacon block commits to consensus state; the execution header commits to EVM world state. They are not the same tree.
“A correct hash means the block is finalized”
False. Validity checks, fork choice, and finality are three separate stages.
Now check your understanding
Each question targets a common conceptual slip. Choose an answer before opening the explanation.
1. Two distinct transactions, each unchanged byte for byte, swap positions in a block. What is guaranteed to change?
Answer B. The transaction trie is keyed by in-block index, so swapping positions changes the key–value mapping. Execution results may change with order as well.
2. One 12-second slot is missed. How does the next actual execution block compare with the previous one?
Answer C. Slot time keeps advancing; an empty slot does not consume an execution-block number.
3. Which statement describes blockHash most accurately?
Answer A. The block hash identifies and commits to the execution header. It is not one of the RLP header’s own fields, and it does not prove offchain facts true.
4. How are the beacon block’s state_root and the execution header’s state_root related?
Answer C. They belong to different layers, different state objects, and different commitment structures.
5. Every root and hash in a block is internally consistent. Can you conclude that the block is finalized?
Answer B. Hash consistency is only one necessary condition. Valid, canonical, and finalized must be judged separately.
Print note: each answer and explanation is listed directly beneath its options.
Terms and primary sources
Protocols evolve. The most reliable study habit is to keep a clear mental model, then return to the current specifications to verify fields and boundaries.
Block body BLOCK BODY
On the execution layer, carries full ordered transactions, withdrawals, and the now-fixed-empty ommers list. The consensus-layer BeaconBlockBody additionally carries attestations, slashings, the execution payload, blob commitments, execution requests, and more.
Block header BLOCK HEADER
A compact summary of parent history, contents, execution results, resources, and protocol context. The execution-layer RLP header and beacon block header are different objects.
Root commitment ROOT COMMITMENT
A compact cryptographic commitment to an entire structured dataset. Change underlying data or position, and the recomputed root will ordinarily be completely different.
Slot CONSENSUS TIME UNIT
A discrete position in proof-of-stake consensus time. A current mainnet slot lasts 12 seconds, and a slot may contain no block.
RLP RECURSIVE LENGTH PREFIX
A deterministic byte-serialization method used widely by the execution layer. The current execution-block hash is Keccak-256 over the RLP-encoded execution header.
SSZ SIMPLE SERIALIZE
The consensus layer’s serialization and Merkleization system. A beacon-block root is computed through SSZ hash_tree_root.
Continue reading
-
ethereum.org — BlocksWhy blocks batch transactions, slots and empty slots, plus an introduction to beacon blocks and execution payloads.
-
Ethereum Execution Specs — BPO2 Block and HeaderThe current execution block body and 21-field header specification as of this lesson’s publication.
-
Ethereum Consensus Specs — Fulu Beacon ChainCurrent consensus structures, the execution payload, slot time, and validation conditions.
-
ethereum.org — Recursive Length Prefix serializationExecution-layer RLP rules and deterministic representation.
-
ethereum.org — Simple SerializeConsensus-layer SSZ serialization and
hash_tree_root. -
ethereum.org — Merkle Patricia TrieThe data structure underlying execution-layer state, transaction, and receipt roots.
-
EIP-2718 — Typed Transaction EnvelopeThe typed transaction envelope and rules for placing transactions and receipts into their tries.
-
EIP-3675 — Upgrade consensus to Proof-of-StakeHow PoS changed ommers, difficulty, nonce, and execution-layer reward semantics.
-
EIP-4399 — PREVRANDAOHow the former mixHash field carries beacon-chain randomness after PoS.
-
EIP-4895 — Beacon chain push withdrawalsThe withdrawal list and withdrawals_root.
-
EIP-4844 — Shard Blob TransactionsBlob-gas header fields, versioned hashes, and the sidecar boundary.
-
EIP-4788 — Beacon block root in the EVMHow parent_beacon_block_root enters the execution header.
-
EIP-7685 — General purpose execution layer requestsThe addition of requests_hash and commitments to execution requests.
-
ethereum.org — FusakaPeerDAS, data availability, and execution-block size boundaries in the current upgrade.