Ethereum: From Zero to Deep Understanding · Part II / Chapter 2 / Lesson 2

One Block,Two Worlds

How Ethereum Turns Transactions into Verifiable History.
A modern Ethereum block is more than a “box of transactions.” It spans the consensus and execution layers, compressing transaction order, execution results, protocol time, and the preceding history into commitments that anyone can independently verify.

  • 02 · 02Chapter 2 · Lesson 2
  • ≈ 60 MINSuggested study time
  • 10 VISUALSIncludes three interactive labs

Block specimenNot to scale

01 / CONSENSUS LAYER Signed Beacon Block
slotparent_rootstate_rootsignature
└─ body
02 / EXECUTION CORE Execution Payload
parent_hashtimestampstate_rootgas
03 / ORDERED DATA tx₀ · tx₁ · tx₂ · …
The outer layer orders and finalizes history; the inner layer replays transactions and commits to their results

Remember this first

A block is not a bag of transactions. It is an ordered state transition selected by consensus, together with cryptographic commitments to its parent, transactions, execution results, and consensus state.
Open the lesson map
  1. 01 · Why Blocks Exist
  2. 02 · Two Layers, One Block
  3. 03 · The Execution Header
  4. 04 · Timestamps and Slots
  5. 05 · Transaction Data
  6. 06 · Three Essential Roots
  7. 07 · The Block Hash
  8. 08 · How Nodes Validate
  9. 09 · How the Structure Evolves
  10. 10 · Misconceptions and Recap
  11. 11 · Check Your Understanding
  12. 12 · Terms and Sources
01 / WHY BLOCKS EXIST

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.

Sₙ + [ tx₀, tx₁, …, txₖ ] + protocol operations Sₙ₊₁ Prior state + strictly ordered inputs, executed under protocol rules, yields the next state.
Candidate requests

Transaction pool

Nodes may see different candidate sets, and no network-wide order exists yet.

Fixed proposed order

Block batch

The proposed transactions are fixed in index order; position is part of the committed data.

State boundary

Verifiable next state

Every execution node replays the batch under the same rules and compares state and receipt roots, gas totals, and other results.

Figure 01 · A block turns “requests” into a “candidate history” Inclusion is not instant finality. The block must still pass validity checks, fork choice, and the finality process.
02 / TWO LAYERS, ONE ETHEREUM

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.

Outer / Consensus layer

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 time
  • proposer_indexvalidator proposing this slot
  • parent_rootparent beacon-block root
  • state_rootconsensus-state root
  • bodyattestations, slashings, execution payload, blob commitments, and more
Inner / Execution layer

Execution payload

Maps to an execution block; contains header fields, full ordered transactions, withdrawals, and other execution data.

  • parent_hashparent execution-block hash
  • timestampUnix time derived from the slot
  • transactionsfull, signed, strictly ordered transactions
  • state_rootEVM world-state root
  • receipts_rootexecution-receipt root
Same name ≠ same meaning
Beacon block state_root Commits to consensus state: validators, balances, attestations, finality checkpoints, and more.
Execution block state_root Commits to EVM state: accounts, ETH balances, contract code, contract storage, and more.
Figure 02 · Two structures, two responsibilities A beacon block links consensus history through 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.

04 / SLOT ≠ BLOCK NUMBER ≠ TIME

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.

timestamp = genesis_time + slot × 12 seconds Mainnet GENESIS_SLOT is 0; this formula shows the essential relationship. A validator cannot choose an arbitrary time within a tolerance window.

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.

Interactive 02
SLOT 800Execution block
#21,000,000
SLOT 801Execution block
#21,000,001
SLOT 802Execution block
#21,000,002
SLOT 803Execution block
#21,000,003
SLOT 804Execution block
#21,000,004
Time between actual execution blocks12 seconds
Height difference between actual execution blocksAlways +1
Figure 04 · “One slot every 12 seconds” does not mean “one guaranteed block every 12 seconds” Block number describes the sequence of execution blocks that actually exist; slot describes a position in consensus time; timestamp is the Unix time assigned to that slot.
05 / WHAT TRANSACTION DATA MEANS

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:

