GP5 · go-ethereum
XDPoS re-platformed onto modern go-ethereum. PBSS storage, snap sync, eth/68 wire protocol. The convergence target.
Canonical XDPoSChain for production. The modern Geth v1.17.3 re-baseline for the next chapter. The multi-client family — Erigon, Nethermind, Reth — in early development. Distributed as signed Docker images and reproducible source builds. No pre-built binary grid; pin a digest, or build from a tagged commit.
The official XDPoSChain client maintained by XinFinOrg. Runs every masternode, validator and the public RPC. Hard-forked from go-ethereum ~1.8.3, hardened through seven years of mainnet uptime. This is what you run today.
Maintenance release — test-logging compatibility fix plus version bump. Drop-in upgrade from v2.6.8. Verified syncing XDC mainnet (chain 50) and Apothem testnet (chain 51).
docker pull xinfinorg/xdposchain:v2.7.0docker run -d --name xdc -p 8545:8545 -p 30303:30303 -v xdc-data:/work xinfinorg/xdposchain:v2.7.0geth.ethereum.org/downloads ships an OS×arch matrix because the EF runs a build store. XDC distributes through Docker Hub digests and reproducible source builds — same content, different convention, no PGP .asc sidecars.
XDPoS re-platformed onto go-ethereum v1.17.3 — seven years of upstream engineering (PBSS, snap sync, modern wire protocol). Synced to head on XDC mainnet today; bit-exact consensus with canonical XDPoSChain. Not yet the production client — verify it yourself at /geth-compare.
First release of the modern Geth re-baseline; closes the Apothem fork-config alignment gap and the devnet (chain 5551) gas-used divergence. Driving the live new.xdcrpc.com endpoint that powers the Live Compare page.
# clone, check out the tag, build $ git clone https://github.com/XDCIndia/go-ethereum.git $ cd go-ethereum $ git checkout v334 # or: reset/integration-1.17.3 $ make geth $ ./build/bin/geth --xdc --datadir ~/.xdc --syncmode snap
The modern re-baseline is in parity verification: bit-exact state roots, receipts roots and block hashes confirmed against canonical XDPoSChain on mainnet. Until a tagged production release ships, run the legacy XDPoSChain v2.7.0 for any validator or revenue-bearing workload.
Every XDC client supports all three networks. Pick by chain ID at launch (--networkid <N>) or by Docker tag (:v2.7.0 for mainnet, :v2.7.0-testnet for Apothem).
| Network | Chain ID | RPC endpoint | Genesis hash | Status |
|---|---|---|---|---|
| Mainnet | 50 · 0x32 | rpc.xinfin.network new.xdcrpc.com (modern) |
0x4a9d…d6b1 | ● production |
| Apothem | 51 · 0x33 | erpc.apothem.network faucet: faucet.apothem.network |
0xbdea…0075 | ● testnet |
| Devnet | 5551 · 0x15AF | Client-team integration testing — modern-geth re-baseline parity work. | Internal · request access | ● dev only |
Provider URL is the only difference between networks. Mainnet: https://rpc.xinfin.network (chain 50). Apothem: https://erpc.apothem.network (chain 51). All XDC RPC endpoints expose standard JSON-RPC 2.0 — drop-in replacement for any Ethereum RPC URL in your tooling.
Pick the sync mode that matches your workload. Snap sync is only available on the modern Geth v1.17.3 re-baseline — it cuts mainnet bring-up from days to hours. The legacy XDPoSChain client supports full and archive only.
The legacy --syncmode light path (eth/63 LES) was removed in upstream Geth and is not supported on the modern re-baseline. For light-client use cases, query a hosted RPC (rpc.xinfin.network) instead of running a local light node.
Minimums for stable operation on XDC mainnet. SSD or NVMe is mandatory for any role — spinning disks cannot keep up with state-trie I/O. Disk numbers below are free space at install; grow buffer 30% beyond steady state.
30303/8545).eth_* JSON-RPC to dApps and wallets. PBSS + Pebble bring resource footprint down vs the legacy stack. Front with Cloudflare or nginx + rate-limit.erpc.apothem.network.The multi-client effort hardens XDC against client-monoculture risk — see /network-architecture for the rationale. Four implementations in active development; only XDPoSChain is production-ready today.
XDPoS re-platformed onto modern go-ethereum. PBSS storage, snap sync, eth/68 wire protocol. The convergence target.
Erigon's flat-key state model plus MDBX for high-throughput RPC and archive workloads. eth/62–63 protocol layer adapted to XDPoS.
Independent C# implementation. Adds runtime diversity (CLR vs Go) — the single most important hedge against a compiler-level mainnet halt.
Paradigm's Reth fork. Tokio async runtime, zero-copy MDBX reads, lowest RPC density at peak concurrency. The performance frontier.
github.com/XinFinOrg/XDPoSChain.
Both clients are pure Go — clone the repo, check out a release tag, run make. Requires Go ≥ 1.21, git, GNU make, and ~4 GB free RAM for the build.
$ git clone https://github.com/XinFinOrg/XDPoSChain.git $ cd XDPoSChain $ git checkout v2.7.0 $ make XDC $ ./build/bin/XDC version XDC Version: 2.7.0-stable Architecture: amd64 Go Version: go1.21.x
$ git clone https://github.com/XDCIndia/go-ethereum.git $ cd go-ethereum $ git checkout v334 # or: reset/integration-1.17.3 (tip) $ make geth $ ./build/bin/geth version | head -3 Geth Version: 1.17.3-stable Architecture: amd64
The Go toolchain produces deterministic binaries given identical inputs (Go version, dependency lockfile, source tag, build flags). Compare your local sha256sum ./build/bin/<name> against the published Docker image digest (docker inspect xinfinorg/xdposchain:v2.7.0 --format='{{.Id}}') for cross-verification.
XDC Innovation Labs publishes regular chaindata snapshots — pre-synced state at a recent block, ready to drop into your --datadir. Cuts mainnet bring-up from 6+ hours to ~30 minutes.
Filename convention: <host>-<net>-<mode>-<client-ver>-block<N>-<timestamp>.tar.zst
curl -O https://xdc.network/snapshots/xdc01-mainnet-snapfull2-pbss-1.17.3-stable-b12f4cad-block103103457-20260528-105256.tar.zsttar --use-compress-program=unzstd -xf xdc01-mainnet-*.tar.zst -C ~/.xdc/geth --datadir ~/.xdc --xdc --syncmode snapSnapshots are a convenience — your node still verifies every block header back to genesis after import. The snapshot only seeds the state-trie / chaindata; consensus integrity is independently checked. Pin to the snapshot's source server (TLS) and verify the post-import block hash against the canonical RPC's eth_getBlockByNumber(<block>).
XDC source is published from public GitHub repos with signed commits; container images are published to Docker Hub with content-addressable digests. Use the steps below before any production install.
| Artifact | Method | Command |
|---|---|---|
| Docker image | Pin by content-addressable sha256: digest | docker pull xinfinorg/xdposchain@sha256:<digest> |
| Image digest | Read from Docker Hub manifest | docker manifest inspect xinfinorg/xdposchain:v2.7.0 |
| Source tag | Verify the git tag belongs to a known maintainer | git tag -v v2.7.0 |
| Source commit | Inspect signed-commits trail on the release | git log --show-signature v2.7.0~3..v2.7.0 |
| Local build vs image | Diff your locally-built binary against the image's binary | docker run --rm xinfinorg/xdposchain:v2.7.0 sha256sum /usr/local/bin/XDC |
| Live RPC parity | Compare your fresh node against the canonical RPC | /geth-compare.html |
.asc) for each tarball alongside the build store. XDC currently relies on Docker Hub content-addressable digests plus git tag signatures rather than per-artifact PGP. If your operations require .asc equivalents, raise an issue at XinFinOrg/XDPoSChain/issues — tracked, not yet shipped.
Patterns for running an XDC node 24/7. Pick Docker Compose if you're already on Docker; pick systemd if you've built from source. Both restart on failure, persist data across restarts, and survive host reboots.
# docker-compose.yml services: xdc: image: xinfinorg/xdposchain:v2.7.0 container_name: xdc restart: unless-stopped ports: - "8545:8545" # JSON-RPC - "30303:30303" # p2p TCP/UDP - "30303:30303/udp" volumes: - xdc-data:/work healthcheck: test: ["CMD", "curl", "-sf", "http://localhost:8545", "-X", "POST", "-H", "content-type: application/json", "-d", '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'] interval: 30s timeout: 10s retries: 3 volumes: xdc-data:
docker compose up -d && docker compose logs -f xdc# /etc/systemd/system/xdc.service [Unit] Description=XDC node (geth v1.17.3 re-baseline) After=network-online.target Wants=network-online.target [Service] Type=simple User=xdc Group=xdc WorkingDirectory=/var/lib/xdc ExecStart=/usr/local/bin/geth \ --xdc \ --datadir /var/lib/xdc \ --syncmode snap \ --http --http.addr 127.0.0.1 --http.port 8545 \ --http.api eth,net,web3,txpool,XDPoS \ --metrics --metrics.expensive --pprof Restart=on-failure RestartSec=10s LimitNOFILE=65535 # hardening NoNewPrivileges=true ProtectSystem=strict ProtectHome=true PrivateTmp=true ReadWritePaths=/var/lib/xdc [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload && sudo systemctl enable --now xdcjournalctl -u xdc -f --since '5 minutes ago'curl -sX POST -H 'content-type:application/json' -d '{"jsonrpc":"2.0","method":"eth_blockNumber","id":1}' http://localhost:8545 | jqAfter your node syncs to head, run the same RPC calls against https://rpc.xinfin.network and your local http://localhost:8545 — block hash, state root and balance for a known address must match. The browser-based /geth-compare.html tool does this 16-method check across both sides in one click.
Tagged releases of the canonical XDPoSChain client. Older versions remain pullable from Docker Hub indefinitely. Pin a specific version with the v{X.Y.Z} tag.
Full tag list: Docker Hub · GitHub releases