Web3.js 4.x版本事件监听详解:从HTTP到WebSocket的迁移

项目场景

在一个使用以太坊区块链技术的项目中,需要监听智能合约的事件,以便在事件触发时能够及时响应。项目中使用了web3.js库的4.x版本,节点使用Geth启动,并通过HTTP与节点进行通信。
在这里插入图片描述


问题描述

合约DataStorage.sol文件已经定义好了如下如下两个事件

通过hardhat项目进行编译部署得到合约,在编译得到的ABI中同样存在事件,编译部署全都正常
在这里插入图片描述

此时启动一个nodejs后端服务去用web3调用监听事件,首先通过geth结点实例化一个web3对象
在这里插入图片描述
web3.eth.Contract(ABI, ADDRESS)实例化合约,以下为监听事件的代码:
在这里插入图片描述
但是当触发该事件后,并没有进行监听,控制台也没出现任何打印或是其它信息


原因分析

经过查阅资料🚪及web3官方文档🚪后我发现原因为如下两个:

  1. 事件监听必须使用WebSocketHTTP协议单向无法监听到事件
    WebSocket vs HTTP:
    HTTP协议只能单向通信,客户端需要不断发送请求以轮询获取更新,这在实时性要求高的场景下效率较低。
    WebSocket协议支持双向通信,服务端可以主动推送消息到客户端,客户端也可以主动向服务器发送信息(注意 Express 服务在与节点程序通信时,节点是作为服务端角色)适合事件监听这种需要实时响应的场景。

  2. web3.js 4.x版本下监听事件已经不支持用回调函数,得通过返回的对象来.on监听对象'data'或者'error'
    web3.js 4.x版本变化:
    web3.js 4.x版本中,监听事件时不再支持通过回调函数的方式,而是需要使用返回的对象并通过on方法来监听dataerror事件。这种方式更符合现代JavaScript的事件处理模式,也更具可读性和维护性。


解决方案

1. 启动WebSocket服务

如果是使用 geth 节点需要使用选项 --ws 开启服务,开发使用的Ganache默认开启了WebSocket服务。

geth --datadir "." --dev --dev.period 2 --http --http.api eth,web3,net --http.corsdomain "http://remix.ethereum.org" --password password.txt --http.port 8888 --ws --ws.api eth,web3,net --ws.origins "*" --ws.addr "127.0.0.1" --ws.port 8546

2. 初始化Web3并使用WebSocketProvider

在初始化web3时,使用了 WebsocketProvider来初始化Web3实例,通过 WebSocket 通信协议与节点通信

const { Web3 } = require('web3');
const web3 = new Web3(new Web3.providers.WebsocketProvider('ws://127.0.0.1:8546'));

3. 定义和监听智能合约事件

每个事件监听器应该独立定义,监听事件时,不再使用回调函数,而是使用 on 方法来监听 dataerror 事件。

const contract = new web3.eth.Contract(contractABI, contractAddress);// 监听合约事件并记录日志
const dataStoredSubscription = contract.events.DataStored({fromBlock: 'latest'
});dataStoredSubscription.on('data', event => {console.log('DataStored event:', event.returnValues);
});
dataStoredSubscription.on('error', error => {console.error('Error on DataStored event:', error);
});

通过以上步骤,可以实现对智能合约事件的实时监听,并且能够处理可能发生的错误。这样既提高了代码的可读性和维护性,又确保了事件监听的实时性和可靠性。

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

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

相关文章

学习c语言第16天(数据的存储)

一、数据类型的介绍 c语言基本的内置类型 类型的意义: 1.使用这个类型开辟内存空间的大小(大小决定了使用范围) 2.如何看待内存空间的视角 1.类型的基本归类 整形家族 字符的本质是ASCII码值,是整形 int a等于 signed int a char稍微特殊一些…

新书速览|动手学PyTorch建模与应用:从深度学习到大模型

《动手学PyTorch建模与应用:从深度学习到大模型》 本书内容 《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。《动手学PyTorch建模与应用:从深度学习到大模型》共11章,第1章主要介绍深度学习的概念…

Python --Pandas库基础方法(2)

文章目录 Pandas 变量类型的转换查看各列数据类型改变数据类型 重置索引删除行索引和切片seriesDataFrame取列按行列索引选择loc与iloc获取 isin()选择query()的使用排序用索引排序使用变量值排序 修改替换变量值对应数值的替换 数据分组基于拆分进行筛选 分组汇总引用自定义函…

优思学院|抽样检验的概念和21种抽样方式

抽样检验的概念 根据事先制定的抽样方案,从一批产品中随机抽取一部分作为样品,以这部分样品的检验结果,对整批产品质量合格与否作出判定的活动过程,称为抽样检验。除了用于质量控制之外,抽样检验同样适用于在六西格玛…

AI工作流程设计的自动化优化:微软与斯坦福的新成果 - Trace

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

学习网络安全 为什么Linux首择Kali Linux? 以及如何正确的使用Kali Linux

1.什么是kali linux? Kali Linux是一款基于Debian的Linux发行版,主要用于网络安全测试和渗透测试。它由全球顶尖的安全专家和黑客社区维护开发,提供了丰富的工具和资源,用于测试安全性、漏洞利用和渗透测试。此外,Kal…

