Skip to content

Run a Parachain RPC Node

A parachain RPC node provides direct access to a specific parachain on the Polkadot network, enabling developers and applications to interact with its assets, governance, cross-chain messages, and more. Running your own node also supports essential infrastructure tasks, such as block indexing and compatibility with Polkadot SDK tools.

Through the parachain RPC (port 9944, serving both WebSocket and HTTP), your node acts as the bridge between the parachain and applications. This page walks through setting up a node from scratch, covering hardware requirements and deployment options using Docker or systemd.

RPC nodes serving production traffic require robust hardware:

  • CPU: 8+ cores; 16+ cores for high traffic
  • Memory: 64 GB RAM minimum; 128 GB recommended for high traffic
  • Storage: Total required storage is the size of the pruned relay chain state plus the size of the parachain state. Snapshots may be available. Fast NVMe I/O is critical for RPC query performance
    • Pruned Polkadot Relay Chain: ~40 GB using warp sync
    • System parachains:
      • Archive node (complete history): Using snapshots, expected storage requirements are:
        • Asset Hub: ~1.2 TB
        • People Chain: ~400 GB
        • Bridge Hub: ~400 GB
        • Coretime: ~200 GB
      • Pruned node (recent state): Snapshots are not available. A pruned node uses warp sync instead and requires far less disk space than an archive node.
    • Non-system parachains: Consult the parachain team or documentation
  • Network:
    • Public IP address
    • Stable internet connection with sufficient bandwidth
    • 1 Gbps connection for high traffic scenarios
    • Consider DDoS protection and rate limiting for production deployments
    • Open ports:
      • 30333: Parachain P2P over TCP, plus UDP for Web Real-Time Communication (WebRTC)
      • 30334: Relay chain P2P over TCP, plus UDP for WebRTC
      • 9944: Polkadot SDK RPC (WebSocket and HTTP)
      • 8545: Ethereum JSON-RPC (if running eth-rpc adapter)

Required software:

  • Operating system: Ubuntu 22.04 LTS (recommended) or similar Linux distribution
  • Docker: Required for obtaining binaries and running containers
  • rclone: (Optional but recommended) Command-line program for managing files on cloud storage

To run an RPC node for a parachain, you need its chain specification file. This JSON file defines the network parameters, genesis state, and bootnodes. The process for obtaining the chain spec may differ depending on whether you’re running a system parachain or a regular parachain.

Obtain the chain specification for your target system parachain using one of the following options:

Download the chain specification directly using curl. For example, to download the Asset Hub Polkadot chain spec:

Terminal window
curl -sL -o chain-spec.json \
https://paritytech.github.io/chainspecs/polkadot/parachain/asset-hub/chainspec.json

For other system parachains, find the correct URL in the Chainspec Collection under the List of Chainspecs.

For non-system parachains, check the parachain's documentation for official chain specification files.

Choose the deployment option that fits your project, and follow the steps in the appropriate tab to complete setup:

  • Docker: Best for simpler set up and maintenance
  • systemd: Best for production environments requiring more control

This guide uses Polkadot Asset Hub as an example. To set up a different parachain, replace the chain spec file, snapshot path, and chain name with the corresponding values for your target parachain.

System parachain details:

