拓冰建站拓冰建站
首页 / 资讯中心 / 正文

ethers.js v6 实战:合约事件监听、多签与签名验证踩坑全解析

ethers.js 是从前端接以太坊/合约的核心库,但很多人在 v6 升级后踩坑:BigNumber没了、事件监听收不到、getEvent拼错哈希、签名验证总是失败。本文用完整可跑代码带你解决事件监听、批量操作、签名 EIP-712 这几个高频场景,全部基于 ethers.js v6。## 适用场景- 前端要实时监听合约事件(Transfer、Deposit),但on()一直收不到回调- 要把地址/事件签名拼成 topic,但哈希对不上导致监听静默失败- 要做 EIP-712 + 离线签名验签(如登录、授权),但 recover 出来地址不对## 核心技术栈-ethers.js v6:ethers.Contract、ContractEvent、Signer、verifyTypedData-EIP-1193 钱包 / JsonRpcProvider:连 MetaMask 或公共 RPC-EIP-712:结构化签名,标准登录/授权场景—## 完整可跑代码示例### 1. 初始化连接与合约封装(v6 写法)javascript// init.js — 运行: node init.jsimport { ethers } from 'ethers';// 连接 RPC(可读链上数据)const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_KEY');// 连接钱包(可签名/发送交易)// const wallet = new ethers.Wallet(PRIVATE_KEY, provider);// ERC20 标准接口const ABI = [ 'function balanceOf(address) view returns (uint256)', 'function transfer(address to, uint256 amount) returns (bool)', 'event Transfer(address indexed from, address indexed to, uint256 value)',];const token = new ethers.Contract('0xUSDC_ADDRESS', ABI, provider);// v6 关键差异:没有了 .BigNumber,直接用原生 bigintconst bal = await token.balanceOf('0x0...');console.log('balance:', bal.toString()); // bigint 要 toStringconsole.log('eth unit:', ethers.formatEther(bal)); // 格式化v6 要点:不再有ethers.BigNumber,数值统一是 JS 原生bigint;ethers.utils拆分到顶层(ethers.formatEther、ethers.getAddress等都在顶层导出)。### 2. 事件监听:正确拼 topic 才能收得到javascript// listen.js — 运行: node listen.jsimport { ethers } from 'ethers';const provider = new ethers.Js
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门