在以太坊的生态系统中,RPC(Remote Procedure Call,远程过程调用)节点是连接用户、DApp与区块链底层的桥梁,无论是为了提高去中心化应用的可靠性,还是为了在私有网络中进行开发测试,掌握如何为以太坊节点增加和配置新的RPC服务都是一项至关重要的技能。

本文将以目前最主流的以太坊执行层客户端 Geth 为例,详细介绍如何通过命令行参数和配置文件两种方式来“增加”或“开启”RPC服务。

理解 RPC 与监听地址

在默认情况下,为了保证安全,Geth 节点通常只开启 IPC(进程间通信),而不对外开放 RPC 接口,所谓的“增加新的RPC服务”,本质上是在启动节点时,显式地告诉客户端:监听哪个端口、允许哪些模块、以及接受来自哪里的请求。

这里有一个核心概念需要理解:--http.addr

  • 默认情况下,如果不指定,RPC 服务只监听 localhost (127.0.0.1),这意味着只有本机可以访问。
  • 若要允许外部访问(即真正意义上的“服务”化),通常需要将其设置为 0.0.0(监听所有网络接口)或特定的服务器 IP。

方法一:使用命令行参数启动

这是最直接的方法,在启动 Geth 时,你可以通过添加特定的标志来开启和配置 HTTP RPC 服务。

基础启动命令:

geth --http --http.addr "0.0.0.0" --http.port 8545 --http.api "eth,net,web3,txpool" --http.corsdomain "*"

参数详解:

  1. --http:这是总开关,启用 HTTP-RPC 服务,在旧版本的 Geth 中,这个参数曾是 --rpc
  2. --http.addr "0.0.0.0":指定 RPC 监听地址,设置为 0.0.0 意味着节点将接受来自任何 IP 的连接请求(请务必配置防火墙)。
  3. --http.port 8545:指定 RPC 监听端口,默认是 8545,你可以修改为任何未被占用的端口(8546 通常用于 WebSocket)。
  4. --http.api "eth,net,web3,...":这是“增加”服务功能的关键,通过这个参数,你可以决定开放哪些 API 模块。
    • 常用模块:eth (核心以太坊功能), net (网络信息), web3 (工具库), txpool (交易池状态), personal (账户管理,私链常用)。
    • 注意:生产环境应尽量减少开放的模块数量。
  5. *`--http.corsdomain ""`**:指定接受跨域请求的域名,如果你是前端 DApp 直接连接节点,通常需要设置此项,否则浏览器会拦截请求。

方法二:使用配置文件(推荐用于生产环境)

如果你不想每次启动都输入一长串命令,或者你需要管理复杂的配置,使用 TOML 配置文件是更好的选择。

  1. 创建配置文件config.toml):
    [Node.HTTP]
    Enabled = true
    Host = "0.0.0.0"
    Port = 8545
    API = ["eth", "net", "web3", "txpool"]
    CORS = ["*"]
  2. 启动节点
    geth --config /path/to/config.toml

进阶:增加 WebSocket RPC 服务

除了 HTTP,现代 DApp 开发经常需要实时推送数据(如监听新区块),这时需要增加 WebSocket RPC 服务,这与 HTTP RPC 是并行独立的。

启动命令示例:

geth --ws --ws.addr "0.0.0.0" --ws.port 8546 --ws.api "eth,net,web3" --ws.origins "*"
  • --ws:开启 WebSocket 服务。
  • *`--ws.origins ""`**:允许任何来源的 WebSocket 连接。

安全警示:如何防止节点被攻击

当你执行了上述步骤,将 RPC 服务暴露在公网(0.0.0)后,你的节点就面临着被扫描和攻击的风险,特别是“盗币”攻击。

必须遵守的安全原则:

  1. 切勿解锁账户:对于对外开放 RPC 的节点,绝对不要使用 --unlock 参数解锁账户私钥,攻击者可以通过 RPC 接口调用 eth_sendTransaction 将资金转走。
  2. 使用反向代理与认证:不要直接将 8545 端口裸露在公网,建议使用 Nginx 做反向代理,并在 Nginx 层面设置 Basic Auth(用户名密码)或限制 IP 白名单。
  3. 限制 API 模块:只开放必要的模块,普通查询节点不需要开启 personaladmin 模块。
  4. 防火墙设置:在云服务器的防火墙(如 AWS Security Group 或阿里云安全组)中,仅允许你的应用服务器 IP 访问 8545 端口。

验证服务是否增加成功

配置完成后,你可以使用 curl 命令在终端中快速测试 RPC 服务是否正常工作:

curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http://你的服务器IP:8545

如果返回类似 {"jsonrpc":"2.0","id":1,"result":"0x1234..."} 的结果,说明新的 RPC 服务已成功增加并运行。