如何搭建 Polkadot Hub RPC 节点:Docker 和 Systemd 双方案完整指南(含以太坊 RPC 适配器)

原文作者:PaperMoon 团队

用公共 RPC 节点开发没问题,直到你的应用上线之后,请求量一大,公共节点开始限速,前端报超时,用户体验直接崩。或者你在做历史数据查询,公共节点只保留近期状态,旧区块的数据根本查不到。到这一步,自建 RPC 节点就是绕不过去的事了。

本文覆盖两种部署方式:Docker 适合快速启动和测试,systemd 更适合生产环境长期运行。另外还包括以太坊 RPC 适配器的配置。如果你需要让 MetaMask 或 Hardhat 直接连接你自己的 Polkadot Hub 节点,这一节要看。

一、硬件与软件要求

硬件

配置项

最低配置(可运行)

高流量 / 生产环境推荐

CPU

8 核

16 核及以上

内存

64 GB RAM

128 GB RAM

存储(归档节点)

约 1.2 TB NVMe SSD

同容量,优先企业级高速 NVMe SSD

存储(修剪节点)

约 200 GB NVMe SSD

同容量,高 IOPS SSD

网络带宽

稳定公网 IP

1 Gbps 带宽,建议配置 DDoS 防护

归档节点(archive node):保存从创世块开始的完整链上历史状态,可以查任意历史区块的数据,代价是存储占用大(~1.2 TB)。历史数据查询、区块浏览器、链上分析类应用需要这种节点。

修剪节点(pruned node):只保留最近 N 个区块的状态,存储占用小(~200 GB),同步也更快。如果你的应用只需要查当前状态或近期交易,修剪节点就够用了。

存储速度比容量更重要——请务必用 NVMe SSD,机械硬盘在同步时会成为严重瓶颈。

需要开放的端口

端口

服务类型

用途

是否必须开放

30333

P2P(平行链)

与其他平行链节点进行发现、区块同步与传播

✅ 必须

30334

P2P(中继链)

与 Relay Chain 节点建立连接并同步区块

✅ 必须

9944

RPC(WebSocket)

钱包、dApp、前端应用连接节点的主要入口

⭐ 强烈建议

9933

RPC(HTTP)

后端服务、脚本调用链上接口

建议

9615

监控(Prometheus)

导出节点运行指标(CPU、区块高度、peer 数等)

可选(生产推荐)

8545

Ethereum JSON-RPC

EVM 兼容接口(如 MetaMask、Hardhat、Foundry)

仅 EVM 场景需要

P2P 端口(30333/30334)是节点和其他节点通信用的,必须对外开放,否则节点无法参与网络同步。RPC 端口(9944/9933)只需在你的应用能访问到的范围内开放,不一定要对全网开放。

软件

- Ubuntu 22.04 LTS 或同类 Linux 发行版
- Docker(Docker 部署方式必须)
- rclone(下载快照时可选,但强烈建议安装)

二、Docker 部署

2.1 下载链规格文件

```bash
curl -L https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/cumulus/parachains/chain-specs/asset-hub-polkadot.json \
  -o asset-hub-polkadot.json
```

链规格文件(chain spec)包含网络的初始配置和创世状态,相当于节点的"身份证",必须正确配置才能连上正确的网络。

2.2 可选:通过快照加速同步

从创世块开始同步需要很长时间(可能数天)。如果你安装了 rclone,可以直接下载官方快照跳过大部分同步过程。

先创建数据目录:

```bash
mkdir -p my-node-data/chains/asset-hub-polkadot/db
mkdir -p my-node-data/chains/polkadot/db
```

下载 Asset Hub 快照:

```bash
# 替换 INSERT_LATEST 为 snapshots.polkadot.io 上的最新快照版本号
export SNAPSHOT_URL_ASSET_HUB="https://snapshots.polkadot.io/polkadot-asset-hub-rocksdb-archive/INSERT_LATEST"

rclone copyurl $SNAPSHOT_URL_ASSET_HUB/files.txt files.txt
rclone copy --progress --transfers 20 \
  --http-url $SNAPSHOT_URL_ASSET_HUB \
  --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
```