TransactionType || TransactionPayload A type byte followed by the payload defined for that type. A type 0 legacy transaction retains its original RLP form and has no 0x00 prefix.

Four views of one transaction

Explorer JSON, canonical bytes, and human intent belong to different layers. Switch views to see which fields are derived.

Transaction microscope

“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.

IntentAlice → Contract X · value 1 ETH · call deposit()

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.

{ "type": "0x2", "hash": "0xa91e…d240", "from": "0xAlice…", "to": "0xContractX…", "value": "0x0de0b6b3a7640000", "input": "0xd0e30db0", "nonce": "0x17", "maxFeePerGas": "0x…", "yParity": "0x1", "r": "0x…", "s": "0x…" }

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.

0x02 || rlp([ chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, amount, data, access_list, signature_y_parity, signature_r, signature_s ])

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.

Execution payloadtype 3 transaction + blobVersionedHashes
Data-column sidecarsactual data columns + KZG proofs, propagated on a separate path
Figure 05 · One transaction, four representation layers An RPC can return only transaction hashes or expand full objects. That is a query-interface choice; it does not mean the block body stores only hashes.

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.

06 / INPUT, OUTCOME, STATE

Three roots commit to inputs, outcomes, and the new world

All three look like 32-byte hexadecimal strings, but each answers a different question.

INPUT

transactionsRoot

Commits to the complete ordered transaction sequence. Replace one transaction, alter one byte, or change the order, and the root changes.

OUTCOME

receiptsRoot

Commits to transaction-receipt results, including status, cumulative gas, logs bloom, and event logs.

WORLD

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.

transactionsRoot0x8b31…e907
branch Ahash(node 00 + 01)
branch Bhash(node 02 + 03)
rlp(0) → tx₀Alice → Bob
rlp(1) → tx₁Carol → Contract
rlp(2) → tx₂Dave → Erin
rlp(3) → tx₃Frank → DAO
Figure 06 · A simplified transaction-commitment path The real execution layer uses a Merkle-Patricia Trie, not this tidy binary tree. The essential relationship remains: a leaf or index change propagates upward and changes the root.

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.

07 / THE FINGERPRINT CHAIN

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.

execution_block_hash = Keccak-256( RLP( execution_header ) ) This is the mainnet execution-layer rule as of July 2026; a future protocol upgrade could still change the serialization scheme.

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.

Interactive 03
Ordered transactions tx₀: A→B 2 ETH
tx₁: C→D 1 ETH
transactionsRoot 0x4f21…7b8c
blockHash 0xa903…12ef
next.parentHash 0xa903…12ef

Teaching fingerprint: The displayed values are deterministic abbreviations that make propagation easy to observe, not real Keccak-256 calculations.

Figure 07 · The change-propagation chain Even if two orderings happen to produce the same final balances, the transaction root still differs because the input sequence differs.

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.

08 / VERIFY, DO NOT TRUST

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.

Receive the beacon block and sidecarsParse the signed block and consensus operations; fetch and verify the data-column sidecars required for custody and sampling.
Check the consensus shellVerify slot, proposer, BLS signature, parent_root, and the consensus-state transition.
Hand off to the execution clientProvide the execution payload, parent beacon root, blob hashes, and execution requests.
Check header constraintsVerify parent hash, block number, timestamp, gas, base fee, and fixed PoS fields.
Check every transactionVerify canonical encoding, signature, chain ID, nonce, balance, and fee caps.
Replay execution in orderRun the EVM, process system calls, withdrawals, and requests, and accumulate gas and logs.
Recompute committed and derived fieldsRebuild transaction, receipt, state, withdrawal, and request roots; recompute logs bloom, gas totals, and the block hash.
Enter consensus selectionOnce locally valid, fork choice determines the head and finality determines when it becomes stable.
Figure 08 · Validation is not “download, then trust” Independent clients implement the same specification and should derive the same result from the same input. That is the basis for mutual verification in a multi-client network.
LEVEL 01

Valid

Structure, signatures, execution, and every commitment follow the protocol. Multiple valid branches may exist at once.

