如何运行 Robinhood Chain 全节点

QuickNode 发布于 2026-07-31 阅读 56

本文介绍如何通过 Docker 和 Arbitrum Nitro 运行 Robinhood Chain 主网或测试网全节点。需要准备 Linux 服务器、以太坊主网 RPC 端点(Quicknode 提供)以及足够的硬件资源。步骤包括下载配置、创建运行脚本、配置 systemd 服务,并验证同步状态。还提供了故障排除方法和数据验证技巧。文章强调使用本地 NVMe 存储,并确保 RPC 仅绑定本地回环地址以保安全。

概述

需要为 Robinhood Chain 搭建自托管的 RPC 吗?本指南将介绍如何使用 Docker 和 Robinhood 兼容的 Nitro 版本运行 Robinhood Chain 主网或测试网全节点。

如果你需要与 Robinhood Chain 进行通信和交互,更简单的选择是使用 Quicknode Robinhood Chain endpoint:Quicknode 会为你运维 RPC 基础设施(如果你需要一组专用节点,可以考虑 Dedicated Clusters)。当你需要私有 RPC 端点、希望对可用性和访问权限拥有更多控制,或需要直接本地访问 Robinhood Chain 数据时,可以自行运行节点。

你将做什么

  • 获取一个 Quicknode Ethereum 端点,用于所需的执行层和 Beacon API
  • 下载适用于主网或测试网的 Robinhood Chain 配置
  • 将 Nitro 作为可安全重启的 systemd 服务运行,并使用持久的本地 NVMe 存储

你需要准备什么

  • 一台安装了 Docker 的 Linux 服务器;本指南以 Ubuntu 24.04 为例
  • 至少 8 个现代 CPU 核心、64 GB 内存(建议 128 GB),以及数 TB 的本地 NVMe 存储。请预留至少当前链大小两倍的空间,再加上 20% 的余量。请参阅 Robinhood 的当前硬件要求
  • 一个来自 Quicknode 的 Ethereum 主网端点,同时支持执行层 JSON-RPC 和 Beacon REST API
  • 拥有 sudo 访问权限,并基本熟悉 Linux 命令行

经过测试的 AWS 参考配置

我们在 AWS i3en.2xlarge 实例上验证了此配置,该实例配备 8 个 vCPU、64 GiB 内存和两块本地 2.5 TB NVMe SSD(配置为 RAID 0 卷,约 4.6 TB 可用空间)。AWS 只是一个示例,并非硬性要求:这些命令适用于任何合适的 Linux 服务器。本指南有意不涉及 RAID 配置和 AWS CLI 预置操作,因为这些操作具有破坏性或与特定云厂商相关。

什么是 Robinhood Chain?

Robinhood Chain 是由 Robinhood 构建的 Arbitrum Orbit Layer 2。开发者可以使用它来构建链上应用并与 Stock Tokens 交互。

如需从独立视角了解以太坊扩展生态系统,请参阅 L2BEAT

为什么此节点需要 Ethereum 数据

Robinhood Chain 在 L2 上执行交易,同时将数据发布到 Ethereum。你的 Nitro 节点使用 Ethereum 数据来重建和验证 Robinhood Chain,因此它需要访问两个 L1 接口:

  • 执行层 JSON-RPC:用于读取 Ethereum 执行层数据
  • Beacon REST API:用于获取 blob 数据

一个 Quicknode Ethereum 主网端点即可提供这两个接口。切勿将其中任一值指向 Robinhood Chain 端点:其 eth_chainId 是 Robinhood Chain 的链 ID,而不是 Ethereum 主网的 0x1

本指南还使用了 Robinhood 的低延迟排序器 feed。该 feed 的 URL 必须以 wss:// 开头,而不是 https://

获取你的 Ethereum 端点

登录 Quicknode,创建一个 Ethereum Mainnet 端点,并复制其 HTTPS URL。同一个 URL 可提供 Nitro 所需的执行层 JSON-RPC 和 Beacon REST API。请只将其保存在节点主机或你的密钥管理器中;切勿将其提交到代码仓库。