System ParachainPara IDChain Spec FileSnapshot Path
Asset Hub1000asset-hub-polkadot.jsonpolkadot-asset-hub-rocksdb-archive
People Chain1004people-polkadot.jsonpolkadot-people-rocksdb-archive
Bridge Hub1002bridge-hub-polkadot.jsonpolkadot-bridge-hub-paritydb-archive
Coretime Chain1005coretime-polkadot.jsonpolkadot-coretime-rocksdb-archive
  1. Download your parachain's chain specification as described in Obtain the Chain Specification.

  2. (Archive nodes only, optional but recommended) Download a pre-synced parachain snapshot to cut initial sync time from days to hours:

    1. Create a new directory:

      Terminal window
      mkdir -p my-node-data/chains/asset-hub-polkadot/db
    2. Download and save the archive parachain snapshot:

      Terminal window
      # Check https://snapshots.polkadot.io/ for the latest snapshot URL
      export SNAPSHOT_URL_PARACHAIN="https://snapshots.polkadot.io/polkadot-asset-hub-rocksdb-archive/INSERT_LATEST"
      rclone copyurl $SNAPSHOT_URL_PARACHAIN/files.txt files.txt
      rclone copy --progress --transfers 20 \
      --http-url $SNAPSHOT_URL_PARACHAIN \
      --no-traverse --http-no-head --disable-http2 \
      --inplace --no-gzip-encoding --size-only \
      --retries 6 --retries-sleep 10s \
      --files-from files.txt :http: my-node-data/chains/asset-hub-polkadot/db/
      rm files.txt
      rclone parameters
      • --transfers 20: Uses 20 parallel transfers for faster download
      • --retries 6: Automatically retries failed transfers up to 6 times
      • --retries-sleep 10s: Waits 10 seconds between retry attempts
      • --size-only: Only transfers if sizes differ (prevents unnecessary re-downloads)
  3. Launch the parachain node using the official Parity Docker image:

    Terminal window
    docker run -d --name polkadot-hub-rpc --restart unless-stopped \
    -p 9944:9944 \
    -p 9615:9615 \
    -p 30334:30334 \
    -p 30334:30334/udp \
    -p 30333:30333 \
    -p 30333:30333/udp \
    -v $(pwd)/chain-spec.json:/chain-spec.json \
    -v $(pwd)/my-node-data:/data \
    parity/polkadot-parachain:stable2609-1 \
    --name=PolkadotHubRPC \
    --base-path=/data \
    --chain=/chain-spec.json \
    --prometheus-external \
    --prometheus-port 9615 \
    --rpc-external \
    --rpc-port=9944 \
    --rpc-cors=all \
    --rpc-methods=safe \
    --rpc-max-connections=1000 \
    --state-pruning=archive \
    --blocks-pruning=archive \
    -- \
    --base-path=/data \
    --chain=polkadot \
    --sync=warp \
    --state-pruning=256 \
    --blocks-pruning=256 \
    --rpc-port=0

    Refer to the Port Mappings and Node Configuration Parameters sections for details on the command's configurations.

  • 9944: Polkadot SDK RPC endpoint (WebSocket/HTTP)
  • 9615: Prometheus metrics endpoint
  • 30333/30334: P2P networking ports. TCP carries regular peer connections. UDP on the same port numbers carries WebRTC connections, which full nodes accept by default on the litep2p network backend.
  • --rpc-external: Listens for RPC connections on all network interfaces instead of only on localhost. Combine it with --rpc-methods=safe and, for production, a reverse proxy with rate limiting.
  • --unsafe-rpc-external: Behaves like --rpc-external but skips the check that rejects external RPC access on validator nodes. An RPC node does not need it.
  • --rpc-cors=all: Allows all origins for CORS.
  • --rpc-methods=safe: Only allows safe RPC methods.
  • --sync=warp: Downloads the latest finalized state with a finality proof instead of executing every block since genesis. When --blocks-pruning is set to a number, the node then backfills only the headers and justifications of older blocks. Warp sync only applies when the database is empty and cannot be combined with --state-pruning=archive or --state-pruning=archive-canonical.
  • --state-pruning: archive keeps the state of all blocks, archive-canonical keeps the state of finalized blocks only, and [NUMBER] keeps the state of the last specified number of finalized blocks. Defaults to 256.
  • --blocks-pruning: archive keeps all block bodies, archive-canonical keeps the bodies of finalized blocks only, and [NUMBER] keeps the bodies of the last specified number of finalized blocks. Defaults to archive-canonical, so set a number explicitly on pruned nodes. Block headers are always kept.
  • --prometheus-external: Exposes metrics externally.
  • --: Separates parachain flags from relay chain flags. Flags after -- configure the embedded Polkadot relay chain node.

Monitor the node synchronization status:

Terminal window
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "system_syncState", "params":[]}' \
http://localhost:9944

When synchronization is complete, currentBlock will be equal to highestBlock:

curl -H "Content-Type: application/json" \ -d '{"id":1, "jsonrpc":"2.0", "method": "system_syncState", "params":[]}' \ http://localhost:9944
{
  "jsonrpc":"2.0",
  "id":1,
  "result":{
    "startingBlock":0,
    "currentBlock":3394816,
    "highestBlock":3394816
  }
}
  