LEVEL 02

Canonical

Fork choice currently treats this branch as the chain head; blocks near the head can still undergo a short reorganization.

LEVEL 03

Finalized

The protocol has finalized a checkpoint through supermajority validator attestations; it will not revert under normal protocol conditions.

09 / A LIVING DATA STRUCTURE

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.

  1. Base fee Added base_fee_per_gas so the fee market adjusts automatically with block congestion.
  2. Move to PoS Fixed difficulty and nonce; emptied ommers; reinterpreted mixHash as prev_randao.
  3. Validator withdrawals Added withdrawals to the body and withdrawals_root to the header.
  4. Blobs and a cross-layer root Added blob-gas fields and parent_beacon_block_root.
  5. Execution requests Added requests_hash; the consensus body carries execution_requests.
  6. PeerDAS Changed blob-data propagation and sampling; the current execution header still has 21 fields.
Figure 09 · Header fields are the growth rings of protocol history As of July 2026, Glamsterdam remains a planned future upgrade; the not-yet-active block access list field is not part of the current mainnet header.

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.

10 / THE COMPLETE MENTAL MODEL

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.

Myth 01

“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.

Myth 02

“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.

Myth 03

“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.

Myth 04

“The validator supplies an approximate timestamp”

False. A PoS execution-payload timestamp is derived exactly from genesis_time and the current slot.

Myth 05

“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.

Myth 06

“A correct hash means the block is finalized”

False. Validity checks, fork choice, and finality are three separate stages.

BATCH
A block fixes a set of inputs and their strict order.The transaction pool is only a candidate set; ordering is required before execution can yield one result.
OUTER
The beacon block supplies the consensus shell.Slot, proposer, parent root, consensus state, and signature answer “Which history does the network recognize?”
INNER
The execution payload supplies the execution core.Ordered transactions, withdrawals, and header context answer “How does state change?”
ROOTS
Transaction, receipt, and state roots commit to inputs, outcomes, and the new world.Nodes rebuild structures and replay transactions instead of trusting the producer.
LINK
Block hashes and parent hashes link execution history end to end.If old content changes, the fingerprint mismatch is exposed along successor parent_hash links.
FINAL
Cryptographic commitments expose differences; consensus selects and finalizes history.Valid, canonical, and finalized are three distinct states.
11 / CHECK YOUR MODEL

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.

12 / TERMS & PRIMARY SOURCES

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

  1. ethereum.org — BlocksWhy blocks batch transactions, slots and empty slots, plus an introduction to beacon blocks and execution payloads.
  2. Ethereum Execution Specs — BPO2 Block and HeaderThe current execution block body and 21-field header specification as of this lesson’s publication.
  3. Ethereum Consensus Specs — Fulu Beacon ChainCurrent consensus structures, the execution payload, slot time, and validation conditions.
  4. ethereum.org — Recursive Length Prefix serializationExecution-layer RLP rules and deterministic representation.
  5. ethereum.org — Simple SerializeConsensus-layer SSZ serialization and hash_tree_root.
  6. ethereum.org — Merkle Patricia TrieThe data structure underlying execution-layer state, transaction, and receipt roots.
  7. EIP-2718 — Typed Transaction EnvelopeThe typed transaction envelope and rules for placing transactions and receipts into their tries.
  8. EIP-3675 — Upgrade consensus to Proof-of-StakeHow PoS changed ommers, difficulty, nonce, and execution-layer reward semantics.
  9. EIP-4399 — PREVRANDAOHow the former mixHash field carries beacon-chain randomness after PoS.
  10. EIP-4895 — Beacon chain push withdrawalsThe withdrawal list and withdrawals_root.
  11. EIP-4844 — Shard Blob TransactionsBlob-gas header fields, versioned hashes, and the sidecar boundary.
  12. EIP-4788 — Beacon block root in the EVMHow parent_beacon_block_root enters the execution header.
  13. EIP-7685 — General purpose execution layer requestsThe addition of requests_hash and commitments to execution requests.
  14. ethereum.org — FusakaPeerDAS, data availability, and execution-block size boundaries in the current upgrade.