在服务器上,将其写入一个仅 root 用户可读的环境文件:

sudo install -m 700 -d /etc/robinhood-nitro
sudo tee /etc/robinhood-nitro/node.env > /dev/null <<'EOF'
ROBINHOOD_NETWORK=mainnet
ETHEREUM_RPC_URL=https://YOUR-QUICKNODE-ENDPOINT.quiknode.pro/YOUR-TOKEN/
ETHEREUM_BEACON_URL=https://YOUR-QUICKNODE-ENDPOINT.quiknode.pro/YOUR-TOKEN/
EOF
sudo chmod 600 /etc/robinhood-nitro/node.env

这两个值可以是同一个 Quicknode Ethereum URL。以下快速检查可在启动节点前确认你复制的是 Ethereum 端点,而不是 Robinhood Chain 端点:

set -a
source /etc/robinhood-nitro/node.env
set +a

curl -sS "$ETHEREUM_RPC_URL" \
  -H 'Content-Type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'

curl -sS "$ETHEREUM_BEACON_URL/eth/v1/node/version"

第一条命令必须返回 "result":"0x1";第二条命令必须返回 HTTP 200 和 Beacon 节点版本。如果任一检查失败,请立即停止操作并修正端点。L2 端点可能看起来有效,但会导致 Nitro 无法同步。

准备主机

安装 Docker 和本指南使用的工具,然后启用 Docker:

sudo apt-get update
sudo apt-get install -y ca-certificates curl docker.io jq
sudo systemctl enable --now docker

在本地 NVMe 卷上选择一个数据目录。示例假设它挂载在 /data;如果你的挂载点不同,请调整此值。

sudo install -d -m 755 /opt/robinhood-nitro/config
sudo install -d -m 755 /data/robinhood-nitro-data-mainnet
sudo install -d -m 755 /data/robinhood-nitro-data-testnet

## 固定的 Nitro 镜像以 UID/GID 1000 写入其数据库。
sudo chown 1000:1000 /data/robinhood-nitro-data-mainnet /data/robinhood-nitro-data-testnet

首先,保持 RPC 私密

下面的服务仅将 HTTP 和 WebSocket 绑定到 127.0.0.1。这可以避免意外暴露未认证的公共 RPC 服务。如果其他应用程序需要访问,请在其前面加上经过认证的反向代理或私有网络访问控制,而不是直接将 8547 和 8548 端口开放到互联网。

下载 Robinhood Chain 配置

下载 Robinhood 发布的当前 chain-info 文件。主网还需要其自定义 genesis 文件:

sudo curl --fail --retry 8 --retry-all-errors -L \
  https://cdn.robinhood.com/assets/generated_assets/hoodchain_docsite/chain-node-configs/robinhood-chain-info.json \
  -o /opt/robinhood-nitro/config/robinhood-chain-info.json

sudo curl --fail --retry 8 --retry-all-errors -L \
  https://cdn.robinhood.com/assets/generated_assets/hoodchain_docsite/chain-node-configs/robinhood-genesis.json \
  -o /opt/robinhood-nitro/config/robinhood-genesis.json

sudo curl --fail --retry 8 --retry-all-errors -L \
  https://cdn.robinhood.com/assets/generated_assets/hoodchain_docsite/chain-node-configs/robinhood-chain-testnet-info.json \
  -o /opt/robinhood-nitro/config/robinhood-chain-testnet-info.json

测试网使用自己的 chain-info 文件,并且使用自定义 genesis。

创建节点运行脚本

创建一个小型运行脚本,用于加载受保护的端点值并启动固定的 Nitro 镜像:

sudo tee /usr/local/bin/run-robinhood-nitro > /dev/null <<'EOF'
##!/usr/bin/env bash
set -euo pipefail

source /etc/robinhood-nitro/node.env

