WebSocket 已经成为实时获取链上事件的最主流手段之一。本文将围绕 WebSocket API、OKTC 事件订阅、以太坊兼容 PubSub 等核心关键词,一步一步讲解如何快速接入 OKTC 主网,并彻底搞懂常见订阅类型的返回值与实践用法。读完即可无缝集成到你的去中心化应用(DApp)或链上机器人中。
一、什么让 OKTC 的 WebSocket 如此与众不同?
OKTC 采用 Tendermint Core 做共识引擎,同时又通过 Cosmos SDK 扩展模块实现 以太坊 RPC 兼容性(Web3 兼容)。这意味着:
- 事件源头:来自 Tendermint 的事件格式;
- 输出格式:自动 转译成以太坊风格的 PubSub JSON-RPC;
- 开发者零认知负担:你在 MetaMask、golang-ethclient、ethers.js 中用的 WebSocket 方法,全部沿用即可。
开发者无需关心兼容层内部细节,也无需升级 SDK,直接连接 WebSocket 端口即可。
二、开局第一步:建立连接
节点启动时带上参数,默认端口 8546:
exchaind start ... --wsport 8546成功后,用任何标准 WebSocket 客户端即可连接,比如 Node 的 ws 包、Python 的 websocket-client,甚至浏览器原生 WebSocket:
const ws = new WebSocket('ws://localhost:8546');👉三分钟学会用浏览器调试 OKTC WebSocket 的 5 个高效技巧
三、创建与取消订阅
3.1 创建订阅
调用 eth_subscribe,例如订阅新区块:
{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}成功后,将收到唯一订阅 ID:
{"jsonrpc":"2.0","result":"0x1c2e0c2c5f87f2e9","id":1}3.2 取消订阅
发送带有订阅 ID 的 eth_unsubscribe:
{"jsonrpc":"2.0","id":1,"method":"eth_unsubscribe","params":["0x1c2e0c2c5f87f2e9"]}系统会返回布尔结果 true/false,告诉你是否成功。
四、四大核心订阅类型
| 订阅名称 | 事件触发场景 | 可选参数 |
|---|---|---|
| newHeads | 每产生一个新区块头 | 无 |
| logs | 满足过滤条件的日志 | 地址、主题 |
| newPendingTransactions | 每出现一笔新 Pending Tx Hash | 无 |
| syncing | 节点开始/结束同步 | 无 |
以下详解每种使用场景。
4.1 newHeads:秒级捕捉区块链心跳
参数:无
使用场景:
- DApp 需要每隔 6s 左右渲染最新区块高度;
- 链上机器人监听网络延迟、区块重组预警。
示例请求:
{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}返回片段:
{"params":
{"result":
{"number":"0x15F8F4","hash":"0x…","parentHash":"0x…","timestamp":"0x…"}
},
"method":"eth_subscription",
"jsonrpc":"2.0"
}4.2 logs:精准追踪合约事件
参数 object:
address:单地址或地址数组,SQL 的IN功能一样。topics:事件主题的并/交集过滤。支持通配符 null。
使用场景:
- NFT 市场监听 Transfer 事件;
- DeFi 前端实时更新用户质押收益日志。
示例:只关心 USDT 的转账
{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["logs",{"address":"0x55d398326f99059fF775485246999027B3197955","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]}]}链重组时,你会收到同一个 Tx Hash、但 removed:true 的负向日志,用于回滚 UI 状态。
4.3 newPendingTransactions:抢占 MEV 策略的雷达
无需参数,每出现一笔新 Pending Tx,推送哈希:
{"params":{"result":"0x3bbf…"},"method":"eth_subscription"}常见用途:
- 抢跑、套利用机器人;
- 区块链浏览器“零确认”列表。
重要提醒:Tx 在不同 Peer 之间可能有差异,切勿完全信赖 Pending 状态。
4.4 syncing:节点世界里的“Wi-Fi 信号强度”
无参数。
节点开始同步时返回:
{"params":{"result":true},"method":"eth_subscription"}同步完成后返回 false。若返回一个对象,则携带详细同步指标 currentBlock、highestBlock、pulledStates。
组件库可以实现“节点未同步时展示进度条”。
五、FAQ:10 个高频疑问瞬间解答
Q1:我该用 wss 还是 ws?
wss 相当于 HTTP 里的 https,上线环境务必用 wss 且配置证书,否则浏览器安全策略会阻断连接。
Q2:如何测试主网是否开放?
OKTC 主网公开地址 wss://exchainws.okex.org:8443,浏览器 DevTools 直接 new WebSocket 即可验证。
Q3:同一连接能同时订阅多个事件吗?
可以。每条 eth_subscribe 都会返回独立 ID,互不干扰,只需在客户端建一张 "ID=>订阅意图" 字典即可。
Q4:为什么 logs 收到重复 Tx?
链重组会造成回滚和重新打包,DeFi DApp 应在 UI 层根据 removed 字段做回退或抹零处理。
Q5:订阅最多保留多久?
目前未设计 TTL,维持长连接即可。断线需重新握手。
Q6:如何防止火墙或 Nginx 关闭长连接?
设置心跳帧(ping-pong),或在网关配置 proxy_read_timeout 86400s。
Q7:可以用第三方框架吗?
ethers.js、web3.js、python-web3 全部支持,示例代码一模一样。
Q8:WebSocket 速率有上限吗?
默认单 IP 限 300 连接,单连接 300 次/秒推送。超高并发请适时拉取 REST API 分批处理。
Q9:能订阅特定高度区间的 logs 吗?
不能。eth_subscribe 只能实时向后监听;历史块使用 REST 的 eth_getLogs。
Q10:监控错误码怎么看? -32000 一般为参数格式错误,-32601 说明方法不存在。记录完整 JSON-RPC 体再排查。
六、实战小结:最小可运行 Demo(Node.js)
安装依赖:
npm i ws代码:
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"]
}));
});
ws.on('message', (msg)=> {
const data = JSON.parse(msg);
if (data.method === 'eth_subscription') {
console.log('新区块号:', Number(data.params.result.number));
}
});掌握以上要点,你已拥有 OKTC WebSocket 接口 核心关键词(WebSocket API、OKTC 事件订阅、以太坊兼容性 PubSub、newHeads、logs、newPendingTransactions、节点同步 monitoring)的全部知识与实战技巧。下一次升级 DApp 时,记得给实时数据通道换上“长连接、低延时、零差异”的 WebSocket 方案,让用户感受丝滑区块链体验!