不再错过任何一个区块!用Node.js + WebSocket轻松实现区块链实时监控

news2024/9/23 11:39:18

文章目录

  • 前言
  • 一、WebSocket是什么?
  • 二、项目结构
  • 三、代码实现
    • 1. 后端实现
    • 2. 前端实现
  • 四、启动项目
  • 总结


前言

随着区块链技术的发展,实时监控区块链网络中的区块和交易信息变得越来越重要。无论是开发去中心化应用(DApp),还是构建区块链浏览器,实时获取链上信息对于确保数据的透明和安全都是关键。在这篇博客中,我们将介绍如何使用 Node.js 结合 ethers.js 库,实现对区块链私有链的区块事件监听,并通过 WebSocket 技术将这些信息实时推送到前端页面进行展示。

本文将带你一步步实现一个简洁的区块链监控应用,实时展示最新生成的区块以及其中的交易。通过这个项目,你不仅能学会如何与区块链节点交互,还能了解如何使用 WebSocket 技术在前后端之间建立实时通信。
在这里插入图片描述


一、WebSocket是什么?

WebSocket 是一种全双工通信协议,允许客户端和服务器之间建立持续的、双向的连接,能够进行实时数据的交换。与传统的 HTTP 协议不同,WebSocket 在最初使用 HTTP 握手建立连接后,连接就会保持打开状态,直到客户端或服务器主动关闭。这种特性使得 WebSocket 特别适合需要频繁数据更新的场景,比如在线聊天、实时通知、股票行情、多人在线游戏等。

WebSocket的特点:

  1. 全双工通信:客户端和服务器可以随时互相发送消息,而不需要客户端先发起请求。
  2. 低延迟:由于连接保持活跃,数据可以快速传输,减少了 HTTP 协议的重复握手、建立连接的开销。
  3. 节省带宽:WebSocket 只需要一次握手,后续的数据传输不需要像 HTTP 那样每次附带大量的头部信息。

WebSocket的工作原理:

  1. 握手:客户端通过 HTTP 发起握手请求,服务器接收到请求并返回握手应答,确认使用 WebSocket 连接。
  2. 数据传输:握手完成后,连接持续打开,双方可以随时发送和接收数据,而不需要重新建立连接。
  3. 关闭连接:当通信结束时,客户端或服务器可以发起关闭请求,断开连接。

WebSocket应用场景:

  • 在线游戏:支持实时游戏状态的更新。
  • 实时股票行情:提供秒级股票价格更新。
  • 在线聊天:实现消息的即时发送和接收。
  • 实时协作:支持多人同时编辑文档或绘图。

Node.js 环境中,可以使用如 ws 模块来搭建 WebSocket 服务器和客户端。

在本项目中,我们使用 WebSocket 来建立服务器与前端的连接,每当区块链上有新的区块生成时,后端会通过 WebSocket 将区块信息推送给前端,前端收到后更新界面。


二、项目结构

项目的文件结构如下:
在这里插入图片描述

三、代码实现

1. 后端实现

在后端部分,我们使用 ethers.js 库连接到本地运行的 Geth 私有链(如果不知道如何搭建本地私链的可以去以往搭建博客🚪查看搭建教程),启动之后这样就可以了
在这里插入图片描述

通过监听新区块的生成,我们将区块信息通过 WebSocket 实时发送到前端。server.js 的实现如下:

// server.js
const { ethers, JsonRpcProvider } = require('ethers');
const express = require('express');
const http = require('http');
const WebSocket = require('ws');

const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

// 连接到 Geth 私有链
const provider = new ethers.JsonRpcProvider('http://127.0.0.1:8888');

// 监听新块
provider.on('block', async (blockNumber) => {
    console.log(`New Block: ${blockNumber}`);
    const block = await provider.getBlock(blockNumber, true);

    console.log('block===:', block);
    console.log(block.transactions);

    const data = {
        blockNumber: block.number,
        blockHash: block.hash,
        timestamp: block.timestamp,
        transactions: block.transactions.map(tx => ({
            hash: tx,
        }))
    };

    console.log('data===:', data);

    // 通过 WebSocket 发送数据到客户端
    wss.clients.forEach(client => {
        if (client.readyState === WebSocket.OPEN) {
            client.send(JSON.stringify(data));
        }
    });
});

