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

Base RPC WebSocket 连接:端点、Flashblocks 与可靠性

了解如何通过 WebSocket RPC 连接 Base 主网和 Sepolia,使用 Flashblocks 获取亚秒级区块事件,并使用 ethers.js 和 viem 构建可靠的订阅。

TL;DR

本指南介绍如何使用 Base RPC WebSocket 端点获取实时数据,包括 OP-Stack 订阅接口和 Flashblocks。提供了 ethers.js 和 viem 的可运行示例,讨论了重连策略,并提供了可靠性检查清单。

直接回答:Base RPC WebSocket 端点和 Flashblocks

Base RPC WebSocket 连接允许您订阅实时区块链事件,如新区块、待处理交易和日志。主要的 WSS 端点是 wss://base-rpc.publicnode.com(Base 主网)和 wss://base-sepolia-rpc.publicnode.com(Base Sepolia),但您也可以使用专用提供商(如 OnFinality 的 Base 网络页面)来获取托管端点。一个关键特性是 Flashblocks,它以亚秒级间隔流式传输区块事件,从而实现更快的 dApp 响应。本指南涵盖其机制,提供可运行的代码示例,并概述了可靠性的最佳实践。

Flashblocks 是 Base 的 OP-Stack 实现的一个文档化特性,但其确切节奏(例如 200ms 或 250ms)应参照 Base RPC 参考文档 或您的提供商文档进行验证,因为它可能因网络和配置而异。

  • 主网 WSS:wss://base-rpc.publicnode.com
  • Sepolia WSS:wss://base-sepolia-rpc.publicnode.com
  • Flashblocks 提供比传统 2 秒区块更快的区块事件流。

理解 Base RPC WebSocket 架构

Base 是一个 OP-Stack 汇总,这意味着它继承了以太坊 JSON-RPC 接口,包括 WebSocket 订阅。标准订阅方法是 eth_subscribeeth_unsubscribe,允许您监听 newHeadslogsnewPendingTransactionssyncing 事件。当您通过 WSS 连接时,您建立了一个持久的双向通道,事件发生时推送更新,而 HTTP 则需要轮询。

Flashblocks 是一个自定义扩展,它比规范的区块时间更频繁地发出区块头。Flashblocks 不是等待完整区块(在 Base 上通常为 2 秒),而是在区块头产生后立即流式传输,通常以亚秒级间隔。这是通过排序器发布中间状态根来实现的。要使用 Flashblocks,您可能需要指定自定义订阅类型或使用支持它们的提供商,例如 OnFinality 的 RPC 助手 中列出的那些。

  • 标准订阅:newHeadslogsnewPendingTransactionssyncing
  • Flashblocks 是 Base 特有的功能;并非所有提供商都支持。
  • WebSocket 连接是有状态的;您必须处理重连。

使用 ethers.js 连接 Base RPC WebSocket

ethers.js 提供了一个 WebSocketProvider 类,简化了 WSS 端点的连接。下面是一个完整的示例,它订阅 Base 主网上的 newHeads 并记录区块号。确保您已安装 ethersnpm install ethers)。

该示例使用公共端点,但对于生产环境,请考虑使用托管提供商(如 OnFinality 的 API 服务)以获得更高的可靠性和速率限制。

// npm install ethers
const { WebSocketProvider } = require("ethers");

const wsUrl = "wss://base-rpc.publicnode.com";
const provider = new WebSocketProvider(wsUrl);

async function subscribe() {
  provider.on("block", (blockNumber) => {
    console.log("New block:", blockNumber);
  });
}

subscribe().catch(console.error);

// To unsubscribe after 10 seconds:
setTimeout(() => {
  provider.off("block");
  provider.destroy();
  console.log("Unsubscribed and closed.");
}, 10000);

使用 viem 连接 Base RPC WebSocket

viem 是一个现代的 TypeScript 库,提供一流的 WebSocket 支持。使用 createPublicClientwebSocket 传输。下面的示例订阅新的区块头并记录它们。使用 npm install viem 安装 viem。

viem 的 watchBlockNumber 是一个高级包装器,自动处理重连,但您也可以使用 watchBlocks 获得更多控制。

// npm install viem
import { createPublicClient, webSocket } from 'viem';
import { base } from 'viem/chains';

const client = createPublicClient({
  chain: base,
  transport: webSocket('wss://base-rpc.publicnode.com')
});

const unwatch = client.watchBlockNumber({
  onBlockNumber: (blockNumber) => {
    console.log('New block:', blockNumber);
  },
});

// To stop watching after 10 seconds:
setTimeout(() => unwatch(), 10000);

使用 Flashblocks 获取亚秒级区块事件

Flashblocks 允许您以比标准 2 秒区块时间更快的速度接收区块事件。要使用它们,您需要一个支持 flashblocks 订阅类型的提供商。例如,一些提供商暴露了自定义方法,如带有 flashblocks 参数的 eth_subscribe 或专用端点。请查看您的提供商文档;OnFinality 的 Base RPC 参考 可能列出了支持的方法。

Flashblocks 的确切节奏并未标准化;这是文档化的行为,您应与提供商确认。例如,Base 的官方文档指出 Flashblocks 在主网上每 200ms 发出一次,但这可能会发生变化。始终在开发环境中进行测试。

  • Flashblocks 并非在所有端点上可用;请验证支持。
  • 它们对于实时 UI 很有用,但可能会增加客户端的负载。
  • 仅在需要亚秒级更新时使用它们;否则,标准区块就足够了。
