Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
网络与协议指南12 分钟阅读

Polygon WebSocket RPC:WSS 端点、eth_subscribe 与重连

了解如何连接 Polygon PoS WebSocket RPC 端点,订阅 newHeads 和 logs,处理重连,并避免常见陷阱。

TL;DR

本指南介绍如何使用 Polygon WebSocket RPC 获取 Polygon PoS 的实时数据,涵盖 WSS 端点、eth_subscribe 方法、连接生命周期以及包含重连逻辑的可运行 Node.js 示例。

直接回答:关于 Polygon WebSocket RPC 你需要了解什么

Polygon WebSocket RPC (WSS) 允许你从 Polygon PoS 网络接收实时区块链事件。Polygon 主网的主要 WSS 端点是 wss://polygon-bor-rpc.publicnode.com,Amoy 测试网是 wss://polygon-amoy-bor-rpc.publicnode.com。你也可以使用来自 OnFinality、Ankr 或 Dwellir 等提供商的特定端点。通过 eth_subscribe,你可以监听新区块、待处理交易以及匹配特定过滤器的日志。本指南涵盖机制、可运行示例以及常见断连问题的故障排除。

重要提示:本文介绍的是 Polygon 区块链(MATIC/POL),而非 polygon.io(一个独立的股票市场数据提供商)。如果你在寻找金融市场数据,那是另一项服务。

  • 主网 WSS:wss://polygon-bor-rpc.publicnode.com
  • 测试网 WSS (Amoy):wss://polygon-amoy-bor-rpc.publicnode.com
  • 方法:eth_subscribe 配合 newHeadslogsnewPendingTransactionssyncing

Polygon 架构:Bor 和 Heimdall

Polygon PoS 使用两层架构:Bor(区块生产者层,兼容 EVM)和 Heimdall(验证者层,基于 Tendermint)。Bor 以快速节奏(约 2 秒)生成区块,而 Heimdall 定期将这些区块检查点到以太坊。这意味着当你订阅 Polygon WSS 端点上的 newHeads 时,你会收到每个 Bor 区块的通知,但数据可能不会立即最终确定,直到 Heimdall 检查点被确认。对于大多数用例来说,这没问题,但要注意 Bor 上可能的重组。

Polygon PoS 的区块时间约为 2 秒,因此你会收到大量 newHeads 通知。这对于速率限制和连接稳定性很重要。

  • Bor:每约 2 秒生成区块
  • Heimdall:将区块检查点到以太坊,提供最终性
  • 数据新鲜度:newHeads 是实时的,但在检查点之前并非最终

Polygon 主网和测试网的 WSS 端点

你可以使用公共端点或提供商端点。公共端点是免费的,但通常有速率限制,并且可能断开空闲连接。提供商端点(如 OnFinality)提供更高的可靠性和专门支持。始终查看最新文档以获取最新的 URL。

以下是一些常用的 WSS 端点(由各提供商记录):

  • PublicNode:wss://polygon-bor-rpc.publicnode.com(主网),wss://polygon-amoy-bor-rpc.publicnode.com(Amoy 测试网)
  • Ankr:wss://rpc.ankr.com/polygon(主网),wss://rpc.ankr.com/polygon_amoy(测试网)
  • Dwellir:wss://polygon-rpc.dwellir.com(主网)
  • OnFinality:可通过你的 API 密钥使用,参见 API 服务

eth_subscribe:方法和负载

eth_subscribe 方法允许你订阅实时事件。标准订阅包括:

newHeads:通知你新区块头。负载包括区块号、哈希、父哈希、时间戳和其他头部字段。

logs:通知你匹配过滤器(地址和主题)的日志。这对于跟踪合约事件很有用。

newPendingTransactions:通知你进入交易池的交易哈希。请注意,这可能数量很大,并且并非所有提供商都支持。

syncing:当节点开始或停止同步时通知你。很少使用。

  • 请求格式:{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}
  • 响应:{"jsonrpc":"2.0","id":1,"result":"0x9cef..."}(订阅 ID)
  • 通知:{"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0x9cef...","result":{...}}}
// 订阅日志的示例请求
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_subscribe",
  "params": ["logs", {"address": "0x...", "topics": ["0x..."]}]
}

使用 ethers.js 和 web3.js 连接

你可以使用 ethers.js 或 web3.js 连接到 WSS 端点。使用 ethers.js 时,使用 new ethers.WebSocketProvider(url)。使用 web3.js 时,使用 new Web3.providers.WebsocketProvider(url)。两者都通过提供者的 on 方法支持 eth_subscribe

下面是一个使用 ethers.js 的可运行 Node.js 示例,它连接到 Polygon 主网,订阅 newHeads 和 logs,并包含带有重新订阅的重连循环。

const { ethers } = require('ethers');

