ethers.js 在 Web3 开发中的位置
ethers.js 是以太坊兼容链上最常用的 JavaScript 库之一。无论是构建 DApp 前端、自动化脚本,还是后端服务,它都能提供稳定的 API。即便近年 viem 等新库兴起,ethers.js 仍然是大量项目的基石。在 必安APP 内置浏览器与桌面端钱包之间,ethers.js 的兼容性也非常稳定。
第一步:环境准备
开始 ethers.js 开发,需要准备:
- Node.js 18 以上版本;
- 一个支持 TypeScript 的编辑器;
- 一个测试网账户与 Sepolia ETH;
- Alchemy 或 Infura 等 RPC 服务;
- 视需要,一个区块浏览器 API key。
建议通过 pnpm 或 npm 安装 ethers v6,并启用 TypeScript 严格模式。
第二步:连接 Provider 与 Signer
ethers.js 的核心抽象是 Provider 与 Signer:
- Provider 提供链上只读访问;
- Signer 在 Provider 基础上提供签名能力;
- BrowserProvider 用于前端 wallet 注入;
- JsonRpcProvider 用于自托管或第三方节点;
- Wallet 类可用于脚本自动化场景。
这一抽象能让代码在浏览器与 Node 后端复用,方便维护。
第三步:合约调用
通过 Contract 类调用智能合约:
- 准备 ABI 与合约地址;
- 通过 new ethers.Contract(addr, abi, signer) 实例化;
- 调用只读方法返回 Promise;
- 调用写入方法返回交易对象;
- 使用 await tx.wait() 等待确认。
在与 B安合约 兼容的衍生品协议交互时,注意区分链上合约方法与中心化交易所 API。
第四步:事件订阅
ethers.js 提供事件订阅能力:
- contract.on(event, handler) 进行链上监听;
- 使用 filter 限制特定事件主题;
- 在前端结合 React useEffect 管理订阅生命周期;
- 后端服务可通过 polling 或 WebSocket Provider;
- 与 BN现货 行情数据结合,可构建复合监控系统。
第五步:错误处理与重试
良好的工程实践还包括:
- 区分 user rejected、insufficient funds、execution reverted 等错误;
- 对网络错误进行指数退避重试;
- 使用 try/catch 包裹 await tx.wait();
- 对 nonce 冲突给出明确提示;
- 在 UI 中以用户能理解的语言反馈失败原因。
第六步:与 viem 的对比
虽然 ethers.js 仍是主流,但许多团队开始迁移到 viem:
- viem 更注重类型安全与函数式 API;
- 包体积更小,对前端友好;
- 与 wagmi 等钱包库无缝整合;
- 在新项目中更易获得社区支持。
这并不意味着 ethers.js 不再值得学习,相反,掌握 ethers.js 能让你更顺畅地理解 viem 的设计取舍。
实战案例:构建一个签名授权工具
作为综合练习,可以构建一个 ERC20 签名授权工具:
- 用户连接钱包;
- 选择目标 ERC20 与额度;
- 生成 EIP-2612 permit 签名;
- 将签名发送至后端服务执行;
- 与 B安APP 内嵌钱包测试兼容性。
结语
ethers.js 开发教程的精髓,是让你既理解抽象层次(Provider、Signer、Contract),又能写出工程化的代码。无论你最终是否切换到 viem 等新库,扎实的 ethers.js 经验都将让你在 Web3 开发的不同场景中游刃有余。