On 2026-11-15 at 01:50 UTC, every node in this sample was at the reference head or within 2 blocks of it, except one reth-xdc node on Apothem. All four xOne clients answered the RPC sample with whole JSON equal to the reference, 50 of 50. The core fields were equal on every node. The differences on other clients are in the JSON shape only.
Measured read-only on 2026-11-15 at 01:50 UTC by the xOne team on its own follower nodes; one sample, not a time series. Source: xOne team measurement, 2026-11-15 01:50 UTC (read-only; there is no file link). This post also corrects a row of the 2026-11-14 measurement. See the correction below.
How did we measure?
The method is the same as in the 2026-11-14 posts. We called eth_blockNumber on each node. Head lag is the reference head minus the node head, read at the same second. The reference is a geth-XDC node of the same network.
- Reference heads: net2040 846,739. Apothem 85,396,805. The net2040 reference runs full sync. The Apothem reference runs snap sync.
- Datadir:
du -sx --block-size=1of the datadir. - Memory: VmRSS of the main process, from
/proc. VmRSS includes mapped files, such as an MDBX or RocksDB map. xOnePy runs extra worker processes that we did not count. - RPC sample: 50 calls per node, made against the node and the reference. They were 30
eth_getBlockByNumber(n,false)for n = head-130 to head-101, 10eth_getBlockTransactionCountByNumberfor the last 10 of those, and 10eth_getBlockByHash(hash,false)for the first 10 hashes. We compared the whole JSON after we lowercased strings. - Core fields: hash, parentHash, stateRoot, receiptsRoot, transactionsRoot, number, miner, gasUsed and timestamp. "40/40" means the core fields were equal in all 40 block objects of the sample.
In the tables, a - before a key means the node does not return that key. A + means the node adds a key. A ~ means the key is present and its value differs from the reference. The number in brackets counts the calls that showed the difference.
What did the net2040 nodes show?
On net2040, 20 of 22 nodes were at the reference head, and two nodes were 2 blocks behind. The sync or pruning mode of each node is in its name. Compare a node only with nodes of the same mode.
| Node | Head | Lag | Datadir bytes (GB) | VmRSS kB | RPC whole-JSON equal | Core fields | Differing keys (count of calls) | Version (xOne nodes) |
|---|---|---|---|---|---|---|---|---|
| geth-XDC full (reference) | 846,739 | 0 | 62,825,099,264 (62.83) | 1,143,200 | reference | - | - | - |
| xOneRS full | 846,739 | 0 | 20,647,587,840 (20.65) | 277,104 | 50 of 50 | 40/40 | none | xOne/v0.1.0-fc9a8e9e-13112026 (Rust, pre-rename stamp) |
| xOneRS archive | 846,739 | 0 | 22,794,932,224 (22.79) | 592,888 | 50 of 50 | 40/40 | none | xOneRS/v0.1.0-fa3edb8e-14112026 |
| xOneRS full (second node) | 846,739 | 0 | 20,713,545,728 (20.71) | 642,028 | 50 of 50 | 40/40 | none | xOne/v0.1.0-8fe27572-12112026 (Rust, pre-rename stamp) |
| xOneRS fast | 846,739 | 0 | 157,687,808 (0.16) | 209,856 | 50 of 50 | 40/40 | none | xOne/v0.1.0-8fe27572-12112026 |
| xOneRS minimal | 846,739 | 0 | 157,683,712 (0.16) | 228,256 | 50 of 50 | 40/40 | none | xOne/v0.1.0-8fe27572-12112026 |
| xOneTS full | 846,739 | 0 | 19,576,348,672 (19.58) | 327,716 | 50 of 50 | 40/40 | none | xOneTS/v0.1.0-dfdb1d62-13112026 |
| xOnePy snap | 846,737 | 2 | 105,467,904 (0.11) | 129,636 | 50 of 50 | 40/40 | none | xOnePy/v0.1.1-93656365-14112026 |
| xOnePy minimal | 846,739 | 0 | 105,508,864 (0.11) | 130,904 | 50 of 50 | 40/40 | none | xOnePy/v0.1.1-93656365-14112026 |
| xOneC full | 846,739 | 0 | 18,000,916,480 (18.00) | 243,284 | 50 of 50 | 40/40 | none | xOneC/v0.1.0-706c5f75-14112026 |
| xOneC archive | 846,739 | 0 | 22,228,770,816 (22.23) | 695,552 | 50 of 50 | 40/40 | none | xOneC/v0.1.0-706c5f75-14112026 |
| xOneC snap | 846,739 | 0 | 153,411,584 (0.15) | 100,020 | 50 of 50 | 40/40 | none | xOneC/v0.1.0-706c5f75-14112026 |
| xOneC minimal | 846,739 | 0 | 153,292,800 (0.15) | 93,168 | 50 of 50 | 40/40 | none | xOneC/v0.1.0-706c5f75-14112026 |
| reth-xdc archive | 846,739 | 0 | 12,064,657,408 (12.06) | 2,872,320 | 19 of 50 | 40/40 | -withdrawals (31), ~size (31) |
- |
| besu-xdc full (Bonsai) | 846,739 | 0 | 10,852,577,280 (10.85) | 865,044 | 10 of 50 | 40/40 | -validator (40), -validators (40), +totalDifficulty (40), -penalties (40) |
- |
| nethermind-xdc A (memory pruning) | 846,739 | 0 | 7,397,142,528 (7.40) | 911,640 | 10 of 50 | 40/40 | -blockAccessListHash (40), -validator (40), -parentBeaconBlockRoot (40), ~size (40), -validators (40), +totalDifficulty (40), -excessBlobGas (40), -penalties (40) |
- |
| nethermind-xdc B (memory pruning) | 846,739 | 0 | 7,359,434,752 (7.36) | 911,964 | 10 of 50 | 40/40 | -blockAccessListHash (40), -validator (40), -parentBeaconBlockRoot (40), ~size (40), -validators (40), +totalDifficulty (40), -excessBlobGas (40), -penalties (40) |
- |
| nethermind-xdc C (memory pruning) | 846,739 | 0 | 7,416,307,712 (7.42) | 920,424 | 10 of 50 | 40/40 | -blockAccessListHash (40), -validator (40), -parentBeaconBlockRoot (40), ~size (40), -validators (40), +totalDifficulty (40), -excessBlobGas (40), -penalties (40) |
- |
| reth-xdc full | 846,739 | 0 | 8,041,000,960 (8.04) | 1,656,132 | 12 of 50 | 40/40 | -withdrawals (38), ~size (38) |
- |
| besu-xdc snap (Bonsai) | 846,737 | 2 | 5,991,993,344 (5.99) | 1,400,620 | 10 of 50 | 40/40 | -validator (40), -validators (40), +totalDifficulty (40), -penalties (40) |
- |
| nethermind-xdc archive | 846,739 | 0 | 11,378,438,144 (11.38) | 1,091,108 | 10 of 50 | 40/40 | -blockAccessListHash (40), -validator (40), -parentBeaconBlockRoot (40), ~size (40), -validators (40), +totalDifficulty (40), -excessBlobGas (40), -penalties (40) |
- |
| nethermind-xdc full (hybrid) | 846,739 | 0 | 7,565,754,368 (7.57) | 726,048 | 10 of 50 | 40/40 | -blockAccessListHash (40), -validator (40), -parentBeaconBlockRoot (40), ~size (40), -validators (40), +totalDifficulty (40), -excessBlobGas (40), -penalties (40) |
- |
The two xOne nodes with the Rust stamp xOne/v0.1.0 use the stamp from before the repository was renamed. The xOnePy snap node and the besu-xdc snap node were 2 blocks behind at this second. One sample does not show whether that lag is steady.
What did the Apothem nodes show?
On Apothem, 9 of 10 nodes were at the reference head. The reth-xdc node in minimal mode was 48,814 blocks behind, in this one sample.
| Node | Head | Lag | Datadir bytes (GB) | VmRSS kB | RPC whole-JSON equal | Core fields | Differing keys (count of calls) | Version (xOne nodes) |
|---|---|---|---|---|---|---|---|---|
| geth-XDC snap (reference) | 85,396,805 | 0 | 154,200,936,448 (154.20) | 6,230,912 | reference | - | - | - |
| xOneRS snap | 85,396,805 | 0 | 75,208,540,160 (75.21) | 640,668 | 50 of 50 | 40/40 | none | xOneRS/v0.1.0-385a8190-dirty-14112026 |
| xOnePy snap | 85,396,805 | 0 | 31,220,367,360 (31.22) | 166,928 | 50 of 50 | 40/40 | none | xOnePy/v0.1.1-00000000-00000000 (build has no git data; a follower, not a release) |
| xOneC snap | 85,396,805 | 0 | 52,621,656,064 (52.62) | 14,054,512 | 50 of 50 | 40/40 | none | xOneC/v0.1.0-edf2ebe3-14112026 |
| reth-xdc full | 85,396,805 | 0 | 161,688,154,112 (161.69) | 12,986,632 | 50 of 50 | 40/40 | none | - |
| besu-xdc snap (Bonsai) | 85,396,805 | 0 | 29,895,348,224 (29.90) | 2,308,348 | 10 of 50 | 40/40 | -validator (40), -validators (40), +totalDifficulty (40), -penalties (40) |
- |
| nethermind-xdc hybrid | 85,396,805 | 0 | 23,731,429,376 (23.73) | 2,101,236 | 10 of 50 | 40/40 | -validator (40), ~size (40), -validators (40), +totalDifficulty (40), -penalties (40) |
- |
| xOneGo snap (earlier Go line, not one of the four clients) | 85,396,805 | 0 | 9,875,460,096 (9.88) | 1,192,856 | 10 of 50 | 40/40 | ~size (40) |
xOne/v1.1.0/linux-amd64/go1.25.0 (xOneGo, the earlier Go line, not xOneRS) |
| reth-xdc minimal | 85,347,991 | 48,814 | 123,737,636,864 (123.74) | 5,644,884 | 50 of 50 | 40/40 | none | - |
| nethermind-xdc hybrid (second node) | 85,396,805 | 0 | 23,758,204,928 (23.76) | 2,071,564 | 10 of 50 | 40/40 | -validator (40), ~size (40), -validators (40), +totalDifficulty (40), -penalties (40) |
- |
| erigon-xdc minimal | 85,396,805 | 0 | 92,570,689,536 (92.57) | 3,565,812 | 50 of 50 | 40/40 | none | - |
The xOneGo row is the node that the 2026-11-14 measurement labelled as xOneRS. See the next sections.
What changed since the 2026-11-14 measurement?
Two things changed: erigon-xdc caught up, and one row label is corrected.
Did erigon-xdc catch up?
Yes. The erigon-xdc node on Apothem was re-syncing from block 0 at 2026-11-14 19:20 UTC. At 19:44 UTC it was 9,120 blocks behind. At 19:57 UTC its RPC refused calls. At 2026-11-15 01:50 UTC its head was 85,396,805, equal to the reference, with lag 0. Its whole JSON was equal to the reference in 50 of 50 calls, and its core fields were equal in 40 of 40 block objects. This node is 50 of 50 equal. See xOne against erigon-xdc, which was written when the node could not be measured.
What is the correction about the xOneGo row?
We labelled a node on Apothem as "xOneRS snap (second node)" in the 2026-11-14 measurement. That label was wrong. The node reports web3_clientVersion xOne/v1.1.0/linux-amd64/go1.25.0. It is an xOneGo node. xOneGo is the earlier Go line, and it is not one of the four clients (xOneRS, xOneTS, xOnePy, xOneC). It is not xOneRS.
We are correcting the earlier posts that used that row. They are Apothem follower, disk planning, xOne vs reth-xdc, xOne vs besu-xdc, xOne vs nethermind-xdc and xOne vs erigon-xdc. Do not use its datadir or memory values as xOneRS values.
In this sample, the xOneGo node answered the RPC sample. Its size value differs from the reference in 40 of 40 block objects. Its core fields are equal. Its whole JSON is equal in 10 of 50 calls.
How does the JSON differ between clients?
The core fields are equal on every node. The differences are in which keys the block JSON contains, and in the size value. This is what each JSON contains compared with the reference:
| Node | Difference from the reference JSON |
|---|---|
| xOneRS, xOneTS, xOnePy, xOneC | None. Whole JSON equal in 50 of 50 calls. |
| erigon-xdc (Apothem) | None. Whole JSON equal in 50 of 50 calls. |
| reth-xdc (Apothem) | None. Whole JSON equal in 50 of 50 calls. |
| reth-xdc (net2040) | No withdrawals key. The size value differs. |
| besu-xdc | No validator, validators or penalties keys. Adds totalDifficulty. |
| nethermind-xdc (Apothem) | No validator, validators or penalties keys. Adds totalDifficulty. The size value differs. |
| nethermind-xdc (net2040) | The same as on Apothem, and also no parentBeaconBlockRoot, excessBlobGas or blockAccessListHash keys. |
| xOneGo (Apothem) | The size value differs. |
We compare each node with the geth-XDC reference (xOne against geth-XDC). We did not test whether a missing key affects any tool. For the full RPC surface of xOne, see RPC surface.
What did we not measure?
- A time series. This is one sample. The series so far has five samples. See below.
- RssAnon and RssFile. We read VmRSS only. VmRSS counts mapped files, so compare it only between nodes of the same client and mode.
- Datadir across modes. An archive, full, snap, fast and minimal node keep different data. Do not compare datadir sizes across modes. See sync modes and hardware and disk.
- Other RPC methods. We called three methods, on recent blocks only.
- erigon-xdc on net2040. This sample has no erigon-xdc node on net2040.
- Lag over time. The lag of the reth-xdc minimal node on Apothem is one value at one second.
What are the series timestamps?
The series of fleet samples, all UTC:
- 2026-11-14 19:20
- 2026-11-14 19:33
- 2026-11-14 19:44
- 2026-11-14 19:57
- 2026-11-15 01:50
To choose a client, read which xOne client.
Frequently asked questions
Are all four xOne clients equal to the reference?
In this sample, yes. Every node of the four xOne clients gave whole JSON equal to the reference in 50 of 50 calls, with core fields equal in 40 of 40 block objects.
Did erigon-xdc catch up on Apothem?
Yes. At 2026-11-15 01:50 UTC its head was 85,396,805, equal to the reference. Its whole JSON was equal in 50 of 50 calls.
Which node is the xOneGo row?
It is the Apothem node earlier labelled "xOneRS snap (second node)". It reports xOne/v1.1.0/linux-amd64/go1.25.0. It is an xOneGo node, not xOneRS, and the earlier posts that used the row are being corrected.
Why do besu-xdc and nethermind-xdc show 10 of 50 equal?
Their block JSON has different keys from the reference. Only the 10 transaction-count calls matched. Their core fields were equal.
Sources
- xOne team measurement, 2026-11-15 01:50 UTC (read-only, one sample; no file link)
- xOne team measurement, 2026-11-14 19:20 UTC (read-only, one sample; no file link), corrected here for one row
- xOne against erigon-xdc
- xOne against geth-XDC
- Apothem follower
- Disk planning
- xOne against reth-xdc
- xOne against besu-xdc
- xOne against nethermind-xdc
This article describes the source and evidence at its review date. Check the linked repository for current implementation and qualification status.
Explore the engineering evidenceEdit this page on GitHub opens the Markdown source (content/blog/fleet-snapshot-2026-11-15/index.md). GitHub may ask you to sign in. Report a correction opens a prefilled GitHub issue for this page.