Ethers.js调研

· 3 分钟阅读时长

最近开源项目需要做一个web3.js,于是调研下web3.js的头牌ethers.js。

代码量

源码是TS编写,实际代码量就是90k左右。

https://static.1991421.cn/2025/2025-08-05-145322.jpeg

跨平台性

ethers.js打包输出了ES/CJS规范的代码,因此支持浏览器和服务端Node.js。

架构

ethers.js是一个模块化设计的库,主要包含以下组件: Collecting workspace information根据 src.ts 目录的结构,ethers.js 主要包含以下核心模块:

1. ABI 模块 (src.ts/abi)

职责:处理以太坊应用二进制接口(ABI)

  • abi-coder.tsAbiCoder 类,负责 ABI 编码解码
  • interface.tsInterface 类,解析合约 ABI,处理函数调用和事件
  • fragments.ts:定义 ABI 片段类型(函数、事件、错误等)
  • coders/:各种数据类型的编解码器

2. 地址模块 (src.ts/address)

职责:处理以太坊地址相关操作

  • 地址验证、格式化
  • 合约地址计算(CREATE、CREATE2)
  • ICAP 地址格式支持

3. 常量模块 (src.ts/constants)

职责:定义以太坊相关常量

4. 合约模块 (src.ts/contract)

职责:智能合约交互

  • contract.tsContract 类,提供合约方法调用接口
  • factory.ts:合约部署工厂
  • wrappers.ts:事件日志、交易回执包装类

5. 密码学模块 (src.ts/crypto)

职责:密码学原语和密钥管理

  • signing-key.tsSigningKey 类,椭圆曲线密钥操作
  • signature.ts:数字签名处理
  • keccak.tssha2.ts 等:哈希函数
  • scrypt.tspbkdf2.ts:密钥派生函数

6. 哈希模块 (src.ts/hash)

职责:各种哈希和编码操作

  • id.ts:字符串到哈希的转换
  • message.ts:消息签名和验证
  • typed-data.ts:EIP-712 类型化数据签名
  • namehash.ts:ENS 域名哈希

7. 提供者模块 (src.ts/providers)

职责:区块链网络连接和数据获取

  • abstract-provider.tsAbstractProvider 基类
  • provider-jsonrpc.ts:JSON-RPC 提供者
  • provider-etherscan.tsEtherscanProvider
  • 各种第三方提供者(Infura、Alchemy 等)

8. 交易模块 (src.ts/transaction)

职责:交易创建、签名和序列化

  • transaction.tsTransaction
  • address.ts:地址相关工具函数

9. 工具模块 (src.ts/utils)

职责:通用工具函数

  • data.ts:字节数据处理
  • errors.ts:错误处理
  • fetch.ts:HTTP 请求封装
  • maths.ts:数学运算
  • utf8.ts:UTF-8 编解码

10. 钱包模块 (src.ts/wallet)

职责:钱包管理和密钥存储

  • wallet.tsWallet
  • hdwallet.ts:HD 钱包实现
  • json-keystore.ts:Keystore 格式支持
  • mnemonic.ts:助记词处理

11. 词表模块 (src.ts/wordlists)

职责:助记词词表

  • 支持多语言助记词

这种模块化设计使得 ethers.js 具有清晰的职责分离,每个模块专注于特定的功能领域,便于维护和扩展。

ethers.js 与metamask钱包之间的关系

  • 标准化接口:都遵循 EIP-1193 等以太坊标准
  • 职责分离:
    • MetaMask:私钥管理、用户授权、交易签名
    • ethers.js:数据格式化、ABI 编解码、网络通信
  • 可替换性:ethers.js 也可以与其他钱包(如 WalletConnect)协作
Authors
开发者,数码产品爱好者,喜欢折腾,喜欢分享,喜欢开源