Ethers.js调研
·
3 分钟阅读时长
最近开源项目需要做一个web3.js,于是调研下web3.js的头牌ethers.js。
代码量
源码是TS编写,实际代码量就是90k
左右。
跨平台性
ethers.js打包输出了ES/CJS规范的代码,因此支持浏览器和服务端Node.js。
架构
ethers.js是一个模块化设计的库,主要包含以下组件: Collecting workspace information根据 src.ts 目录的结构,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 地址格式支持
3. 常量模块 (src.ts/constants
)
职责:定义以太坊相关常量
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 提供者provider-etherscan.ts
:EtherscanProvider
- 各种第三方提供者(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)协作