ethers事件监听

事件监听(Event Listening)在 Web3 开发中扮演着"报警器"的角色。它的主要工作是:当区块链上的智能合约触发了某个动作时,实时通知你的前端网页或后端程序。

由于区块链的交易打包需要时间(通常几秒到十几秒),你不能像调用传统 API 那样立即得到结果。监听就是解决这种"异步性"的最佳方案。


1. 它是如何工作的?

监听本质上是你的程序与区块链节点(RPC Node)建立了一个长连接(通常是 WebSocket)。

  1. 合约内 :执行某个函数,触发出 emit MyEvent()
  2. 节点:捕获到这个日志。
  3. ethers.js:通过连接接收到通知,并执行你预设的回调函数。

2. ethers.js 监听代码示例

在 ethers.js v6 中,监听非常直观。假设你有一个转账事件 Transfer(address from, address to, uint256 value)

全局监听(听所有转账):
javascript 复制代码
// 语法:contract.on("事件名", 回调函数)
contract.on("Transfer", (from, to, value, event) => {
    console.log(`收到新转账!`);
    console.log(`从: ${from} 到: ${to} 金额: ${ethers.formatEther(value)} ETH`);
    
    // event 对象包含更多细节,如交易哈希、区块号等
    console.log(`交易哈希: ${event.log.transactionHash}`);
});
带过滤的监听(只听发给"我"的转账):

如果你只想关注和你有关的交易,可以使用 Filters(过滤器)

javascript 复制代码
const myAddress = "0xYourAddress...";
// 创建过滤器:只有当 'to' 参数等于 myAddress 时才触发
const filter = contract.filters.Transfer(null, myAddress);

contract.on(filter, (from, to, value) => {
    console.log(`有人给我转账了 ${ethers.formatEther(value)} ETH!`);
});

3. 监听的注意事项

  • 网络连接类型 :监听通常需要 WebSocket (WSS) 连接(例如 wss://eth-mainnet.g.alchemy.com/...)。普通的 HTTP 连接不支持实时推送,ethers.js 可能会退化为频繁的轮询(Polling),效率较低。

  • 停止监听:为了防止内存泄漏,当你不再需要监听时(比如用户关闭了弹窗),记得关闭它:

  • contract.off("Transfer"):停止特定事件。

  • contract.removeAllListeners():停止所有监听。

  • 一次性监听 :如果你只想等某个动作发生一次(比如等待部署后的第一次初始化),可以使用 contract.once


4. 为什么不用"轮询"变量值?

有些开发者会想:我写个 setInterval 每秒查一次余额不行吗?

  1. 浪费资源:频繁调用节点 API 可能会触发频率限制(Rate Limit)。
  2. 延迟高:轮询可能有 1-2 秒的滞后。
  3. 用户体验差:用户在网页上点完按钮,你无法精准地在交易成交的那一刻给出反馈。

总结

  • 状态变量 :是合约的大脑(存储数据)。
  • 事件监听 :是合约的嘴巴(对外广播)。
相关推荐
devmoon1 天前
使用 Hardhat 在 Polkadot Hub 测试网部署基础 Solidity 合约(完整实战指南)
web3·区块链·智能合约·波卡·hardhat
devmoon2 天前
用Remix IDE在Polkadot Hub部署一个最基础的Solidity 合约(新手友好)
web3·区块链·智能合约·编译·remix·polkadot
暴躁小师兄数据学院2 天前
【WEB3.0零基础转行笔记】Golang编程篇-第4讲:Go语言中的流程控制
开发语言·后端·golang·web3·区块链
devmoon2 天前
使用 Remix IDE 在 Polkadot Hub 测试网部署 ERC-20 代币(新手完整实战教程)
web3·区块链·智能合约·solidity·remix·polkadot·erc-20
devmoon3 天前
智能合约实战 - 水龙头哪里领和创建第一个智能合约地址
web3·区块链·测试用例·智能合约·solidity
Mr.朱鹏3 天前
预测-下一个互联网风口?【PolyMarket调研】
web3·区块链·互联网·预测·加密货币·polymartet·风口
暴躁小师兄数据学院3 天前
【WEB3.0零基础转行笔记】基础知识篇-第二讲:以太坊基础
笔记·web3·区块链
devmoon3 天前
30秒一键连接Polkadot区块链网络和测试网
网络·web3·区块链·智能合约·polkadot
devmoon3 天前
选择基于rust的以太坊虚拟机,还是基于RISC-V的虚拟机?一文了解他们的部署差异和部署机制
web3·区块链·智能合约·solidity·polkadot
China_Yanhy3 天前
入职 Web3 运维日记 · 第 6 日:触碰红线 —— 私钥托管与 AWS KMS 的博弈
运维·web3·aws