下载中继链快照:

```bash
# 中继链使用修剪快照,体积比归档快照小很多
export SNAPSHOT_URL_RELAY="https://snapshots.polkadot.io/polkadot-rocksdb-prune/INSERT_LATEST"

rclone copyurl $SNAPSHOT_URL_RELAY/files.txt files.txt
rclone copy --progress --transfers 20 \
  --http-url $SNAPSHOT_URL_RELAY \
  --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/polkadot/db/
rm files.txt
```

2.3 启动归档节点

```bash
docker run -d --name polkadot-hub-rpc --restart unless-stopped \
  -p 9944:9944 \
  -p 9933:9933 \
  -p 9615:9615 \
  -p 30334:30334 \
  -p 30333:30333 \
  -v $(pwd)/asset-hub-polkadot.json:/asset-hub-polkadot.json \
  -v $(pwd)/my-node-data:/data \
  parity/polkadot-parachain:stable2512-1 \
  --name=PolkadotHubRPC \
  --base-path=/data \
  --chain=/asset-hub-polkadot.json \
  --prometheus-external \
  --prometheus-port 9615 \
  --unsafe-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 \
  --state-pruning=256 \
  --blocks-pruning=256 \
  --rpc-port=0
```

注意命令中间的 `--`:前面的参数属于 Asset Hub 平行链节点,后面的参数属于内嵌的中继链节点。中继链的 `--rpc-port=0` 表示禁用中继链的 RPC,对外只暴露平行链的 RPC。

2.4 启动修剪节点

修剪节点和归档节点的命令只有 `--state-pruning` 一个参数不同:

```bash
docker run -d --name polkadot-hub-rpc --restart unless-stopped \
  -p 9944:9944 \
  -p 9933:9933 \
  -p 9615:9615 \
  -p 30334:30334 \
  -p 30333:30333 \
  -v $(pwd)/asset-hub-polkadot.json:/asset-hub-polkadot.json \
  -v $(pwd)/my-node-data:/data \
  parity/polkadot-parachain:stable2512-1 \
  --name=PolkadotHubRPC \
  --base-path=/data \
  --chain=/asset-hub-polkadot.json \
  --prometheus-external \
  --prometheus-port 9615 \
  --unsafe-rpc-external \
  --rpc-port=9944 \
  --rpc-cors=all \
  --rpc-methods=safe \
  --rpc-max-connections=1000 \
  --state-pruning=1000 \
  --blocks-pruning=256 \
  -- \
  --base-path=/data \
  --chain=polkadot \
  --state-pruning=256 \
  --blocks-pruning=256 \
  --rpc-port=0
```

三、Systemd 部署

systemd 比 Docker 更适合生产环境:节点作为系统服务运行,开机自启,崩溃自动重启,日志由 journalctl 统一管理。

3.1 下载二进制文件

```bash
wget https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-1/polkadot-parachain
chmod +x polkadot-parachain
sudo mv polkadot-parachain /usr/local/bin/
polkadot-parachain --version  # 确认安装成功
```

3.2 下载链规格文件

```bash
curl -L https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/cumulus/parachains/chain-specs/asset-hub-polkadot.json \
  -o asset-hub-polkadot.json
```

3.3 创建系统用户和目录

```bash
sudo useradd -r -s /bin/bash polkadot
sudo mkdir -p /var/lib/polkadot-hub-rpc
sudo cp asset-hub-polkadot.json /var/lib/polkadot-hub-rpc/
sudo chown -R polkadot:polkadot /var/lib/polkadot-hub-rpc
```

用专用系统用户(非 root)运行节点是基本的安全实践——即使节点进程被攻击,攻击者也不能通过它获得 root 权限。

3.4 创建 systemd 服务文件(归档节点)