// 配置静态文件夹
app.use(express.static('public'));

// 启动服务器
server.listen(4000, () => {
    console.log('Server is listening on port 4000');
});

代码解读

  1. 依赖库引入: 我们使用 ethers.js 来连接 Geth 节点,使用 express 作为 HTTP 服务器,ws 库用于创建 WebSocket 服务。

  2. 连接 Geth 节点: 使用 ethers.JsonRpcProvider 来连接 Geth 节点。在此示例中,节点运行在 http://127.0.0.1:8888,即本地的私有链。

  3. 监听区块事件: 通过 provider.on('block', async (blockNumber) => {...}),每当有新块生成时,该函数会被触发。我们获取区块详细信息,并提取区块哈希、区块高度和交易哈希等数据。

  4. WebSocket 数据传输: 每当区块信息更新时,数据会通过 WebSocket 发送给所有连接的客户端。

  5. 服务器启动: 我们将 HTTP 服务器监听在 4000 端口,并通过 express.static 公开 public 文件夹中的静态文件。

2. 前端实现

前端部分非常简洁,主要用于展示最新的区块信息和交易哈希。index.html 文件的实现如下:

<!-- public/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Blockchain Monitor</title>
</head>
<body>
    <h1>Blockchain 监控</h1>
    <div id="output"></div>

    <script>
        const ws = new WebSocket('ws://localhost:4000');

        ws.onmessage = (event) => {
            const data = JSON.parse(event.data);
            const output = document.getElementById('output');

            const blockInfo = `
                <h2>区块高度: ${data.blockNumber}</h2>
                <h3>区块Hash: ${data.blockHash}</h3>
                <h3>timestamp: ${data.timestamp}</h3>
                
                <ul>
                    ${data.transactions.map(tx => ` <li> <strong>Transaction Hash:</strong> ${tx.hash}<br> </li> `).join('')}
                </ul>
            `;

            output.innerHTML = blockInfo;
        };

        ws.onopen = () => {
            console.log('Connected to WebSocket server');
        };

        ws.onclose = () => {
            console.log('Disconnected from WebSocket server');
        };
    </script>
</body>
</html>

代码解读

  1. WebSocket 连接: 前端通过 new WebSocket('ws://localhost:4000') 连接到后端的 WebSocket 服务器。

  2. 处理区块数据: 当收到来自服务器的区块数据时,通过 ws.onmessage 事件解析数据并更新页面。

  3. 页面展示: 页面显示最新区块的高度、区块哈希、时间戳以及该区块中的所有交易哈希。


四、启动项目

  1. 启动 Geth 私有链: 首先需要启动 Geth 私有链,并确保其监听在 http://127.0.0.1:8888

  2. 安装依赖: 在项目根目录下运行以下命令安装所需的依赖库:

npm install ethers express ws
  1. 启动服务器: 运行以下命令启动后端服务器:
node server.js
  1. 打开浏览器: 在vscode打开index.html,右键点击Open In Default Browser
    在这里插入图片描述
    你将看到最新的区块信息和交易哈希,例如:
    在这里插入图片描述
    在这里插入图片描述

通过这个示例,你可以进一步扩展功能,比如展示更多的区块详细信息、过滤特定交易、监控智能合约事件,或者是将区块数据在provider.on('block')事件中进行存储数据库的操作等,构建出功能丰富的区块链应用。
在这里插入图片描述


总结

