跳到主要内容

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——策略违规(通常是限流)

下一步