Ethers.js调研
Ethers.js调研
8月 5, 2025
·
3 分钟阅读时长
·
1441
字
·
-阅读
-评论
最近开源项目需要做一个web3.js,于是调研下web3.js的头牌ethers.js。

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

跨平台性
ethers.js打包输出了ES/CJS规范的代码,因此支持浏览器Browser和服务端Node.js。
- lib.commonjs
- lib.esm
功能
- 钱包管理(Wallet)
- 与以太坊节点交互(Provider)
- 智能合约交互(Contract)
- 交易处理
- 工具和辅助函数
- 支持多种以太坊兼容链
架构
ethers.js是一个模块化设计的库,要包含以下模块:
1. ABI 模块 (src.ts/abi)
职责:处理以太坊应用二进制接口(ABI)
- abi-coder.ts:- AbiCoder类,负责 ABI 编码解码
- interface.ts:- Interface类,解析合约 ABI,处理函数调用和事件
- fragments.ts:定义 ABI 片段类型(函数、事件、错误等)
- coders/:各种数据类型的编解码器
2. 地址模块 (src.ts/address)
职责:处理以太坊地址相关操作
- 地址验证、格式化
- 合约地址计算(CREATE、CREATE2)
- ICAP 地址格式支持
4. 合约模块 (src.ts/contract)
职责:智能合约交互
- contract.ts:- Contract类,提供合约方法调用接口
- factory.ts:合约部署工厂
- wrappers.ts:事件日志、交易回执包装类
5. 密码学模块 (src.ts/crypto)
职责:密码学原语和密钥管理
- signing-key.ts:- SigningKey类,椭圆曲线密钥操作
- signature.ts:数字签名处理
- keccak.ts、- sha2.ts等:哈希函数
- scrypt.ts、- pbkdf2.ts:密钥派生函数
6. 哈希模块 (src.ts/hash)
职责:各种哈希和编码操作
- id.ts:字符串到哈希的转换
- message.ts:消息签名和验证
- typed-data.ts:EIP-712 类型化数据签名
- namehash.ts:ENS 域名哈希
7. 提供者模块 (src.ts/providers)
职责:区块链网络连接和数据获取
- abstract-provider.ts:- AbstractProvider基类
- provider-jsonrpc.ts:JSON-RPC 提供者
- 各种第三方区块链节点服务商(Infura、Alchemy 等)
8. 交易模块 (src.ts/transaction)
职责:交易创建、签名和序列化
- transaction.ts:- Transaction类
- address.ts:地址相关工具函数
9. 工具模块 (src.ts/utils)
职责:通用工具函数
- data.ts:字节数据处理
- errors.ts:错误处理
- fetch.ts:HTTP 请求封装
- maths.ts:数学运算
- utf8.ts:UTF-8 编解码
10. 钱包模块 (src.ts/wallet)
职责:钱包管理和密钥存储
- wallet.ts:- Wallet类
- 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)协作
metamask提供的是低级原始接口,没有任何封装。而ethers.js提供了更高级的抽象和封装,使得开发者可以更方便地与以太坊网络交互。

补充概念介绍
智能合约
这个名字确实有些夸大,但它强调了几个关键特点:
- 自动化执行
- 减少人为干预
- 透明可验证
- 降低信任成本
相关文档


