Problems

What breaks first, second, and last.

A taxonomy of the failure modes that show up before 10× — many of them already visible at 3×.

1. Trie depth and IO amplification

Each account access traverses an MPT path whose expected depth is

E[d]log16(n)\mathbb{E}[d] \approx \log_{16}(n)

for nn accounts. Mainnet today is n=3.81 ⁣× ⁣108n = 3.81\!\times\!10^8 accounts with avg path depth 7.61 nibbles (measured 2026-05-05). Going to 10n10n adds only one nibble of depth on average. The problem isn’t depth — it’s that each level is a random read into a snapshot DB whose LSM levels have already overflowed page cache.

2. Witness inflation

Account proof size is the path length times the per-level RLP cost. Empirically:

proofacc(n)c0+c1log16(n)\text{proof}_{\text{acc}}(n) \approx c_0 + c_1 \cdot \log_{16}(n)

with c1530c_1 \approx 530 bytes per nibble (sibling hashes + RLP framing). Measured mainnet account proofs come in at p50 = 3,821 B / p95 = 3,929 B (sample of 2,755 unique addresses at head 24,935,360). The log-16 model predicts that 10× pushes p95 to ~4,370 B — uncomfortable but tractable. Two places where it bites:

  • Light clients that download proofs over slow links.
  • Stateless block validation, where a single block’s witness is the sum of all account and storage proofs touched.

3. Snap sync stability

Snap sync transfers the state by ranges of leaves and reconstructs the trie locally. Two problems show up only at scale:

  • Range churn: as the source node’s state mutates during the sync, ranges have to be refetched. At 10× mainnet the steady-state mutation rate dominates the catch-up rate unless the bandwidth budget is increased.
  • Heal phase divergence: the final “fix the gaps” stage stops being negligible. At 10× we observe healing tails that exceed the bulk phase on slower disks.

4. Storage trie pathology

Mainnet has thousands of contracts with deep, sparse storage tries (DEX pools, NFT mappings). The measured slot-per-contract distribution is sharply long-tailed: ~87 % of contracts own just 1–3 slots, with a tiny tail of ~4k contracts holding 16k+ slots each — and dominating total storage bytes. The 5× state preserves that exact shape, because it was rebloated to match mainnet’s composition. A Pareto model with α<1\alpha < 1 fits well enough for intuition, but the empirical histogram is the truth we hold the bloater to — plotted (mainnet vs 5×) on the Results page.

5. Memory pressure on the trie cache

Modern clients keep a trie node cache in RAM (Nethermind: clean cache + dirty memory; Geth: trie cache). The hit rate is roughly

H1(1cachelive nodes)kH \approx 1 - \left(1 - \frac{|\text{cache}|}{|\text{live nodes}|}\right)^{k}

for kk trie hops per block. Instrumented Nethermind reports account-proof cache hit rate of ~100 % and storage-proof cache hit rate of 94.9 % mean / 99.1 % p95 on mainnet (sample at head 24,954,458). That headroom is what disappears first as state grows — and the moment hits drop below ~90 %, a single miss is a ~200 µs disk seek inside the EVM hot loop.


The point of running the experiment at every multiplier — not just at 10× — is that each of these failure modes has a different knee, and you only see the staircase if you have points on every step.