通过本文,我们详细介绍了如何使用 Node.jsethers.js 库实现对 Geth 私有链的区块事件监听,并通过 WebSocket 技术将区块信息实时推送到前端。我们从 WebSocket 的基础概念讲起,展示了如何搭建一个全双工通信的实时系统,最终实现了一个区块链监控应用,能够实时展示最新生成的区块和交易信息。本文还包含了完整的后端与前端代码示例,帮助开发者掌握从监听区块事件到通过 WebSocket 进行前后端实时通信的整个过程。希望这篇文章能帮助你在区块链应用开发中实现更多实时数据交互的功能。如果你有任何疑问或建议,欢迎在评论区留言讨论🌹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【WebGIS实例】(17)下载瓦片底图并实现离线加载——以天地图为例

前言 在有些项目中&#xff0c;会有部署到无法访问互联网的内网环境中&#xff0c;这时候就会有离线部署应用和地图服务等需求了。 本博客是本着交流学习的目的&#xff0c;分享一个离线瓦片地图的获取方案&#xff0c;以天地图为案例&#xff0c;实现步骤&#xff1a; 安装…

读书笔记——DDIA-v2 设计数据密集型应用(第二版)

ddia-v2中文版地址&#xff1a;https://github.com/Vonng/ddia/tree/v2 ddia-v2看完感觉爱不释手&#xff0c;只要是数据相关的知识都娓娓道来&#xff0c;为什么会这样&#xff1f;现在是怎样的&#xff1f;这样有什么问题&#xff1f;其中的看法和想法实在精辟、干练&#xf…

典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式

先看代码与实现&#xff1a; 文件结构 triangle_area4.jsp <% page contentType"text/html;charsetUTF-8" pageEncoding"UTF-8" %> <html> <body> <%--<jsp:useBean>&#xff1a;用于在JSP中实例化JavaBean。在这里&#xff0c…

感知笔记1:ROS 视觉- 跟随红球

- 目录 - 如何在 ROS 中可视化 RGB 相机。如何作为机器人切换主题。如何创建 blob 检测器。如何获取要跟踪的颜色的颜色编码。如何使用 blob 检测数据并移动 RGB 相机以跟踪 blob。 机器人技术中最常见的传感器是不起眼的 RGB 摄像头。它用于从基本颜色跟踪&#xff08;blob 跟…

解决 TortoiseGitPlink Fatal Error:深入解析

解决 TortoiseGitPlink Fatal Error&#xff1a;深入解析 在 Windows 平台上&#xff0c;开发者使用 Git 和 TortoiseGit 进行版本控制时&#xff0c;有时会遇到 TortoiseGitPlink Fatal Error。该错误通常是在推送/拉取代码时&#xff0c;客户端未能提供正确的 SSH 密钥。 1…

Linux之实战命令06:locate应用实例(四十)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

Maven-四、继承

Maven进阶 文章目录 Maven进阶前言继承设置继承依赖管理总结 前言 一个项目中的不同模块可能引用的是同一个依赖&#xff0c;在这种情况下&#xff0c;单独在某个模块内引用太麻烦&#xff0c;于是maven使用继承的思想&#xff0c;在父模块中配置依赖包&#xff0c;其他需要这…

实战OpenCV之直方图

基础入门 直方图是对数据分布情况的图形表示&#xff0c;特别适用于图像处理领域。在图像处理中&#xff0c;直方图通常用于表示图像中像素值的分布情况。直方图由一系列矩形条&#xff08;也被称为bin&#xff09;组成&#xff0c;每个矩形条的高度表示某个像素值&#xff08;…

3.6 第四行之__ipipe_init_proc()

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 原创不易&#xff0c;需要大家多多鼓励&#xff01;您的关注、点赞、收藏就是我的创作动力&#xff01; 3.6 第四行之__ipipe_init_proc() __ipipe_init_proc()并不是直接在start_kernel中调用&#xff0c;它的…

JavaScript高级——事件循环模型

1、 2、所有代码分类 ① 初始化执行代码&#xff08;同步代码&#xff09;&#xff1a;包含绑定 dom 事件监听&#xff0c;设置定时器&#xff0c;发送 ajax 请求的代码 ② 回调执行代码&#xff08;异步代码&#xff09;&#xff1a;处理回调逻辑 3、js 引擎执行代码的基本流…