```bash
sudo nano /etc/systemd/system/polkadot-hub-rpc.service
```

写入以下内容:

```ini
[Unit]
Description=Polkadot Hub RPC Node
After=network.target

[Service]
Type=simple
User=polkadot
Group=polkadot
WorkingDirectory=/var/lib/polkadot-hub-rpc

ExecStart=/usr/local/bin/polkadot-parachain \
  --name=PolkadotHubRPC \
  --chain=/var/lib/polkadot-hub-rpc/asset-hub-polkadot.json \
  --base-path=/var/lib/polkadot-hub-rpc \
  --port=30333 \
  --rpc-port=9944 \
  --rpc-external \
  --rpc-cors=all \
  --rpc-methods=safe \
  --rpc-max-connections=1000 \
  --prometheus-port=9615 \
  --prometheus-external \
  --state-pruning=archive \
  --blocks-pruning=archive \
  -- \
  --chain=polkadot \
  --base-path=/var/lib/polkadot-hub-rpc \
  --port=30334 \
  --state-pruning=256 \
  --blocks-pruning=256 \
  --rpc-port=0

Restart=always
RestartSec=10
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
```

修剪节点只需把 `--state-pruning=archive --blocks-pruning=archive` 改为 `--state-pruning=1000 --blocks-pruning=256`,其余不变。

3.5 启动服务

```bash
sudo systemctl daemon-reload
sudo systemctl enable polkadot-hub-rpc   # 设置开机自启
sudo systemctl start polkadot-hub-rpc
```

四、关键参数说明

参数

类型

作用

运维建议

--unsafe-rpc-external / --rpc-external

RPC

允许外部 IP 访问 RPC 端口(不再限制为 localhost)

仅在内网、反向代理或防火墙保护下使用,公网裸露极不安全

--rpc-methods=safe

RPC 安全

只开放安全 RPC 方法,禁用敏感操作

公共 RPC 节点 必须开启

--rpc-cors=all

跨域

允许任意来源的浏览器访问 RPC

生产环境建议改为指定域名

--rpc-max-connections=1000

连接数

限制同时连接节点的客户端数量

按服务器性能调节,过高会耗尽内存

--state-pruning=archive

状态存储

保存完整历史状态(归档节点)

区块浏览器 / Indexer 必需

--blocks-pruning=archive

区块存储

保存全部历史区块

数据分析与审计需要

LimitNOFILE=65536

systemd

提高可打开文件描述符上限

几乎所有生产节点都需要配置

五、验证节点同步状态

节点启动后不会立即可用,需要先同步到最新区块。用下面的命令查看同步进度:

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

当 `currentBlock` 等于 `highestBlock` 时,说明同步完成:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "startingBlock": 0,
    "currentBlock": 3394816,
    "highestBlock": 3394816
  }
}
```

检查节点健康状态:

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

六、节点管理命令速查

Docker

```bash
docker logs -f polkadot-hub-rpc    # 实时查看日志
docker stop polkadot-hub-rpc       # 停止节点
docker start polkadot-hub-rpc      # 启动节点
docker rm polkadot-hub-rpc         # 删除容器(数据目录不受影响)
```

Systemd

```bash
sudo systemctl status polkadot-hub-rpc      # 查看服务状态
sudo journalctl -u polkadot-hub-rpc -f      # 实时查看日志
sudo systemctl stop polkadot-hub-rpc        # 停止服务
sudo systemctl start polkadot-hub-rpc       # 启动服务
sudo systemctl enable polkadot-hub-rpc      # 设为开机自启
```

七、以太坊 RPC 适配器(eth-rpc)

如果你需要用 MetaMask、Hardhat 或 ethers.js 连接 Polkadot Hub,光有 `9944` 端口的 Polkadot SDK RPC 还不够——这些工具认识的是以太坊 JSON-RPC 协议。eth-rpc 适配器就是做这件转换的:它监听在 `8545` 端口,把以太坊格式的请求翻译成 Polkadot SDK 的格式,再把结果转换回去。

前提条件:eth-rpc 依赖 Polkadot Hub RPC 节点已经运行并同步完成。历史数据查询建议用归档节点。

7.1 Docker 部署 eth-rpc

```bash
docker run -d --name eth-rpc --restart unless-stopped \
  --network=host \
  paritypr/eth-rpc:master-1ea05e17 \
  --node-rpc-url ws://127.0.0.1:9944 \
  --rpc-port 8545 \
  --unsafe-rpc-external \
  --rpc-cors all
