如何管理与你的以太坊节点端点的WebSocket连接

  • QuickNode
  • 发布于 2025-01-30 22:24
  • 阅读 30

本文详细介绍了WebSockets(WSS)在区块链应用中的重要性,以及如何使用QuickNode和Ethers.js创建和管理WebSocket连接。文章分为多个结构清晰的部分,涵盖了WebSocket的基本概念、如何建立与以太坊节点的连接、最佳实践以及相关代码示例,适合各级开发人员。最后,文章还提供了附加资源和反馈渠道。

概述

你的决策速度只能与你的数据相匹配,拥有可靠、持久的连接对于区块链应用至关重要。本综合指南将带你了解 WebSockets (WSS) 的基础知识,将其与传统的 HTTP (超文本传输协议) 进行对比,并教你如何像专业人士一样管理你的 WebSocket 连接。无论你是编程新手还是经验丰富的开发者,这份指南都提供了你使用 QuickNode 和 Ethers.js 创建和管理 WebSocket 连接所需的一切内容。

你将要做的

  • 学习 WebSockets (WSS) 的基本原理及其与 HTTP 的区别
  • 在 QuickNode 上设置以获取 WebSocket URL 的以太坊节点端点 (免费注册 这里)
  • 开发一个创建 WSS 连接并进行管理的脚本

你将需要的

依赖项 版本
ethers ^6.9.2

什么是 WebSockets (WSS)?

WebSocket 连接是一种通信协议,允许客户端与服务器之间进行实时、双向交互。与传统的 HTTP 请求不同,WebSockets 维护一个持久连接,从而允许不间断的数据交换,这对需要实时更新的应用程序(如金融交易所、聊天应用等)至关重要。虽然 HTTP 旨在用于一次性的请求-响应交互,但 WebSockets 在需要持续通信的场景中表现优异。

处理 WebSocket 连接

在处理像以太坊这样的区块链上下文中的 WebSockets 时,处理连接问题至关重要。WebSockets 的持久性意味着任何中断都可能导致数据丢失或通信中断。

WebSocket 连接可能掉线的主要原因包括:

  • 同步失败:如果你使用的节点落后于区块链的最新位置。
  • 过载:如果你使用的节点崩溃或资源不足,可能会停止对请求的响应,从而导致连接中断。
  • 中间件重启:在对区块链客户端进行补丁或升级时,连接可能会掉线。

一些可以实施的最佳实践以减轻这些问题包括:

  • 检测断开连接:与 HTTP 不同,WebSocket 连接可能会悄无声息地掉线,因此监测连接状态至关重要。这可以通过心跳机制实现,即在一定间隔向你的节点发送 ping 消息,以确保其仍在正常工作。
  • 自动重连:实施一种策略,在连接掉线后自动重新建立连接。这可以通过重连逻辑实现,因此一旦你的脚本检测到断开连接,它就会尝试重新连接。
  • 错误处理:知道可能出现的错误,同时适当地响应和记录它们,以理解并纠正潜在问题。

使用 QuickNode 创建以太坊节点端点

你可以使用公共节点或部署和管理自己的基础设施;但是,如果你希望实现 8 倍的响应速度,可以将繁重的任务交给我们。免费注册账户 这里

登录后,点击 创建端点 按钮,然后选择你想要部署的区块链和网络。为了本指南的目的,我们将选择 以太坊主网 区块链。创建端点后,保留 WSS 提供程序 URL,因后面编程部分会用到。

以太坊主网 QuickNode 端点

提示

虽然我们在本指南中使用以太坊主网演示 WebSocket 连接,但 QuickNode 也支持其他区块链(如 Base、Solana、Polygon、Arbitrum 等)上的 WebSockets。

创建了以太坊节点端点后,接下来让我们进入编程部分。

练习:实现和管理 WebSocket 连接

在本部分中,我们将向你展示如何使用 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_INTERVALsimulateDisconnect 所指定。此模拟断开连接用于测试目的,可以设置为 false 以供生产使用。

通过结合这些实践,你可以创建一个更具弹性和响应性的系统,保持与以太坊网络的稳定连接,智能处理任何中断。欲获取有关支持 WebSocket 连接的方法的详细指南,包括以太坊和 Solana,请访问我们的 QuickNode 文档:以太坊文档Solana文档。在其他区块链上也提供额外的 WebSocket 支持。或者,如果你需要一个可靠的解决方案来实时跟踪不同区块链上的事件,而无需管理自己的脚本和基础设施,请查看 QuickAlerts 相关资源:QuickAlerts 概述QuickAlerts 文档

第 4 步。 现在,在终端中运行下面的命令来执行你的脚本:

node index.js

这将在你的 index.js 文件中执行代码,基本上通过 QuickNode 连接到以太坊网络并监听新块。

WebSocket 输出

附加资源

如果你想了解更多关于 WebSockets 和保持端点安全的内容,请查看以下资源:

最终想法

这就是全部!我希望这份指南能够让你更好地了解 WebSockets 和维护与以太坊节点端点的稳定连接。

如果你有任何问题,请访问我们的 Discord 服务器或使用下面的表单提供反馈以获取帮助。通过关注我们的 Twitter (@QuickNode) 和 Telegram 公告频道,随时了解最新动态。

我们 ❤️ 反馈!

告诉我们 如果你有任何反馈或新主题的请求。我们期待你的消息。

  • 原文链接: quicknode.com/guides/inf...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。