【Linux篇】网络编程基础(笔记)

目录 一、服务器模型 1. C/S 模型 2. P2P模型 二、服务器编程框架 1. I/O处理单元 2. 逻辑单元 3. 网络存储单元 4. 请求队列 三、网络编程基础API 1. socket 地址处理 API &#xff08;1&#xff09;主机字节序和网络字节序 &#xff08;2&#xff09;通用socket地…

论文阅读:A Generalization of Transformer Networks to Graphs

论文阅读&#xff1a;A Generalization of Transformer Networks to Graphs 论文地址1 摘要2 贡献Graph TransformerOn Graph Sparsity&#xff08;图稀疏&#xff09;On Positional Encodings&#xff08;位置编码&#xff09;3 Graph Transformer Architecture&#xff08;架…

GPT实现联网,NextChat插件的配置说明

简介 NextChat开源版本已支持插件调用。 不过&#xff0c;插件的配置略复杂&#xff0c;为了降低普通用户的配置难度&#xff0c;本文基于中转API做详细配置说明&#xff0c;后续如果有新增插件&#xff0c;本文也将同步更新配置说明。 在配置具体插件之前&#xff0c;你需要…

Spring后端直接用枚举类接收参数,自定义通用枚举类反序列化器

在使用枚举类做参数时&#xff0c;一般会让前端传数字&#xff0c;后端将数字转为枚举类&#xff0c;当枚举类很多时&#xff0c;很可能不知道这个code该对应哪个枚举类。能不能后端直接使用枚举类接收参数呢&#xff0c;可以&#xff0c;但是受限。 Spring反序列默认使用的是J…

The NCCoE’s Automation of the CMVP

Earlier today at the ICMC24, we heard from a panel about the US National Cybersecurity Center of Excellence’s (NCCoE) work on the Automated Cryptographic Module Validation Program (ACMVP), which intends to tackle the troublingly long queue times we’ve se…

Apifox 「定时任务」操作指南,解锁自动化测试的新利器

定时任务是按照预设时间自动执行的任务&#xff0c;它可以有效解决一些常见问题&#xff0c;比如频繁执行的回归测试和大规模的接口测试&#xff0c;这些任务需要在固定时间点或间隔周期内自动运行&#xff0c;以确保软件的持续集成和持续交付过程中的稳定性和可靠性。通过使用…

实操学习——个人资料的录入、修改、密码的修改

实操学习——个人资料的录入、修改、密码的修改 一、个人资料的录入和修改知识补充&#xff1a;装饰器二、密码的修改知识补充&#xff1a;docker的关闭与启动 一、个人资料的录入和修改 在users的app下创建一个用户详情表 from django.contrib.auth.models import User from…

C/C++逆向:switch语句逆向分析

在逆向分析中&#xff0c;switch语句会被编译器转化为不同的底层实现方式&#xff0c;这取决于编译器优化和具体的场景。常见的实现方式包括以下几种&#xff1a; ①顺序判断&#xff08;if-else链&#xff09;&#xff1a; 编译器将switch语句转化为一系列的if-else语句。这…

【第十四章:Sentosa_DSML社区版-机器学习时间序列】

目录 【第十四章&#xff1a;Sentosa_DSML社区版-机器学习时间序列】 14.1 ARIMAX 14.2 ARIMA 14.3 HoltWinters 14.4 一次指数平滑预测 14.5 二次指数平滑预测 【第十四章&#xff1a;Sentosa_DSML社区版-机器学习时间序列】 14.1 ARIMAX 1.算子介绍 考虑其他序列对一…

Flutter鸿蒙化(windows)

Flutter鸿蒙化&#xff08;windows&#xff09; 参考资料Window配置Flutter的鸿蒙化环境下载配置环境变量HarmonyOS的环境变量配置配置Flutter的环境变量Flutter doctor -v 检测的问题flutter_flutter仓库地址的警告问题Fliutter doctor –v 报错[!] Android Studio (version 2…