OKTC WebSocket 完全使用指南:兼容 Ethereum PubSub 的实时数据推送

·

核心关键词:OKTC WebSocket、Ethereum 实时推送、Cosmos SDK、Web3 兼容性、节点同步、链事件监听、日志订阅、newHeads、newPendingTransactions


为什么 OKTC 选择兼容 Ethereum PubSub?

OKTC 同时继承了 Cosmos SDK 的事件规范与 Tendermint Core 的高性能共识,但为了向 Web3 开发者提供一致的接口,官方将底层 Tendermint 响应透明地转换成 Ethereum 类型,从而可以通过 WebSocket 完全复用 Ethereum 常用的 PubSub API。

这一设计的最大优势:

👉 立即体验高性能 OKTC WebSocket 节点


一键启动连接:五步到位

  1. 安装客户端
    任意支持 WebSocket 的工具均可,官方示例推荐 ws 命令行工具:

    npm install -g ws
  2. 启动节点 / RPC 服务
    在初始化 rest-server 时,追加 --wsport 参数即可暴露 WebSocket 端口,默认 8546

    exchaind start --rest-server --wsport=8546

    如果用托管节点,可直接跳过这一步。

  3. 建立连接 URL

    • Mainnet 地址wss://exchainws.okex.org:8443
    • Testnet 地址wss://exchaintesttm.okex.org:8443
  4. 首次心跳

    ws wss://exchainws.okex.org:8443

    看到 {"jsonrpc":"2.0","id":1,"result":"..."} 即握手成功。

  5. 代码示例(Node.js)

    const WebSocket = require('ws');
    const ws = new WebSocket('wss://exchainws.okex.org:8443');
    ws.on('open', () => {
      ws.send(JSON.stringify({
        jsonrpc: "2.0",
        id: 1,
        method: "eth_subscribe",
        params: ["newHeads"]
      }));
    });

创建与取消订阅:两条消息搞定

创建订阅(eth_subscribe)

取消订阅(eth_unsubscribe)


支持的四种订阅详解

newHeads:实时监听区块高度

Logs:精准事件日志

newPendingTransactions:抢先一步看到未确认交易

syncing:节点同步状态广播


案例:监听链上 DEX 新增池子

假设你想实时监控新上线的 Uniswap-V2 风格流动性池「PairCreated」事件:

  1. 订阅方式

    {
      "jsonrpc":"2.0",
      "id":1,
      "method":"eth_subscribe",
      "params":["logs",{"address":"0x5C69...","topics":["0x0d3648..."]}]
    }
  2. 客户端去重
    在链重组场景,removed:true 日志不要刷新缓存。
  3. 异常告警
    若在一分钟内收到大量「removed」日志,可判定出现深回滚,提示用户延迟一小时确认最终性。

👉 用高能节点降低延迟,捕捉第一时间财富信号


FAQ:你十有八九会遇到的 5 个问题

Q1:Mainnet 连接频繁断开怎么办?
A:检查心跳间隔。OKTC 网关默认 30 秒无数据即关闭连接,可定时发送 {"id":1,"method":"eth_subscribe","params":["newHeads"]} 刷新。

Q2:newPendingTransactions 什么也没收到?
A:托管节点通常过滤隐私交易。自建节点时加 --rpc.unsafe 参数,并确保 --unlock 的私钥处于解锁状态。

Q3:Logs 订阅能一次监听 3000 个地址吗?
A:平均每 WebSocket 连接 8KiB URL 限制,推荐拆分为多连接,或使用日志 Bloom Filter 服务器侧 aggregation。

Q4:同步状态的布尔值 true 和对象形式如何区分?
A:首次进入同步会发送 true,随后推送对象体,捕获对象即可绘制进度条。

Q5:返回的区块时间单位是秒还是毫秒?
A:newHeads 中的 timestamp 为 Unix 秒。读取后直接 new Date(timestamp * 1000) 即可转为本地时间。


结语:给开发者的 30 秒速览

祝你链上风生水起,POOL 永远满仓,Gwei 永远归 0。