本文详细介绍了WebSockets(WSS)在区块链应用中的重要性,以及如何使用QuickNode和Ethers.js创建和管理WebSocket连接。文章分为多个结构清晰的部分,涵盖了WebSocket的基本概念、如何建立与以太坊节点的连接、最佳实践以及相关代码示例,适合各级开发人员。最后,文章还提供了附加资源和反馈渠道。
你的决策速度只能与你的数据相匹配,拥有可靠、持久的连接对于区块链应用至关重要。本综合指南将带你了解 WebSockets (WSS) 的基础知识,将其与传统的 HTTP (超文本传输协议) 进行对比,并教你如何像专业人士一样管理你的 WebSocket 连接。无论你是编程新手还是经验丰富的开发者,这份指南都提供了你使用 QuickNode 和 Ethers.js 创建和管理 WebSocket 连接所需的一切内容。
依赖项 | 版本 |
---|---|
ethers | ^6.9.2 |
WebSocket 连接是一种通信协议,允许客户端与服务器之间进行实时、双向交互。与传统的 HTTP 请求不同,WebSockets 维护一个持久连接,从而允许不间断的数据交换,这对需要实时更新的应用程序(如金融交易所、聊天应用等)至关重要。虽然 HTTP 旨在用于一次性的请求-响应交互,但 WebSockets 在需要持续通信的场景中表现优异。
在处理像以太坊这样的区块链上下文中的 WebSockets 时,处理连接问题至关重要。WebSockets 的持久性意味着任何中断都可能导致数据丢失或通信中断。
WebSocket 连接可能掉线的主要原因包括:
一些可以实施的最佳实践以减轻这些问题包括:
你可以使用公共节点或部署和管理自己的基础设施;但是,如果你希望实现 8 倍的响应速度,可以将繁重的任务交给我们。免费注册账户 这里。
登录后,点击 创建端点 按钮,然后选择你想要部署的区块链和网络。为了本指南的目的,我们将选择 以太坊主网 区块链。创建端点后,保留 WSS 提供程序 URL,因后面编程部分会用到。
提示
虽然我们在本指南中使用以太坊主网演示 WebSocket 连接,但 QuickNode 也支持其他区块链(如 Base、Solana、Polygon、Arbitrum 等)上的 WebSockets。
创建了以太坊节点端点后,接下来让我们进入编程部分。
在本部分中,我们将向你展示如何使用 Ethers.js 创建和管理 WebSocket 连接。我们将使用 Node.js 和 QuickNode 以太坊节点端点与以太坊区块链进行通信。
第 1 步。 首先打开终端或命令提示符窗口,然后导航到你想要创建项目的目录。运行以下命令以初始化新的 package.json 文件。此文件将管理项目的依赖项和其他配置。
npm init -y
第 2 步。 你的代码需要 ethers 库。通过运行以下命令安装它:
npm install ethers
第 3 步。
在项目目录中创建一个新的 JavaScript 文件,例如 index.js。然后,将以下提供的代码复制到此文件中:
// 从 Ethers.js 中导入 ethers 库
const { ethers } = require('ethers');
// 以太坊节点 WebSocket URL 的配置
const config = { ETH_NODE_WSS: 'WSS_URL' };
// 使用控制台进行日志记录
const logger = console;
// WebSocket 连接管理的常量
const EXPECTED_PONG_BACK = 15000; // 等待 pong 响应的时间(以毫秒为单位)
const KEEP_ALIVE_CHECK_INTERVAL = 7500; // 发送 ping 消息的间隔(以毫秒为单位)
const MAX_RECONNECT_ATTEMPTS = 5; // 最大重连尝试次数
const RECONNECT_INTERVAL_BASE = 1000; // 重连的基本延迟(以毫秒为单位)
const SIMULATE_DISCONNECT_INTERVAL = 30000; // 模拟断开的间隔(例如:30 秒)
// 断开连接模拟功能的开关
const simulateDisconnect = true; // 设置为 false 以禁用断开连接模拟
// 跟踪重连尝试次数的变量
let reconnectAttempts = 0;
// 模拟断开连接的函数
function simulateBrokenConnection(provider) {
logger.warn('模拟断开的 WebSocket 连接');
provider.websocket.close();
}
// 启动并管理 WebSocket 连接的函数
function startConnection() {
// 使用以太坊节点 URL 初始化 WebSocket 提供程序
let provider = new ethers.WebSocketProvider(config.ETH_NODE_WSS);
// 管理保持活动机制的变量
let pingTimeout = null;
let keepAliveInterval = null;
// 调度重连尝试的函数
function scheduleReconnection() {
// 检查最大重连尝试次数是否未达到
if (reconnectAttempts < MAX_RECONNECT_ATTEMPTS) {
// 根据尝试次数计算重连的延迟
let delay = RECONNECT_INTERVAL_BASE * Math.pow(2, reconnectAttempts);
// 调度下一个重连尝试
setTimeout(startConnection, delay);
reconnectAttempts++;
logger.log(`在 ${delay} 毫秒后调度重连尝试 ${reconnectAttempts}`);
} else {
logger.error('已达到最大重连尝试次数,正在中止。');
}
}
// WebSocket 连接的 'open' 事件监听器
provider.websocket.on('open', () => {
reconnectAttempts = 0;
keepAliveInterval = setInterval(() => {
logger.debug('检查连接是否存活,发送 ping');
provider.websocket.ping();
pingTimeout = setTimeout(() => {
logger.error('未收到 pong,终止 WebSocket 连接');
provider.websocket.terminate();
}, EXPECTED_PONG_BACK);
}, KEEP_ALIVE_CHECK_INTERVAL);
// 如果启用了该功能,则安排模拟断开连接
if (simulateDisconnect) {
setTimeout(() => simulateBrokenConnection(provider), SIMULATE_DISCONNECT_INTERVAL);
}
});
// WebSocket 连接的 'close' 事件监听器
provider.websocket.on('close', () => {
logger.error('WebSocket 连接已关闭');
clearInterval(keepAliveInterval);
clearTimeout(pingTimeout);
scheduleReconnection();
});
// ping 的 pong 响应的事件监听器
provider.websocket.on('pong', () => {
logger.debug('收到 pong,连接正常');
clearTimeout(pingTimeout);
});
// 以太坊区块链中新块的事件监听器
provider.on('block', (blockNumber) => {
logger.log(`新块:${blockNumber}`);
});
// WebSocket 连接中的错误事件监听器
provider.on('error', (error) => {
logger.error('WebSocket 错误:', error);
scheduleReconnection();
});
}
// 启动连接
startConnection();
注意: 请记得将代码中的
QUICKNODE_WSS_URL
占位符替换为你的实际 QuickNode WebSocket URL。
在上面的脚本中,我们使用 Ethers.js 和其 WebSocket 类 ( 文档) 监听以太坊区块链上的新块,并在检测到时记录这些块,同时通过启动重连尝试来处理任何错误。
该脚本使用 startConnection()
函数建立和管理与以太坊节点的 WebSocket 连接。连接采用保持活动机制,定期发送 ping 消息,发送的间隔在 KEEP_ALIVE_CHECK_INTERVAL
中定义。如果在 EXPECTED_PONG_BACK
指定的时间框架内未收到 pong 响应,脚本会判断连接不活跃,从而终止连接并触发 scheduleReconnection()
函数。该函数尝试根据配置的最大重连尝试次数 ( MAX_RECONNECT_ATTEMPTS
) 重新建立连接,并实现指数递增的重试延迟策略,该策略由 RECONNECT_INTERVAL_BASE
决定。此外,脚本还包含一个布尔标志,用于在规定间隔内强制关闭 WebSocket 连接以触发断开连接,如 SIMULATE_DISCONNECT_INTERVAL
和 simulateDisconnect
所指定。此模拟断开连接用于测试目的,可以设置为 false
以供生产使用。
通过结合这些实践,你可以创建一个更具弹性和响应性的系统,保持与以太坊网络的稳定连接,智能处理任何中断。欲获取有关支持 WebSocket 连接的方法的详细指南,包括以太坊和 Solana,请访问我们的 QuickNode 文档:以太坊文档 和 Solana文档。在其他区块链上也提供额外的 WebSocket 支持。或者,如果你需要一个可靠的解决方案来实时跟踪不同区块链上的事件,而无需管理自己的脚本和基础设施,请查看 QuickAlerts 相关资源:QuickAlerts 概述 和 QuickAlerts 文档。
第 4 步。 现在,在终端中运行下面的命令来执行你的脚本:
node index.js
这将在你的 index.js 文件中执行代码,基本上通过 QuickNode 连接到以太坊网络并监听新块。
如果你想了解更多关于 WebSockets 和保持端点安全的内容,请查看以下资源:
这就是全部!我希望这份指南能够让你更好地了解 WebSockets 和维护与以太坊节点端点的稳定连接。
如果你有任何问题,请访问我们的 Discord 服务器或使用下面的表单提供反馈以获取帮助。通过关注我们的 Twitter (@QuickNode) 和 Telegram 公告频道,随时了解最新动态。
告诉我们 如果你有任何反馈或新主题的请求。我们期待你的消息。
- 原文链接: quicknode.com/guides/inf...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!