Use the following commands to manage your node:

  • View node logs:

    Terminal window
    docker logs -f polkadot-hub-rpc
  • Stop container:

    Terminal window
    docker stop polkadot-hub-rpc
  • Start container:

    Terminal window
    docker start polkadot-hub-rpc
  • Remove container:

    Terminal window
    docker rm polkadot-hub-rpc

Ethereum RPC compatibility is provided through the eth-rpc adapter, which is part of pallet-revive. This adapter translates Ethereum JSON-RPC calls into Polkadot SDK-compatible requests, enabling integration with Ethereum tools like MetaMask, Hardhat, and Ethers.js.

Before starting the Ethereum RPC adapter:

  • Node synchronization: Let your Polkadot Hub node finish syncing before you start the adapter. On startup, the eth-rpc adapter reads pallet-revive configuration from the node's latest block and fails to start if that block predates pallet-revive, for example, early in the initial sync.
  • Archive node recommended: For full Ethereum RPC compatibility, run an archive node (--state-pruning=archive). The eth-rpc adapter may fail to query historical state on pruned nodes.
  • RPC accessibility: The Polkadot SDK-based RPC endpoint must be accessible (default: ws://127.0.0.1:9944).

You can run the Ethereum RPC adapter using Docker or as a systemd service.

Start the adapter using the official Parity eth-rpc Docker image:

Terminal window
docker run -d --name eth-rpc --restart unless-stopped \
--network=host \
-v /var/lib/eth-rpc:/data \
parity/eth-rpc:stable2609-1 \
--node-rpc-url=ws://127.0.0.1:9944 \
--rpc-port=8545 \
--base-path=/data \
--rpc-external \
--rpc-cors=all

The adapter accepts the following key parameters:

ParameterDescriptionDefault
--node-rpc-urlPolkadot SDK-based node WebSocket URLws://127.0.0.1:9944
--rpc-portEthereum RPC server port8545
--rpc-externalListen for RPC connections on all network interfaces instead of only on localhostDisabled
--rpc-corsCORS allowed originsNone
--eth-pruningBlock storage strategy: archive for persistent on-disk DB with full historical sync, or <N> for in-memory DB keeping latest N blocksarchive
--base-pathDirectory for persistent database storage (eth-rpc.db is created inside this directory)OS default data directory
--devUse temporary on-disk directory, deleted on exitDisabled
Migrating from previous CLI flags

As of PR #11153, the following flags have been removed and replaced:

Previous FlagReplacement
--cache-size N--eth-pruning=<N>
--database-url sqlite::memory:--eth-pruning=<N>
--database-url /path/to/db--base-path=/path/to/dir
--index-last-n-blocks N--eth-pruning=archive
--earliest-receipt-block NRemoved — the adapter now auto-discovers the first EVM block

Your node setup provides two distinct API interfaces:

InterfacePortProtocolUse Cases
Polkadot SDK RPC9944WebSocket/HTTPPolkadot SDK-native applications, parachain-specific operations, governance
Ethereum RPC8545HTTPEVM libraries, Ethereum tools, EVM-compatible dApps

To verify the Ethereum RPC adapter is working correctly, you can test standard Ethereum JSON-RPC methods like eth_chainId, eth_blockNumber, and eth_getBlockByNumber. For a complete list of supported methods and example queries, see the JSON-RPC APIs reference.

  • View logs:

    Terminal window
    docker logs -f eth-rpc
  • Stop container:

    Terminal window
    docker stop eth-rpc
  • Start container:

    Terminal window
    docker start eth-rpc

Running a parachain RPC node provides critical infrastructure for accessing Polkadot network services. By following this guide, you have set up a production-ready RPC node that:

  • Provides reliable access to parachain functionality for applications and users.
  • Supports flexible deployment with both Docker and systemd options.
  • Implements comprehensive monitoring, security, and maintenance practices.
  • Can be adapted for any parachain by substituting the appropriate chain specification.
  • Optionally enables Ethereum RPC compatibility for integration with EVM tools and wallets.

Whether you're running a node for system parachains (Asset Hub, People Chain, Bridge Hub, Coretime Chain) or other parachains in the ecosystem, regular maintenance and monitoring will ensure your RPC node continues to provide reliable service. Stay updated with the latest releases and best practices to keep your infrastructure secure and performant.

Last updated: