Architecture geth v1.17.3 Live Compare Quantum Nodes The Gap Pain Points 7-Year Timeline Pain → Fix Disk Economics What's Preserved Evidence The Ask About Team Careers Blog Get in touch
The Setup

XDC's legacy client is a 2018 Geth fork

XDPoSChain (the canonical XDC client, v2.7.0) is a hard fork of go-ethereum ~1.8.3. It selectively backported the toolchain and EVM rules — but kept 2018-era state storage, sync, and networking. Upstream geth spent the next seven years rebuilding exactly those layers.

~7 yrs
Behind upstream
Geth 1.8.3 (2018) → 1.17.3
eth/63 → 70
Wire-protocol gap
7 versions of evolution
hash → PBSS
State storage
Unbounded → bounded
25 / 25
Claims verified
Primary sources, 0 refuted
!

This is the engineering "why" behind the multi-client effort

The Architecture page shows the live result — 4 independent clients on mainnet. This page is the deep rationale: precisely what modern geth delivers, sourced and verified, and how it maps to XDC operator pain today.

Current Pain Points

What the 2018 base costs operators

Seven compounding costs fall directly out of the legacy storage, sync, and networking architecture — higher infrastructure spend, slower and more fragile node operations, and accelerating maintenance risk.

P1 · STORAGE

Full nodes grow without bound

~919 GB and rising. The hash-scheme trie accumulates dead nodes and there's no online pruning (no snapshot → no prune-state), so operators must periodically resync to reclaim space.

Hits: every node operator, masternodes, RPC providers
P2 · SYNC

Initial sync takes days

Fast-sync only — state is fetched node-by-node by hash, millions of latency-bound round-trips. New masternode / RPC bring-up and recovery are painfully slow.

Hits: onboarding, disaster recovery
P3 · ARCHIVE

Archive nodes are ~2.5 TB & slow

The hash-scheme archive keeps every trie node ever written; reads walk the trie. Costly and high-latency for explorers, indexers, and analytics.

Hits: explorers, indexers, RPC providers
P4 · NETWORKING

Fragile, aging peering

eth/62–63 with no ForkID and no request IDs. The node can't cheaply reject wrong-fork peers and needs custom bridging to talk to modern clients.

Hits: reliability, engineering maintenance
P5 · DRIFT

~7 years of maintenance drift

The base predates every modern subsystem. Security backports are hard, new EIPs can't land cleanly, and developer mindshare is low — risk compounds the longer the gap persists.

Hits: security posture, ecosystem velocity
P6 · FEATURES

No modern data / history features

No EIP-4844 blobs, no era-file / EIP-4444 history expiry. No path to offload history or offer modern data availability.

Hits: future scalability, archive footprint
×

P7 · Execution internals stuck in 2018

Single-threaded code paths — no trie prefetcher, no parallel state hashing, LevelDB only. Lower throughput headroom under load than any modern client.

The 7-Year Timeline

What geth shipped, 1.8.3 → 1.17.3

Every version below is the first stable release that shipped the feature, verified against upstream git history and Ethereum Foundation release blogs. None of it exists in the XDC 2.7.0 base.

v1.9.0
Jul 2019

Freezer / ancients + ForkID (eth/64)

Cold blocks/receipts split into append-only flat files (~90k-block cutoff); EIP-2124 ForkID rejects incompatible peers at handshake.

Missing
v1.9.13
Feb 2020

State snapshot (flat layer)

O(1) account/storage reads and the foundation for snap sync.

Missing
v1.10.0
Mar 2021

Snap sync + offline pruning + eth/66 request IDs

Range-proof state download (snap default v1.10.4); request IDs match responses to requests.

Missing
v1.10.19
2022

eth/67 — drops GetNodeData

The prerequisite for PBSS: a node serving raw trie nodes by hash can't move to path-based keys.

Missing
v1.10.22
Sep 2022

The Merge (PoS) + Engine API

Internal PoW sealing retired (fully removed v1.14.0). XDC keeps XDPoS — adopts the cleanup, not the CL split.

N/A (XDPoS)
v1.11.0
Feb 2023

Pebble DB + eth/68

Actively-maintained DB engine (default v1.12.0) replacing the one-person LevelDB project.

Missing
v1.13.0
Sep 2023

Path-based state storage (PBSS)

Online pruning by default — bounded full-node state. Default for new full nodes in v1.14.0. The headline fix.

Missing
v1.13.12
Feb 2024

Era files (EIP-4444 path)

Exportable, compressible history — lets nodes offload ancient history.

Missing
v1.16.0 → v1.17.3
2025–26

eth/69 → eth/70

History-range advertisement (history-expiry-aware peering) and the latest wire protocol.

Missing
Pain → Fix

Each pain point maps to a shipped capability

The migration isn't speculative — every remedy is a feature already battle-tested on Ethereum mainnet, and now measured live on XDC mainnet. This is the heart of the case.