NETWORK="${ROBINHOOD_NETWORK:-mainnet}"
DATA_DIR="/data/robinhood-nitro-data-${NETWORK}"
case "$NETWORK" in
  mainnet)
    CHAIN_INFO=/home/nitro/config/robinhood-chain-info.json
    FEED_URL=wss://feed.mainnet.chain.robinhood.com
    INIT_ARGS=(--init.genesis-json-file=/home/nitro/config/robinhood-genesis.json)
    ;;
  testnet)
    CHAIN_INFO=/home/nitro/config/robinhood-chain-testnet-info.json
    FEED_URL=wss://feed.testnet.chain.robinhood.com
    INIT_ARGS=()
    ;;
  *)
    echo "ROBINHOOD_NETWORK must be mainnet or testnet" >&2
    exit 1
    ;;
esac

exec /usr/bin/docker run --name robinhood-nitro \
  -v "$DATA_DIR":/home/user/.arbitrum \
  -v /opt/robinhood-nitro/config:/home/nitro/config:ro \
  -p 127.0.0.1:8547:8547 \
  -p 127.0.0.1:8548:8548 \
  offchainlabs/nitro-node:v3.11.2-3599aca \
    --chain.info-files="$CHAIN_INFO" \
    --parent-chain.connection.url="$ETHEREUM_RPC_URL" \
    --parent-chain.blob-client.beacon-url="$ETHEREUM_BEACON_URL" \
    "${INIT_ARGS[@]}" \
    --node.feed.input.url="$FEED_URL" \
    --execution.forwarding-target=null \
    --http.addr=0.0.0.0 --http.port=8547 --http.api=net,web3,eth
EOF

sudo chmod 700 /usr/local/bin/run-robinhood-nitro

选择网络

除非你在 /etc/robinhood-nitro/node.env 中设置 ROBINHOOD_NETWORK=testnet,否则运行脚本默认使用主网。它使用独立的 /data/robinhood-nitro-data-mainnet/data/robinhood-nitro-data-testnet 目录,因此绝不要将主网数据库用于测试网,反之亦然。

sudo sed -i 's/^ROBINHOOD_NETWORK=.*/ROBINHOOD_NETWORK=testnet/' /etc/robinhood-nitro/node.env
sudo systemctl restart robinhood-nitro

对于主网,请省略该行或设置 ROBINHOOD_NETWORK=mainnet

重要的配置细节

  • 对于 offchainlabs/nitro-node:v3.11.2-3599aca,实际使用的数据目录是 /home/user/.arbitrum。如果挂载 /home/nitro/.arbitrum,则预期的宿主机数据卷不会被使用。
  • 对于此 Nitro 版本,非排序器节点必须使用 --execution.forwarding-target=null。否则,Nitro 会以 ForwardingTarget not set and not sequencer 错误退出。
  • 在容器内部,Docker 看到的是 --http.addr=0.0.0.0,而宿主机层面的端口映射将其限制在 127.0.0.1,因此服务保持私有。

将其作为 systemd 服务运行

创建服务定义:

sudo tee /etc/systemd/system/robinhood-nitro.service > /dev/null <<'EOF'
[Unit]
Description=Robinhood Chain Nitro full node
After=docker.service network-online.target
Wants=network-online.target
Requires=docker.service

[Service]
Type=simple
Restart=always
RestartSec=15
ExecStartPre=-/usr/bin/docker rm -f robinhood-nitro
ExecStart=/usr/local/bin/run-robinhood-nitro
ExecStop=/usr/bin/docker stop -t 120 robinhood-nitro

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now robinhood-nitro
sudo systemctl status robinhood-nitro --no-pager

初始同步可能需要相当长的时间。在另一个终端中跟踪日志:

sudo journalctl -u robinhood-nitro -f

验证同步并查询节点

检查本地 RPC 服务器是否可用:

curl -sS http://127.0.0.1:8547 \
  -H 'Content-Type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'

使用 eth_syncing 检查进度。返回 false 表示节点已完全同步:

curl -sS http://127.0.0.1:8547 \
  -H 'Content-Type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_syncing","params":[]}'

节点响应后,获取其最新区块:

