本指南介绍如何使用 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_subscribe 和 eth_unsubscribe,允许您监听 newHeads、logs、newPendingTransactions 和 syncing 事件。当您通过 WSS 连接时,您建立了一个持久的双向通道,事件发生时推送更新,而 HTTP 则需要轮询。
Flashblocks 是一个自定义扩展,它比规范的区块时间更频繁地发出区块头。Flashblocks 不是等待完整区块(在 Base 上通常为 2 秒),而是在区块头产生后立即流式传输,通常以亚秒级间隔。这是通过排序器发布中间状态根来实现的。要使用 Flashblocks,您可能需要指定自定义订阅类型或使用支持它们的提供商,例如 OnFinality 的 RPC 助手 中列出的那些。
- 标准订阅:
newHeads、logs、newPendingTransactions、syncing。 - Flashblocks 是 Base 特有的功能;并非所有提供商都支持。
- WebSocket 连接是有状态的;您必须处理重连。
使用 ethers.js 连接 Base RPC WebSocket
ethers.js 提供了一个 WebSocketProvider 类,简化了 WSS 端点的连接。下面是一个完整的示例,它订阅 Base 主网上的 newHeads 并记录区块号。确保您已安装 ethers(npm 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 支持。使用 createPublicClient 和 webSocket 传输。下面的示例订阅新的区块头并记录它们。使用 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 参考文档。
- 使用 OnFinality 的 RPC 助手 进行端点测试。
- 阅读 WebSocket RPC 断开连接修复。
- 考虑使用 OnFinality 的 API 服务 获取生产级访问。
Base RPC 速率限制、基础设施以及何时迁移到专用端点
公共 Base RPC 端点,包括 WebSocket 和 Flashblocks,是共享基础设施。它们实施速率限制以确保公平使用,这可能导致在高频请求或大量订阅负载期间出现节流或断开连接。Flashblocks 每 200 毫秒发出事件,而 WebSocket 订阅(例如 newHeads、logs)会显著增加请求数量,并可能迅速达到这些限制。
对于生产环境的应用,依赖公共端点存在风险,因为存在可变的延迟、速率限制和潜在的停机时间。如果您的应用需要一致的性能、高吞吐量或保证的正常运行时间,请考虑迁移到专用端点。专用端点提供更高的速率限制、专用资源和更好的可靠性。评估您的使用模式:如果您超过典型的公共限制或需要全天候稳定性,建议使用专用解决方案。有关更多详细信息,请参阅 Base RPC 端点指南。
- 公共端点是共享且受限的;在负载下可能发生节流。
- Flashblocks 和 WebSocket 订阅增加了请求频率,加剧了限制。
- 对于生产环境,评估您的需求;专用端点提供更高的限制和可靠性。