Part III · Chapter 26 of 43 · Paris · The Merge

EIP-3675: swapping Ethereum's engine mid-flight

Proof of work secured Ethereum by burning energy — security was hashpower. The Merge replaced that engine with proof of stake while keeping the exact same EVM, accounts, and history. The trick: don't bootstrap PoS in place. Run it on a separate beacon chain first, then hand the steering wheel over at a fixed difficulty.

Updated Jun 23, 2026 · 12 min
Assumed
  • proof of work basics
  • blocks & fork choice

The Merge is often described as “Ethereum switched to proof of stake,” which undersells how delicate it was. Imagine replacing a plane’s engine in flight, without the passengers — the EVM, every account, the entire transaction history — noticing a bump. The hard constraint of EIP-3675 is exactly that: change how blocks are agreed while keeping everything blocks contain byte-for-byte identical. You can’t just flip proof of work to proof of stake in one fork and hope the new security holds. Let’s derive how it was actually done.

1 step Security as burned energy

The problem: paying for security in electricity

Under proof of work A consensus rule where producing a valid block requires finding a nonce that makes the block hash fall below a target. The only way is to try enormous numbers of nonces, so block production costs real computation — and thus electricity. , every miner races to guess a nonce that makes their block hash small enough. The only strategy is to try astronomically many guesses, so the chain’s security is literally proportional to how much hashing — and therefore how much electricity — is being spent. To attack the chain you’d need to out-hash everyone, which is expensive; but honest security costs the same energy, paid forever, plus issuance to reward miners and a creeping centralization toward whoever has the cheapest power and hardware.

proof of work — race to guess a nonce, burning energy miner A nonce 0x9c4a nonce 0x1f7e miner B nonce 0x3a12 nonce 0x8b03 miner C nonce 0x77ec nonce 0x2d99 energy spent ⚡ always climbing — spent, never returned first valid hash wins — security = hashpower more security = more hashpower: energy, centralization, issuance
In proof of work, miners burn energy racing to guess a nonce; the first to a valid hash wins the block. Security scales with total hashpower — which means continuous electricity, issuance to pay miners, and centralization toward cheap power.

We want to keep the chain’s contents — the EVM, accounts, balances, contract code, the whole history — and replace only the engine that decides which block comes next, swapping “burn energy to win” for “stake ETH and get slashed if you cheat.”

→ Step 2: build the new engine off to the side first.

2 step Run PoS in parallel

Don’t bootstrap in place — run a beacon chain alongside

The cold-start problem is solved by not starting cold. Launch the proof-of-stake system as a separate chain — the beacon chain A standalone proof-of-stake chain launched in December 2020. It ran validators, attestations, and finality with no user transactions and no EVM — purely to grow a staked validator set and prove the consensus worked before it took over. — well ahead of time. Starting in December 2020, it ran proof of stake for real: validators deposited 32 ETH, produced and attested to beacon blocks, and exercised finality — but those blocks carried no execution payload. No EVM, no user transactions, just consensus, accruing a large, battle-tested validator set and stake while the PoW chain kept doing the actual work.

first, run PoS alongside — proving it works beacon chain PoS · no payload slot 1 slot 2 slot 3 slot 4 execution chain PoW blk 1 blk 2 blk 3 blk 4 the beacon chain (Dec 2020) ran PoS in parallel, accruing validators & finality
The beacon chain ran proof of stake in parallel from December 2020 — validators, attestations, and finality — but its blocks had no execution payload. Meanwhile the original chain kept producing blocks under proof of work. Two chains, side by side.

By the time of the Merge, proof of stake wasn’t an experiment switched on under load — it had nearly two years and millions of staked ETH behind it. All that remained was to connect the two: let the proven PoS chain start choosing the execution blocks.

→ Step 3: pick a finish line miners can’t fake.

3 step The TTD handoff

Hand off at the Terminal Total Difficulty

You need a switchover point no one can rush or stall. A block height could be skipped or contested; instead, use accumulated work. Every PoW block adds its difficulty to a running total difficulty, and the Merge fires at a pre-agreed Terminal Total Difficulty A fixed cumulative-difficulty threshold (the TTD). The first block whose total difficulty crosses it is the last PoW block; from there the beacon chain's fork-choice decides the head. Because it's based on accumulated work, it can't be skipped or faked. (the TTD). The first block to cross it is the last block mining ever decides. From the next block on, the beacon chain’s fork-choice (LMD-GHOST for the head, Casper FFG for finality) picks the canonical chain. And the now-meaningless proof-of-work header fields are neutralized: difficulty and nonce go to 0, the ommers/uncles list is emptied, the old mixHash slot is repurposed to carry prevRandao (the beacon chain’s randomness), and the block mining reward becomes 0 — issuance moves entirely to the consensus layer.

the TTD is an accumulated-work line — it can't be rushed or faked total difficulty — each PoW block adds to it TTD ✓ TTD crossed — mining stops, hand off last PoW block difficulty → 0 first PoS block beacon fork-choice picks the head mixHash → prevRandao · nonce → 0 · reward → 0 same chain, same state — only how the head is chosen changes
At the Terminal Total Difficulty the last mined block hands off: from there the beacon-chain fork-choice picks the head. The vestigial PoW header fields are zeroed — difficulty and nonce to 0, ommers emptied, block reward to 0 — and mixHash is reused to carry prevRandao.

→ Step 4: wire the engine to the driver.

4 step Engine API loop

The execution layer becomes an engine the CL drives

After the Merge, your node is really two programs: a consensus-layer client (the beacon node) and an execution-layer client (the old Geth/Nethermind/etc.), talking over a private, authenticated Engine API The internal JSON-RPC interface between the consensus and execution clients. The CL uses it to feed the EL blocks to execute and to tell it which head to build on; the EL replies VALID or INVALID. Users never call it. . The consensus layer drives; the execution layer executes. The CL asks the EL to run a block with engine_newPayload — the EL executes the transactions, applies the state transition, and answers VALID or INVALID — and uses engine_forkchoiceUpdated to set the canonical head and, when this validator is the proposer, to start building the next payload. The CL then attests and finalizes. The EVM never changed; it just took a new boss.

the CL drives the EL over the Engine API consensus layer propose · attest · finalize execution layer execute & validate engine_newPayload → execute & validate engine_forkchoiceUpdated → set head / build ← VALID, then the CL finalizes issuance & security now come from staking, not mining
The consensus layer drives the execution layer over the Engine API: engine_newPayload asks the EL to execute and validate a block (it replies VALID), engine_forkchoiceUpdated sets the head and triggers building. The CL proposes, attests, and finalizes; the EL just runs the EVM.
04 Go Deeper Where to take it from here