修复msvcp120.dll丢失的问题的几种简单方法,msvcp120.dll是什么

在使用电脑时,你可能会遭遇一个提示称“msvcp120.dll丢失”的错误信息。这个问题比较普遍,主要是因为你的系统中缺失了某个特定的动态链接库(DLL)文件。msvcp120.dll是由 Microsoft Visual C 可再发行包提供的关键文件&#xff0c…

一键切换阿里yum源(包括其他系统repo镜像查找方法)

一键切换阿里yum源 示例命令其他系统repo镜像GitHub文档 示例命令 # 备份旧源 mv CentOS-Base.repo CentOS-Base.repo.bak # 添加新源(阿里镜像源) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo其他系统repo镜像 这里的示例是用…

链表篇-02.从尾到头打印链表(反转链表)

解题思路: 链表从尾到头打印链表, 我的思路是 用三个指针,第一个指针(pre)指向指向头节点的前一个位置,第二个指针(cur)指向头节点, 然后依次往后执行,第三个指针用于临时记录第二个指针的下一个位置。 代码详情: import java.…

2024年中职云计算实验室建设及云计算实训平台整体解决方案

随着信息技术的飞速发展,云计算作为新一代信息技术的核心,正逐步渗透到各行各业,成为推动数字化转型的重要力量。为了适应这一趋势,中职教育作为技能型人才培养的重要阵地,亟需加强云计算实验室建设与云计算实训平台的…

【Linux】CentOS更换国内阿里云yum源(超详细)

目录 1. 前言2. 打开终端3. 确保虚拟机已经联网4. 备份现有yum配置文件5. 下载阿里云yum源6. 清理缓存7. 重新生成缓存8. 测试安装gcc 1. 前言 有些同学在安装完CentOS操作系统后,在系统内安装比如:gcc等软件的时候出现这种情况:&#xff08…

【C++进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解

前言: 在前面,我们已经学习了很多存储机构,包括线性存储、树性存储等,并学习了多种拓展结构,效率也越来越高,但是是否有一种存储结构可以在大部分问题中都一次找到目标值呢?哈希可能能实现 目录…

Maven已经导入Junit包,但是还是无法使用注解

Maven已经导入Junit包&#xff0c;但是还是无法使用注解 背景&#xff1a; 导入了Junit的依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></d…

【初阶数据结构题目】2.移除元素

文章目录 顺序表算法题代码&#xff1a; 顺序表算法题 点击链接做题 移除元素 思路&#xff1a;定义两个变量指向数组第一个位置&#xff0c;判断nums[src]是否等于val 相等&#xff0c;src不相等&#xff0c;nums[dst] nums[src],src,dst 代码&#xff1a; int removeElem…

如何使用CANoe自带的TCP/IP Stack验证TCP的零窗口探测机制

如果想利用CANoe自带的TCP/IP协议栈验证TCP的零窗口探测机制,就必须添加一个网络节点并配置独立的CANoe TCP/IP协议栈,作为验证对象。而与它进行TCP通信的对端也是一个网络节点,但不要配置TCP/IP协议栈,而是使用CAPL代码在底层组装TCP报文模拟TCP通信过程。这样可以尽量减少…

轻松入门Linux—CentOS,直接拿捏 —/— <1>

一、什么是Linux Linux是一个开源的操作系统&#xff0c;目前是市面上占有率极高的服务器操作系统&#xff0c;目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…

基于Drone实现CI/CD【0到1架构系列】

CI/CD是持续性集成和持续性部署&#xff0c;简单来讲就是自动化构建和自动化部署。目前有很多集成方案&#xff0c;也有很多组装方案&#xff0c;只要能实现自动化构建出制品&#xff0c;再自动部署到生产环境就行。 目前很多源代码都集成了CI/CD功能&#xff0c;drone也是目前…

还在用JVM跑你的Java代码吗?太慢了,试试Oracle的GraalVM吧

前言 对于Java开发者们来说&#xff0c;几乎每天都在和JVM打交道&#xff0c;然而JVM即将过时了。那些对新技术保持敏锐洞察力的开发者&#xff0c;可能已经在生产环境中部署GraalVM生成的二进制程序了&#xff0c;小伙伴们&#xff0c;你们已经用起来了吗&#xff1f; Graal…

【初阶数据结构题目】3.删除有序数组中的重复项

文章目录 顺序表算法题代码&#xff1a; 顺序表算法题 点击链接做题 删除有序数组中的重复项 思路&#xff1a;定义两个指针变量。dst指向数组第一个位置&#xff0c;src指向数组第二个位置。判断nums[dst]是否等于nums[src] 相等&#xff0c;src不相等&#xff0c;dst,nums[…

Windows 11 桌面模拟

Windows 11 桌面模拟 文章目录 Windows 11 桌面模拟代码结构HTML结构CSS样式JavaScript功能 源码效果图 代码结构 HTML结构 <html>: HTML文档的根元素。<head>: 包含文档的元数据&#xff0c;如标题和样式。<base>: 指定相对URL的基准。<title>: 指定…