curl -sS http://127.0.0.1:8547 \
  -H 'Content-Type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["latest",false]}'

有关你可以查询的方法,请参阅 Robinhood Chain RPC 参考文档

可选:对照可信 RPC 验证数据

eth_syncing 返回 false 后,在同一个固定区块上将你的节点与可信的 Robinhood Chain RPC 进行对比。不要跨端点比较 latest,因为链在两次请求之间可能会继续推进。首先,设置固定的区块标签和参考 URL,然后对两个端点运行相同的请求:

export BLOCK_TAG=0xYOUR_FIXED_BLOCK_NUMBER
export REFERENCE_RPC_URL=https://YOUR_TRUSTED_ROBINHOOD_CHAIN_RPC_URL

for RPC_URL in http://127.0.0.1:8547 "$REFERENCE_RPC_URL"; do
  curl -sS "$RPC_URL" \
    -H 'Content-Type: application/json' \
    --data "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getBlockByNumber\",\"params\":[\"$BLOCK_TAG\",false]}"
  echo
done

两个端点返回的区块应该一致。如需更深入的检查,请使用相同的固定区块标签对比 eth_chainIdnet_version 以及只读状态调用,例如 eth_getBalanceeth_getCodeeth_getStorageAt

故障排查

服务反复重启或立即退出

首先查看服务和容器日志:

sudo systemctl status robinhood-nitro --no-pager
sudo journalctl -u robinhood-nitro -n 100 --no-pager
sudo docker logs robinhood-nitro

如果日志显示 ForwardingTarget not set and not sequencer,请确认运行脚本中包含 --execution.forwarding-target=null。如果问题是在 Robinhood Chain 升级后出现的,请在更改镜像之前查看 Robinhood 的节点文档,了解受支持的 Nitro 和 ArbOS 版本。

同步无法启动或停滞

重新运行获取你的 Ethereum 端点中的两个 L1 检查。执行层请求必须返回 0x1,Beacon 请求必须返回 HTTP 200。必须使用完全同步的 L1 端点;如果 L1 执行端点指向 Robinhood Chain,将无法工作。

同时监控你的 L1 请求配额和磁盘容量:

df -h /data
sudo du -sh /data/robinhood-nitro-data-*

初始同步会产生大量 L1 请求。使用慢速存储或网络附加存储时,同步速度会比本地 NVMe 慢得多。

数据目录仍然为空

对于本指南中固定的镜像,请确认宿主机数据卷挂载在 /home/user/.arbitrum 而不是 /home/nitro/.arbitrum,并且它由 UID/GID 1000 所有:

sudo ls -ldn /data/robinhood-nitro-data-*
sudo docker inspect robinhood-nitro --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'

启动期间 RPC 连接被拒绝

Docker 可能在 Nitro 的 JSON-RPC 处理器完成初始化之前就绑定了 8547 端口。暂时出现连接重置或被拒绝是正常的。请继续跟踪日志,并在 Nitro 提示其 HTTP 服务器可用后重试。

运行效果

节点同步完成后,本地 eth_blockNumber 请求将返回当前的 Robinhood Chain 区块高度。下面的示例通过 AWS Systems Manager 向节点仅监听回环地址的 RPC 端点发起该请求。

在 AWS Systems Manager 中向已同步的 Robinhood Chain 节点成功发起 eth_blockNumber 请求

继续探索

请查看我们的其他 Robinhood Chain 技术指南,了解更多内容:

总结

现在你已经拥有了一个私有的 Robinhood Chain 全节点,它将数据库持久化在本地存储上,并使用 Quicknode 提供所需的 Ethereum 执行层和 Beacon API。请保持服务器补丁及时更新,监控磁盘增长和 L1 使用情况,并在应用 Robinhood Chain 升级之前验证受支持的 Nitro 版本。

我们 ❤️ 你的反馈!

如果你有任何反馈或新主题建议,请告诉我们。我们很乐意倾听你的想法。

  • 原文链接: quicknode.com/guides/rob...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论