核心关键词:OKTC WebSocket、Ethereum 实时推送、Cosmos SDK、Web3 兼容性、节点同步、链事件监听、日志订阅、newHeads、newPendingTransactions
为什么 OKTC 选择兼容 Ethereum PubSub?
OKTC 同时继承了 Cosmos SDK 的事件规范与 Tendermint Core 的高性能共识,但为了向 Web3 开发者提供一致的接口,官方将底层 Tendermint 响应透明地转换成 Ethereum 类型,从而可以通过 WebSocket 完全复用 Ethereum 常用的 PubSub API。
这一设计的最大优势:
- 不用额外学新协议,开发者直接调用
eth_subscribe / eth_unsubscribe
即可。 - 基础设施无缝迁移,无论你使用 Hardhat、DApp 工具库或通义千问自动代码提示,都能零差异。
一键启动连接:五步到位
安装客户端
任意支持 WebSocket 的工具均可,官方示例推荐ws
命令行工具:npm install -g ws
启动节点 / RPC 服务
在初始化 rest-server 时,追加--wsport
参数即可暴露 WebSocket 端口,默认8546
:exchaind start --rest-server --wsport=8546
如果用托管节点,可直接跳过这一步。
建立连接 URL
- Mainnet 地址:
wss://exchainws.okex.org:8443
- Testnet 地址:
wss://exchaintesttm.okex.org:8443
- Mainnet 地址:
首次心跳
ws wss://exchainws.okex.org:8443
看到
{"jsonrpc":"2.0","id":1,"result":"..."}
即握手成功。代码示例(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)
语法
{ "jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["订阅名称", {可选参数}] }
- 响应
返回subscriptionId
(字符串),客户端需要保存,以便取消。
取消订阅(eth_unsubscribe)
语法
{ "jsonrpc": "2.0", "id": 1, "method": "eth_unsubscribe", "params": ["subscriptionId"] }
- 结果
布尔值:true
表示已取消,false
表示订阅不存在。
支持的四种订阅详解
newHeads:实时监听区块高度
- 作用
区块链每新增一个区块即推送新 Header。不携带内部交易详情,适合轻量级监控。 调用示例
{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}
- 数据字段预览
number
、hash
、parentHash
、timestamp
。
Logs:精准事件日志
- 支持条件
可选address
单地址或数组,配合topics
前缀匹配。 实战技巧
监听某个 Token 的转账事件:{ "method":"eth_subscribe", "params":["logs",{"address":"0x1234...","topics":["0xddf2..."]}] }
- chain reorg 处理
若发生回滚,旧日志会重新推送且removed:true
。
newPendingTransactions:抢先一步看到未确认交易
- 特点
只返回交易哈希 (txHash
),无 payload。适合 MEV、套利、风险监测。 - 常见问题
节点必须开启本地可签名账户,否则收不到该节点签名的交易。公共节点按策略决定是否开放。
syncing:节点同步状态广播
结果类型
- 布尔值
true / false
:开始 / 完成。 - 对象形式则包含
startingBlock / currentBlock / highestBlock
等字段,方便 UI 动态更新进度条。
- 布尔值
案例:监听链上 DEX 新增池子
假设你想实时监控新上线的 Uniswap-V2 风格流动性池「PairCreated」事件:
订阅方式
{ "jsonrpc":"2.0", "id":1, "method":"eth_subscribe", "params":["logs",{"address":"0x5C69...","topics":["0x0d3648..."]}] }
- 客户端去重
在链重组场景,removed:true
日志不要刷新缓存。 - 异常告警
若在一分钟内收到大量「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 秒速览
- 一句话总结:OKTC 的 WebSocket 就是「Ethereum PubSub + Tendermint 速度」的结合体。
- 最佳实践:newHeads 轮询 <5ms、Logs 加 Bloom、syncing 做 UX、newPendingTransactions 关注隐私合规。
- 下一步:把 OKTC WebSocket 接入 bot、DEX 前端或链上报警体系。记住,高性能实时数据靠的是节点距离和稳定带宽。
祝你链上风生水起,POOL 永远满仓,Gwei 永远归 0。