Worked example · 2022-09
Ethereum PoW fork cross-chain replay — Ethereum / ETHPoW — September 2022
Summary
Ethereum's transition from proof-of-work to proof-of-stake ("The Merge") occurred on 2022-09-15 at block 15537393. A subset of miners and community members rejected the PoS transition and continued operating a proof-of-work fork under the original consensus rules, initially retaining the mainnet chain ID (1) and the ETH ticker (later rebranded to ETHW with chain ID 10001).
The two chains shared:
- Identical address space: every Ethereum mainnet address had a corresponding address on the PoW fork with the same private-key derivation, same balance at the fork block, and same nonce state at the fork block.
- Identical transaction format: the EVM transaction format, signature scheme (EIP-1559, legacy), and encoding are byte-for-byte identical on both chains.
- Identical chain ID (initially): the PoW fork retained chain ID 1 for a window after the fork, meaning an EIP-155-signed transaction with chain ID 1 was valid on both chains.
The replay surface:
User signs a transaction on Ethereum mainnet (e.g., a USDC transfer, an ETH transfer, a Uniswap swap, an NFT purchase). The transaction is signed with chain ID 1 and broadcast to the Ethereum mainnet mempool.
An observer replays the transaction on the PoW fork. The signed transaction — identical in every byte — is broadcast to the PoW fork's mempool. The PoW fork's nodes accept it because the chain ID matches, the nonce is valid (at the fork block, nonce states were identical), and the signature verifies against the sender's address (same key derivation).
The replayed transaction executes on the PoW fork. The sender's PoW-fork balance is debited, and the recipient receives PoW-fork ETH or tokens. The sender may not have intended to transact on the PoW fork at all — they signed a transaction for Ethereum mainnet, and the replay forced an unintended PoW-fork transaction.
The reverse replay is equally possible: a user transacting on the PoW fork can have their transaction replayed on Ethereum mainnet, potentially draining mainnet assets the user intended to preserve.
The replay surface was partially mitigated by:
- ETHPoW's chain-ID migration to 10001 — once the PoW fork adopted a distinct chain ID, EIP-155 signature verification rejected mainnet-signed transactions (chain ID 1) on the PoW fork (chain ID 10001), and vice versa.
- User-side replay protection — some users sent zero-value "replay-protection" transactions on one chain to increment their nonce beyond the nonce of any pending transaction on the other chain, creating a nonce-mismatch barrier.
- Protocol-level replay protection — protocols (stablecoin issuers, bridges, DEXes) deployed chain-ID-aware contracts on the PoW fork that rejected transactions with the wrong chain ID.
However, the window between The Merge (2022-09-15) and widespread chain-ID migration / user-side replay protection was non-zero, and opportunistic replay attacks were documented against unprotected users and protocols during that window.
Timeline
| When | Event | OAK ref |
|---|---|---|
| 2022-09-15 | Ethereum transitions to proof-of-stake (The Merge); ETHPoW fork emerges retaining chain ID 1 | T10.003 surface deployment |
| 2022-09 to 2022-10 | Opportunistic replay attacks documented; users and protocols deploy replay-protection measures | T10.003 cohort window |
| 2022-10 onward | ETHPoW migrates to chain ID 10001; cross-chain replay surface largely closed | T10.003 mitigation |
What defenders observed
- A chain fork without chain-ID migration is a cross-chain replay surface. The fork inherits the source chain's address space, nonce state, and chain ID — every transaction on one chain is structurally valid on the other.
- EIP-155 chain-ID binding is the canonical mitigation, but it requires the fork to adopt a distinct chain ID. Until the fork does so, the replay surface is open by construction.
- Nonce-based replay protection is a user-side partial mitigation — sending a transaction on one chain to advance the nonce beyond the replay target's nonce — but it requires user awareness and action.
What this example tells contributors writing future Technique pages
- T10.003 is not restricted to bridge-message replay. Chain-fork replay is a structurally identical primitive: an authorisation artefact (signed transaction or message) whose scope is not chain-bound. The Ethereum PoW fork replay window is the canonical chain-fork case study for T10.003.
- Chain-ID binding (EIP-155) is load-bearing at the chain-transaction layer, not only at the bridge-message layer. The ETHPoW replay window demonstrates that chain-ID binding is necessary whenever two chains share an address space — whether they are bridges, sidechains, or forks.
Public references
- Ethereum Foundation. "The Merge." 2022-09-15.
- ETHPoW / ETHW documentation — chain-ID migration to 10001.
- Cross-reference: T10.003 (Cross-Chain Replay) at
techniques/T10.003-cross-chain-replay.md.