```

`--network=host` 使容器直接使用宿主机网络,这样 eth-rpc 容器才能连接到同一台机器上的 Polkadot Hub 节点(`ws://127.0.0.1:9944`)。

7.2 Systemd 部署 eth-rpc

从源码编译(需要 Rust 工具链):

```bash
git clone https://github.com/paritytech/polkadot-sdk.git
cd polkadot-sdk
cargo build -p pallet-revive-eth-rpc --bin eth-rpc --release
sudo mv target/release/eth-rpc /usr/local/bin/
```

创建 systemd 服务文件:

```bash
sudo nano /etc/systemd/system/eth-rpc.service
```

写入内容:

```ini
[Unit]
Description=Ethereum RPC Adapter for Polkadot Hub
After=network.target polkadot-hub-rpc.service

[Service]
Type=simple
User=polkadot
Group=polkadot

ExecStart=/usr/local/bin/eth-rpc \
  --node-rpc-url ws://127.0.0.1:9944 \
  --rpc-port 8545 \
  --unsafe-rpc-external \
  --rpc-cors all

Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
```

`After=polkadot-hub-rpc.service` 确保 eth-rpc 在主节点服务启动之后才启动。

```bash
sudo systemctl daemon-reload
sudo systemctl enable eth-rpc
sudo systemctl start eth-rpc
```

7.3 eth-rpc 常用参数

参数

类型

作用

默认值

运维建议

--node-rpc-url

连接地址

指向 Polkadot Hub 节点的 WebSocket RPC

ws://127.0.0.1:9944

必须指向你自己的节点或可信 RPC

--rpc-port

端口

以太坊工具(MetaMask / Hardhat / Foundry)连接的入口端口

8545

公网建议放在反向代理后

--unsafe-rpc-external

网络访问

允许外部主机访问 eth-rpc

禁用

仅在防火墙或内网环境下开启

--rpc-cors

跨域

浏览器可访问的来源域名

生产环境填写具体域名,不建议 *

--cache-size

性能

缓存最近区块数量以加速查询

256

高流量 RPC 可提高到 1024+

--database-url

存储

交易收据数据库路径

sqlite::memory:

必须改为文件路径,否则重启丢历史

--index-last-n-blocks

索引

启动时回溯索引最近 N 个区块

如果需要持久化交易收据(比如 `eth_getTransactionReceipt` 查历史),把 `--database-url` 指向一个本地文件路径,而不是用默认的内存数据库。

7.4 两种 RPC 接口对比

接口类型

端口

协议

面向工具 / SDK

典型使用场景

Polkadot SDK RPC

9944

WebSocket / HTTP

PAPI、Polkadot.js、Dedot、Subxt

查询链上状态、发送交易、脚本交互

以太坊 JSON-RPC

8545

HTTP

MetaMask、Hardhat、ethers.js、Foundry

Solidity 合约部署、EVM dApp 连接

自建 RPC 节点最大的坑是存储:归档节点的 1.2 TB 是累积上去的,而且还在增长。如果用快照初始化,第一次启动能节省几天时间,但快照本身的下载也需要稳定带宽。修剪节点的 200 GB 更好控制,只要你的应用不需要查很久以前的历史状态,用修剪节点完全够用。

阅读原文:https://docs.polkadot.com/node-infrastructure/run-a-node/polkadot-hub-rpc/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值