const WSS_URL = 'wss://polygon-bor-rpc.publicnode.com';
let provider;
let subscriptionIds = [];

async function connect() {
  console.log('正在连接 Polygon WSS...');
  provider = new ethers.WebSocketProvider(WSS_URL);

  provider.on('error', (error) => {
    console.error('WebSocket 错误:', error);
    reconnect();
  });

  provider.on('close', () => {
    console.log('WebSocket 已关闭。正在重新连接...');
    reconnect();
  });

  // 订阅 newHeads
  const headSub = await provider.send('eth_subscribe', ['newHeads']);
  subscriptionIds.push(headSub);
  provider.on('newHeads', (head) => {
    console.log('新区块:', head.number);
  });

  // 订阅日志(示例:USDT 转账事件)
  const logSub = await provider.send('eth_subscribe', ['logs', {
    address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F', // Polygon 上的 USDT
    topics: [ethers.id('Transfer(address,address,uint256)')]
  }]);
  subscriptionIds.push(logSub);
  provider.on('logs', (log) => {
    console.log('日志:', log.transactionHash);
  });

  console.log('订阅已激活:', subscriptionIds);
}

function reconnect() {
  if (provider) {
    provider.removeAllListeners();
    provider.destroy();
  }
  setTimeout(connect, 5000); // 等待 5 秒后重新连接
}

connect();

// 预期输出:新区块号和交易哈希的日志
// 脚本将持续运行,并在断开连接时重新连接。

重连和重新订阅策略

公共 WSS 端点通常会在超时(例如 60 秒)或客户端超过速率限制时断开空闲连接。为了保持可靠的流,你需要实现心跳和重连逻辑。上面的示例在关闭时重新连接,但你还应该定期发送 ping 帧以保持连接活跃。许多库会自动执行此操作,但你也可以使用计时器,如果在某个间隔内没有收到任何通知,则再次发送 eth_subscribe

重新连接时,你必须重新订阅所有订阅,因为之前的订阅 ID 已失效。此外,要准备好处理重复通知:如果你重新连接并重新订阅,可能会收到相同的区块或日志两次。使用幂等处理(例如,跟踪已处理的区块号或交易哈希)以避免重复计数。

  • 心跳:每 30-60 秒发送一次 ping(例如,使用 provider.send('eth_subscribe', ['newHeads']) 作为保持活动,或使用 WebSocket ping 帧)
  • 重新订阅:重新连接时,重新发出所有订阅
  • 重复处理:维护一组已见区块号或日志哈希
  • 退避:对重连尝试使用指数退避,以避免压垮服务器

常见故障和故障排除

以下是你可能遇到的常见问题以及如何修复它们。

订阅超额代码:某些提供商在订阅过多时返回错误代码,如 -32005(超出限制)。减少订阅数量,或使用包含多个地址/主题的单个过滤器。

每 IP 连接限制:公共端点通常限制每个 IP 的并发连接数。如果达到此限制,请使用限制更高的提供商或轮换端点。

区块高度滞后:如果你的节点落后,你可能会收到过时数据。检查提供商的同步状态,并考虑使用专用端点。

  • 错误 -32005:订阅过多。合并过滤器。
  • 连接限制:使用限制更高的提供商或多个端点。
  • 滞后:监控区块高度并与参考(例如 Polygonscan)进行比较。
  • 空闲断开:实现心跳和重连。
  • 速率限制:使用速率限制更高的提供商或降低请求频率。

权衡和限制

WebSocket RPC 非常适合实时应用,但它有局限性。公共端点可能不支持 newPendingTransactions,因为数据量很大。此外,如果你订阅像 USDT 这样的热门合约,logs 订阅可能会很重。使用过滤器来缩小数据范围。

对于高吞吐量的生产环境,请考虑使用像 OnFinality 这样的专用提供商,它提供 RPC 定价API 服务,并保证正常运行时间。另外,请注意 WebSocket 连接是有状态的,因此你需要优雅地处理重连。

有关断连修复的更多信息,请参阅我们的 通用 WebSocket RPC 断连修复。有关性能考虑,请查看 Polygon RPC 延迟和性能

后续步骤和进一步阅读

既然你了解了 Polygon WebSocket RPC,你就可以构建实时应用,如交易监控器、DEX 套利机器人或 NFT 铸造追踪器。有关更多详细信息,请参阅 docs.polygon.technology 上的官方 Polygon 文档。

OnFinality Learn 中心 探索更多指南。如果你需要 Polygon RPC 帮助,请参阅我们的 Polygon RPC 指南(RPC 助手)。有关 Polygon 网络的一般信息,请访问 Polygon 网络页面

永远不用担心基础设施

OnFinality 消除了 DevOps 的繁重工作,让您能够更聪明、更快地构建。

开始