WebSocket 订阅
需要实时更新的应用——索引器、监控面板、实时 UI——用 WebSocket 订阅在事件发生时推送,而不是轮询。
端点
WebSocket 端点:
wss://rpc.bout.network
标准 eth_subscribe / eth_unsubscribe 方 法,JSON-RPC 2.0 协议。
支持的订阅主题
| 主题 | 用途 |
|---|---|
newHeads | 每个新区块触发。 |
logs | 匹配 filter 的事件触发。 |
newPendingTransactions | 每笔进入 mempool 的待定交易触发。 |
示例:订阅新区块
import { ethers } from "ethers";
const provider = new ethers.WebSocketProvider("wss://rpc.bout.network");
provider.on("block", (blockNumber) => {
console.log("New block:", blockNumber);
});
示例:订阅事件
const filter = {
address: "0xYourContractAddress",
topics: [ethers.id("Transfer(address,address,uint256)")]
};
provider.on(filter, (log) => {
console.log("Log:", log);
});
OXN 上加密交易的事件 topic 与 data 是加密的。含义见机密性模型——WebSocket 订阅者看到的是密文,只有他自己是产生事件的调用者时才能解密。
连接生命周期
重连。 WebSocket 连接会因网络条件周期性断开。应用应实现带指数退避的重连。
let provider;
function connect() {
provider = new ethers.WebSocketProvider("wss://rpc.bout.network");
provider._websocket.on("close", () => {
console.log("Connection closed, reconnecting in 5s");
setTimeout(connect, 5000);
});
provider._websocket.on("error", (err) => console.error("WS error:", err));
}
connect();
心跳。 部分部署发送 WebSocket ping 帧保持连接。你的客户端不响应就可能被断开。
连接限制
公共端点应用以下限制:
- 每源 IP 的并发连接数。 需要更多就自建节点。
- 每连接的订阅数。 需要时跨多个连接分布。
- 消息吞吐。 很嘈杂的订阅(例如繁忙链上的
newPendingTransactions)可能被限流。
大量 WebSocket 使用请通过支持渠道联系团队,或计划自建节点。
调试 WebSocket 问题
provider._websocket.on("message", (data) => {
console.log("Raw:", data.toString());
});
provider._websocket.on("close", (code, reason) => {
console.log("Closed:", code, reason.toString());
});
常见失败码:
1000——正常关闭1001——即将下线(服务器重启)1006——异常关闭(网络问题)1008——策略违规(通常是限流)
下一步
- JSON-RPC 概览——HTTP 对应
- 限流