// Example using viem with a hypothetical flashblocks transport
// This is illustrative; check your provider's API for exact usage.
import { createPublicClient, webSocket } from 'viem';
import { base } from 'viem/chains';

const client = createPublicClient({
  chain: base,
  transport: webSocket('wss://your-provider-flashblocks-endpoint')
});

// Assuming the provider emits 'block' events at flashblock cadence
const unwatch = client.watchBlocks({
  onBlock: (block) => {
    console.log('Flashblock:', block.number);
  },
});

预期结果及如何验证

当您运行 ethers.js 示例时,您应该看到每 2 秒(如果启用了 Flashblocks,则更快)记录一个新的区块号。区块号应该是连续递增的。要验证连接是否正常,您还可以调用 provider.getBlockNumber() 并将其与订阅输出进行比较。

对于 viem,watchBlockNumber 回调将触发最新的区块号。您可以与公共浏览器(如 Basescan)进行交叉检查。如果您没有看到更新,请检查您的网络连接、防火墙或端点可用性。

  • 预期输出:区块号随时间连续递增。
  • 使用 provider.getBlockNumber() 确认最新区块。
  • 如果没有事件,请通过 WebSocket 使用简单的 eth_blockNumber 调用进行测试。

WebSocket 连接的常见故障及修复

WebSocket 连接可能因网络不稳定、服务器超时或速率限制而断开。常见错误包括 'Connection closed'、'ETIMEDOUT' 或 'Unexpected server response'。要处理这些问题,请实现带有指数退避的自动重连。ethers.js 和 viem 都有内置的重连选项,但您可能需要自定义它们。

对于 ethers.js,您可以监听 'error' 和 'close' 事件并重新创建提供商。对于 viem,webSocket 传输有一个 reconnect 选项。此外,请考虑使用专用提供商,如 OnFinality 的 WebSocket RPC 断开连接修复 指南,以获取高级策略。

  • 实现带退避的重连以处理断开。
  • 使用心跳 ping 监控连接健康。
  • 使用多个端点进行故障转移。
  • 检查速率限制;公共端点可能会限制。
// Example reconnection logic for ethers.js
let provider;
let reconnectAttempts = 0;

function connect() {
  provider = new WebSocketProvider(wsUrl);
  provider.on('block', (blockNumber) => console.log('Block:', blockNumber));
  provider.on('error', (err) => {
    console.error('Error:', err);
    provider.destroy();
    reconnect();
  });
  provider.on('close', () => {
    console.log('Connection closed');
    reconnect();
  });
}

function reconnect() {
  const delay = Math.min(1000 * 2 ** reconnectAttempts, 30000);
  reconnectAttempts++;
  setTimeout(connect, delay);
}

connect();

Base RPC WebSocket 的权衡与限制

WebSocket 连接比 HTTP 更复杂,需要仔细的资源管理。它们保持持久连接,这会消耗内存和带宽,尤其是在有许多订阅的情况下。Flashblocks 增加了事件频率,这可能会压垮未针对高吞吐量数据优化的客户端。

公共端点通常有速率限制,并且可能不支持 Flashblocks。对于生产环境,请考虑商业提供商,如 OnFinality 的 定价 计划,它们提供更高的限制和专门的支持。此外,请注意 WebSocket 订阅不保证按顺序传递;您可能需要通过检查区块哈希来处理重组。

  • 持久连接比 HTTP 轮询需要更多资源。
  • Flashblocks 可能导致高事件频率;请相应设计您的客户端。
  • 公共端点可能有使用限制;使用托管提供商进行扩展。
  • 通过验证区块哈希来处理链重组。

后续步骤和更多资源

既然您了解了 Base RPC WebSocket 连接,您可以构建实时 dApp、监视器或分析工具。要深入了解,请探索 Base RPC 参考文档 以获取所有可用方法。如果您需要可靠的端点,请查看 OnFinality 的 Base 网络页面 以获取托管服务。

您还可以使用 OnFinality 的 RPC 助手 生成端点 URL 并测试它们。如需更多学习资源,请访问 OnFinality Learn 中心 获取有关 RPC 最佳实践和故障排除的指南。

Base RPC 速率限制、基础设施以及何时迁移到专用端点

公共 Base RPC 端点,包括 WebSocket 和 Flashblocks,是共享基础设施。它们实施速率限制以确保公平使用,这可能导致在高频请求或大量订阅负载期间出现节流或断开连接。Flashblocks 每 200 毫秒发出事件,而 WebSocket 订阅(例如 newHeadslogs)会显著增加请求数量,并可能迅速达到这些限制。

对于生产环境的应用,依赖公共端点存在风险,因为存在可变的延迟、速率限制和潜在的停机时间。如果您的应用需要一致的性能、高吞吐量或保证的正常运行时间,请考虑迁移到专用端点。专用端点提供更高的速率限制、专用资源和更好的可靠性。评估您的使用模式:如果您超过典型的公共限制或需要全天候稳定性,建议使用专用解决方案。有关更多详细信息,请参阅 Base RPC 端点指南

  • 公共端点是共享且受限的;在负载下可能发生节流。
  • Flashblocks 和 WebSocket 订阅增加了请求频率,加剧了限制。
  • 对于生产环境,评估您的需求;专用端点提供更高的限制和可靠性。

永远不用担心基础设施

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

开始