WebSocket API 使用指南:订阅以太坊风格事件

Posted by QTCGBY 链上情报站 on April 3, 2025

OKTC 基于 Tendermint Core 共识引擎,并采用 Cosmos SDK 框架构建,因此继承了其事件格式。然而,为了兼容以太坊风格的 Web3 WebSocket 功能,OKTC 需要将 Tendermint 的响应转换为以太坊类型。

您可以通过在初始化 REST 服务器时使用 --wsport 标志(默认端口为 8546)来建立与以太坊 WebSocket 的连接。之后,可以使用 ws 或其他 WebSocket 客户端启动订阅。

WebSocket 连接基础

主网 WebSocket URL

主网的 WebSocket 服务可通过标准端口进行访问,具体地址需根据节点配置确定。

创建订阅

通过向服务器发送 RPC 调用,以 eth_subscribe 为方法名,并以订阅名称作为第一个参数,即可创建订阅。成功后,服务器将返回订阅 ID。

参数说明:

  1. 订阅名称
  2. 可选参数(视订阅类型而定)

示例请求:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_subscribe",
  "params": ["newHeads"]
}

取消订阅

通过向服务器发送 RPC 调用,以 eth_unsubscribe 为方法名,并以订阅 ID 作为第一个参数,即可取消订阅。服务器将返回布尔值,表示操作是否成功。

参数说明:

  1. 订阅 ID

示例请求:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_unsubscribe",
  "params": ["0x123456789"]
}

支持的订阅类型

newHeads

每当新区块头被添加到链上时(包括链重组情况),触发通知。

参数:

示例响应:

{
  "jsonrpc": "2.0",
  "method": "eth_subscription",
  "params": {
    "subscription": "0x123456789",
    "result": {
      "number": "0x1",
      "hash": "0xabc...",
      "parentHash": "0xdef...",
      // 其他区块头字段
    }
  }
}

Logs

返回新导入区块中包含的日志,且符合指定的筛选条件。

若发生链重组,之前发送的旧链上的日志会重新发送,并标记为已删除(removed 属性为 true);新链上的交易日志则正常发出。因此,同一交易的日志可能多次触发订阅。

参数说明:

  1. 包含以下可选字段的对象:
    • address:地址或地址数组,仅返回来自这些地址的日志(可选)
    • topics:仅匹配指定主题的日志(可选)

示例请求:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_subscribe",
  "params": ["logs", {"address": "0x123...", "topics": ["0xabc..."]}]
}

newPendingTransactions

返回所有进入待处理状态且由节点可用密钥签名的交易哈希。

若某交易原本属于规范链,但在重组后不再属于新规范链,则该交易会再次触发通知。

参数:

示例响应:

{
  "jsonrpc": "2.0",
  "method": "eth_subscription",
  "params": {
    "subscription": "0x123456789",
    "result": "0x交易哈希"
  }
}

syncing

当节点开始或停止同步时触发通知。结果可以是布尔值(true 表示开始同步,false 表示结束),也可以是包含各种进度指标的对象。

参数:

示例响应(同步中):

{
  "jsonrpc": "2.0",
  "method": "eth_subscription",
  "params": {
    "subscription": "0x123456789",
    "result": {
      "startingBlock": "0x0",
      "currentBlock": "0x100",
      "highestBlock": "0x200"
    }
  }
}

常见问题

如何建立 WebSocket 连接?

启动 OKTC 节点时,通过 --wsport 参数指定 WebSocket 端口(默认为 8546),然后使用任何标准 WebSocket 客户端连接至该端口。

订阅有哪些常见用途?

订阅可用于实时监控新区块、追踪特定合约事件、获取待处理交易通知,以及监控节点同步状态。👉 查看实时监控工具 可帮助您更高效地管理链上活动。

为什么日志会重复发送?

在区块链重组过程中,旧链上的日志会被重新发送并标记为“已删除”,而新链上的日志会再次触发通知。这是为了确保客户端能够正确处理链状态变化。

如何选择适合的订阅类型?

根据需求选择:newHeads 适用于区块头追踪,logs 适合合约事件监听,newPendingTransactions 用于即时交易通知,syncing 则用于同步状态监控。

订阅是否支持多链环境?

当前文档描述的功能主要针对 OKTC 主网,但 WebSocket API 的设计兼容多链场景。具体配置需参考各链的文档说明。

遇到连接问题如何排查?

检查节点是否正确启用 WebSocket 端口,确认防火墙设置允许连接,并验证客户端代码是否兼容以太坊 PubSub API 标准。

通过以上介绍,您应能掌握 OKTC WebSocket API 的基本用法,实现高效的链上事件订阅与实时数据处理。