PainRemedy (upstream capability)First shippedOutcome
P1 node bloat + resyncPBSS + online pruningv1.13.0 / v1.14.0Full node stops growing; no resync
P2 days-long syncFlat snapshot + snap syncv1.9.13 / v1.10.0Fresh node to head in hours
P3 huge slow archivePBSS archive + era filesv1.13.0 / v1.13.12Smaller, flat O(1) reads
P4 fragile peeringForkID + request IDsv1.9.0 / v1.10.0Robust peering; no bridge hacks
P5 maintenance driftWithin 1 minor of upstreamongoingSecurity fixes + EIPs land; mindshare
P6 no modern featuresblobpool / 4844, era / 4444v1.12.1 / v1.13.12Optionality for blobs + history offload
P7 slow internalsTrie prefetch, parallel hashing, Pebblev1.10–v1.11Throughput headroom
Disk Economics

Why hash-scheme nodes grow — and PBSS bounds them

The single biggest operator win, now measured. A hash-scheme node accumulates dead trie nodes with no online pruning; the modern PBSS node keys nodes by path with a bounded, self-pruning history window — so the live-state portion stops growing.

919 GB
Legacy full node
and rising — needs resync
303 GB
Modern node — measured
281 GB freezer + ~22 GB live PBSS
~3×
Smaller on disk
synced to head · ~block 103.3M
bounded
PBSS live state
online-pruned, no resync
Where the bytes live — legacy hash scheme vs modern PBSS
Legacy (hash scheme) — ~919 GB full node
Ancients (frozen)
immutable · compressible
Live state (trie)
GROWS unbounded · dead nodes pile up →
Modern (PBSS, path scheme) — 303 GB, measured
Freezer (281 GB)
same + era-file offload
Live state (~22 GB)
BOUNDED · pruned online ✓
PBSS removes the prune-and-resync ritual — the live-state portion stays flat at ~22 GB

* Modern node 303 GB (281 GB freezer + ~22 GB live PBSS) is measured on an XDC mainnet production node synced to head (~block 103.3M, syncing = false, 24 peers). Legacy ~919 GB full / ~2.5 TB archive are the corresponding hash-scheme figures; geth's own docs cite a hash-scheme full node growing >650 GB at +14 GB/week (illustrating the mechanism).

What's Preserved

Consensus-neutral by construction

This is an engine-room swap, not a constitutional change. For any block, a migrated node must produce an identical post-state root, receipts root, and block hash to canonical XDC — a hard, harness-enforced constraint.

Nothing at the consensus layer changes

The migration adopts modern execution, storage, and sync underneath an unchanged XDPoS. Bit-exact parity is the release gate.

KEEP 01

XDPoS consensus

v1 (round-robin) and v2 (HotStuff-style BFT), QC/TC, epochs, masternode selection — unchanged.

KEEP 02

Internal block production

Masternodes seal blocks via XDC's own engine path. We do not adopt geth's external-CL / Engine-API model.

KEEP 03

Block & header RLP / hashes

Validators / Validator / Penalties fields, byte-exact encoding, genesis hashes — unchanged.

KEEP 04

Economics

Fixed 12.5 gwei base fee (no burn), TRC21 fee routing, rewards (90/10), penalties — unchanged.

KEEP 05

Chain identity

Chain IDs 50/51, genesis, fork schedule, system contracts 0x88/0x89/0x90unchanged.

GATE 06

Parity harness

Every consensus-touching change validated bit-exact vs canonical XDC — across normal blocks and fork boundaries.

Evidence Base

Fact-checked against primary sources

The technical claims on this page were verified by a deep-research pass — fan-out search, then adversarial 3-vote verification (a claim needed a majority of refutes to be killed).

24
Sources fetched
across 6 search angles
107 → 25
Claims → verified
top claims adversarially checked
25 / 0
Confirmed / killed
zero refuted
primary
Source quality
EIPs · devp2p spec · EF blogs
Verified claimSource
Freezer split: 79 GB ancients vs 60 GB LevelDB at block 7.77MEF blog v1.9.0 · geth docs
PBSS officially shipped v1.13.0, default for new full nodes v1.14.0EF blog v1.13.0 · v1.11.0 notes
Hash-scheme node >650 GB, +14 GB/week; PBSS prunes onlinegeth dbpruning docs
Snap sync: leaves + range proofs + healing; default v1.10.4geth sync-modes · devp2p snap
eth/67 dropping GetNodeData was the prerequisite for PBSSEIP-4938 · EF blog v1.13.0
ForkID (eth/64) rejects incompatible peers before block exchangeEIP-2124 / EIP-2364

Full citations and the code-ship-vs-feature-ship reconciliation are in the project's EVIDENCE-BASE doc (see PR below).

The Recommendation

Complete the migration to production

The work is already underway and de-risked: XDPoS has been re-based onto a pristine go-ethereum v1.17.3 base (branch reset/integration-1.17.3) and verified syncing mainnet to head with zero consensus divergence. The proposal is to finish it to a tagged production release, with the parity harness as the mandatory gate.

01

Approve completion

Finish the modern-geth line to a tagged production release with an operator migration path.

02

Parity harness as gate

Bit-exact state-root / receipts-root / block-hash parity on every consensus-touching change.

03

Resource mainnet + RPC parity

Validate mainnet across fork boundaries; close the documented RPC parity gaps.

Read the full proposal & evidence (PR #827) → ▶ Run the live RPC comparison → See the live multi-client result →
GP5
Go — go-ethereum
go-ethereum
Erigon
Go — Erigon v3
erigon-xdc
Nethermind
.NET 8 — C#
nethermind-xdc
Reth
Rust 2021
reth-xdc