ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ethers.js v6 全版本演进解析:从 v6.0 到 v6.17 的核心特性、EIP 支持与源码实现

ethers.js v6 全版本演进解析:从 v6.0 到 v6.17 的核心特性、EIP 支持与源码实现 区块链Web3【免费下载链接】ethers.jsComplete Ethereum library and wallet implementation in JavaScript.项目地址https://gitcode.com/gh_mirrors/et/ethers.js点击查看免费下载本篇技术指南以 ethers.js 仓库根目录的 CHANGELOG.md 为主线系统梳理 ethers.js v6 自 2023 年 2 月发布 v6.0.0 至 2026 年 6 月 v6.17.0 的全部版本演进脉络并结合 src.ts 源码逐项印证 EIP-7702、EIP-4844、EIP-7594、EIP-6963、ENS UniversalResolver、Provider 请求限流等关键特性的真实实现。读完本文你将掌握 ethers.js v6 各版本的能力边界、底层实现原理以及如何借助变更日志与源码快速定位版本行为差异为项目升级与排障提供依据。一、变更日志本身如何维护与阅读CHANGELOG.md 的开头明确说明这份变更日志由src.ts/_admin/update-changelog.ts维护也可能被手动更新。这意味着版本条目中的内容通常与 git 提交一一对应每条记录都带有对应的 commit 摘要是追踪每个行为变更最权威的入口。阅读这份变更日志时可以关注以下几个信息维度版本号与发布时间如ethers/v6.17.0 (2026-06-17 23:50)精确到分钟的时间戳说明发布流程自动化程度较高Issue 关联多数条目携带#xxxx编号如#4916EIP-7702、#4570EIP-4788/EIP-4844 Block 字段可据此回溯问题的原始上下文变更类型条目可分为新功能Added、修复Fixed、测试/构建调整tests、Merge、refactor三类其中tests:前缀条目只影响 CI 与测试基建不影响公共 API。从仓库结构看与变更日志配套的还有 docs.wrm基于 WRM 格式的官方文档、testcases版本回归测试数据如 transaction.json.gz以及 lib.esm / lib.commonjs 两套构建产物共同构成文档—源码—测试—构建的完整闭环。二、版本演进总览先给出 v6 全系列的时间线便于快速建立全局认知版本发布时间核心主题v6.0.0 ~ v6.0.82023-02v6 初始发布与修复Result 数组行为、custom error 解码、FallbackProvider 中位数、NonceManager 竞态、UMD 构建v6.1.02023-03Sepolia 支持、listAccounts、BigInt blockTag、Web Worker 兼容v6.2.0 ~ v6.2.32023-03verifyTypedData、移除 unsafe-eval、IpcProvider 修复、网络不可用时的 block 轮询启动保护v6.3.02023-04遗留 ABI JSON 片段、Contract_in_运算符、TypedData 修复v6.4.0 ~ v6.4.22023-05~06Providererror事件、静态网络检测、tree-shaking、gas price 回退修复、ens-normalize 升级v6.5.0 ~ v6.5.12023-06TransactionResponse 增加 confirmations、检测并停止 Provider 初始网络检测空转、CJS 浏览器打包v6.6.0 ~ v6.6.72023-06~07MultiCoin 插件与 EVM coin type 自动检测、perform cache 超时可调、CCIP-read 修复、ABI 解码容错v6.7.0 ~ v6.7.12023-08FallbackProvider 可定制 quorum、Gas Station NetworkPlugin、getDefaultProvider whitelist、自定义 priority fee、Polygon RPCv6.8.0 ~ v6.8.12023-10~11error shortMessage、ENS normalize 行为对齐、noble 密码库升级、Sepolia ENSv6.9.0 ~ v6.9.22023-11~2024-01静态网络自动检测、safe/finalized 事件、Base 网络、Base58 填充修复、priority fee 回退 1 gweiv6.10.02024-01ABI 解码膨胀比例限制安全v6.11.0 ~ v6.11.12024-02EIP-4788/EIP-4844 Block 字段、BLOb 交易、holesky 网络、EIP-712 归一化、ENS 通配符 255 字节v6.12.0 ~ v6.12.22024-04~05Chainstack Provider、Polygon Amoy、prevRandao、EIP-4844 广播、Result 深转换、throttle 参数修复v6.13.0 ~ v6.13.72024-06~2025-04BrowserProvider Options、FetchRequest 超时/取消、ws 依赖安全升级、CCIP-read 低层失败容错、FallbackProvider 异常合并v6.14.0 ~ v6.14.42025-05~06EIP-7702 支持、EIP-6963 发现、Etherscan v2 API、KZG 新 API 兼容、gunzip 显式抛错、yParity 归一化v6.15.02025-07Signature 非规范 S 值支持错误延迟到访问时v6.16.02025-12EIP-7594 PeerDAS、BLOb proof 拆分工具、Filecoin 网络、非规范 S 值交易/签名v6.17.02026-06Provider requestRate 限流、ENSv2/UniversalResolver、Block.transactionsRoot、301/302/307/308 重定向三、EIP 支持矩阵交易类型与区块数据结构的演进CHANGELOG 中 EIP 相关条目是最能体现 ethers.js 紧跟以太坊协议演进的部分这里结合源码逐一展开。3.1 EIP-7702账户授权v6.13.6 → v6.14.0v6.13.6 引入初始 EIP-7702 支持v6.14.0 正式完善。核心 API 是交易对象上的authorizationList字段在 transaction.ts 中有完整定义第 169 行authorizationList?: null | ArrayAuthorization作为可选的交易字段第 308 行序列化校验if (!Array.isArray(value)) { throw new Error(authorizationList: invalid array); }第 1042~1053 行get/set authorizationList属性对setter 接收AuthorizationLike数组第 1345 行当authorizationList非空时自动选择 EIP-7702 交易类型。值得注意的是 v6.13.6 的语义Implicitly use EIP-7702 if authorizationList is given and non-empty——即只要提供了非空授权列表库会自动推断交易类型开发者无需手动指定 type。v6.14.0 进一步修复了 JSON-RPC 响应中 authorizationList 签名条目被编码为 DATA 而非 QUANTITY 的问题v6.14.1以及带前导 0 字节的序列化问题v6.14.4与 yParity 归一化问题v6.14.3这些细节修复对链上互操作至关重要。3.2 EIP-4844BLOb 交易与区块字段v6.11.0 → v6.12.2v6.11.0 加入 EIP-4844 BLOb 交易Issue #4554并在 Block 中补充 EIP-4788 与 EIP-4844 相关字段Issue #4570。v6.12.0 增加 EIP-4844 广播支持v6.12.2 修复了 estimateGas 与 call 期间 EIP-4844 属性未复制的问题Issue #4728。从 transaction.ts 可以看到完整的 BLOb 数据结构blobVersionedHashes第 142 行、blobs第 147 行、proofs第 151 行、blobWrapperVersion第 159 行。同时该文件实现了一套 KZG 库适配层第 229~283 行同时兼容新旧 APIkzg-wasm 0.5.0使用blobToKZGCommitment(string)旧版本使用blobToKzgCommitment(Uint8Array)这正是 v6.14.0 中Accept modern KZG library API while exposing legacy APIIssue #4841的落地。3.3 EIP-7594PeerDAS 与 BLOb proof 拆分v6.16.0v6.16.0 加入初始 EIP-7594 PeerDAS 支持Issue #5054、#5062并新增将 EIP-7594 BLOb proof 拆分为 cells的工具方法。在 transaction.ts 第 37 行注释明确写明该工具面向link-eip-7594BLOb第 55 行定义了 BLS 模数约束每个 field 必须小于该值——这是对 Celestia 风格 blob 分片证明的数据正确性保障。v6.16.0 同时将 API 迁移到更完善的 PeerDAS 接口。3.4 非规范 S 值与 EIP-712 归一化v6.11.0 / v6.15.0 / v6.16.0v6.11.0 修复 EIP-712 类型归一化Issue #4541在计算 payload 前先归一化类型并抽象了数组解析逻辑同时修复uint/int类型别名v6.15.0 开始允许 Signature 携带非规范 S 值并将错误延迟到访问时抛出Issue #5013v6.16.0 进一步将这一能力扩展到 Transaction 与 Signature 两条路径Issue #4223、#5013。这一变化的意义在于部分链上签名/交易确实存在非规范 S 值v6 早期版本直接抛错拒绝后期版本改为宽松解析、访问时校验提升了与历史链上数据的兼容性。3.5 EIP-6963浏览器钱包发现协议v6.13.6 / v6.14.0v6.13.6 与 v6.14.0 两次为 BrowserProvider 增加 EIP-6963 发现能力。在 provider-browser.ts 中可见实现细节第 56 行监听eip6963:announceProvider事件类型第 322~331 行通过addEventListener订阅钱包公告、dispatchEvent(new Event(eip6963:requestProvider))主动请求钱包列表。EIP-6963 是浏览器多钱包场景下的标准发现机制这一支持使 BrowserProvider 不再依赖全局window.ethereum注入。四、Provider 生态第三方服务商与网络支持扩张CHANGELOG 中大量条目是网络与服务商支持的新增与修正这是 ethers.js 实用性的重要来源。4.1 EtherscanProvider迁移到 v2 APIv6.14.2 将 EtherscanProvider 迁移到 Etherscan 官方 v2 APIIssue #4975。在 provider-etherscan.ts 第 229~236 行可以看到新 API 的请求格式https://api.etherscan.io/v2/api?chainid${ this.network.chainId }module${ module }${ query }相比旧的按网络拼接独立域名的方式v2 API 通过chainid参数统一路由天然支持多链。文件中同时列出了 Basebase、Base Sepoliabase-sepolia、Polygon Amoymatic-amoy等新网络第 14~22 行、第 202 行。此前的演进还包括v6.9.0 使用 Secure 端点支持 BNBIssue #4525、v6.12.1 新增 matic-amoyIssue #4711、v6.12.2 新增 Base 端点Issue #4729、v6.16.0 在不支持的网络上立即失败以保护默认 ProviderIssue #5052。4.2 其他服务商与网络Blockscoutv6.14.0 因 custom error 问题暂时移除 BlockscoutProviderv6.17.0 恢复并更新默认 API key 与链接Alchemyv6.16.0 更新主网 URL 端点Issue #5052、v6.17.0 更新 BNB 端点并暂时禁用因测试 API 容量不足v6.9.0 新增 Base 网络Issue #4384Infurav6.11.0 新增 linea 网络Issue #4184、#4190v6.12.0 新增 Linea Sepolia 与端点Issue #4655、InfuraWebSocketProvider 获取确定性网络v6.13.7 修复 BSC 网络 URLIssue #4951Chainstackv6.12.0 全新加入Issue #2741Ankr / QuickNodev6.2.0 因 API key 失效暂时移除 Ankr 默认项v6.11.0 更新 QuickNode 第三方 URLv6.16.0 新增 Ankr 端点Issue #5038Filecoin 网络v6.16.0 新增Issue #5038测试网v6.1.0 Sepolia、v6.8.1 Sepolia ENS、v6.11.0 holesky含各服务商端点、v6.11.1 附加 sepolia 测试网、v6.12.0 Polygon AmoyIssue #4645。在 network.ts 中可以印证网络注册的实现例如第 401~411 行定义了主网与 Sepolia 的ensUniversalResolver地址。这些网络条目为getDefaultProvider的多后端回退提供了基础。4.3 FallbackProviderquorum、广播与异常合并FallbackProvider 在 v6 中期经历了多轮可靠性增强v6.4.0 修复启动时后端失败的鲁棒性Issue #3979与中位数计算Issue #3746v6.7.0 新增可定制 quorumIssue #4160、修复优先级排序Issue #4150v6.9.0 修复启动请求时的权重适配Issue #4298、广播更健壮Issue #4186、#4297、#4442v6.13.7 修复后端返回略有差异的错误信息时的异常合并coalescing。provider-fallback.ts 展示了 quorum 机制的实现第 251~262 行checkQuorum按权重统计结果第 272 行getMedian计算中位数第 312 行getAnyResult在无多数票时择优返回第 410~423 行构造函数计算默认 quorum 并校验其不超过总权重。五、请求限流 requestRatev6.17.0 的新能力v6.17.0 的两条新增条目Add requestRate throttle to calls与Added provider requestRate throttle support为 Provider 引入了请求速率限制能力。这在 abstract-provider.ts 中有完整实现第 470~471 行私有字段#requestRate每秒请求数上限与#requestTimes请求时间戳队列第 511~512 行构造时默认#requestRate 0不限流、#requestTimes []第 518~526 行_requestRate的 getter/setter值为null或负数时视为 0无限流第 569~583 行#getDelay()实现滑动窗口限流算法——记录当前时间戳清除 1 秒前scanTime now - 1000的旧记录若窗口内请求数未达上限返回 0 延迟否则返回最早请求超窗所需的等待毫秒数。使用示例与 create-provider.ts 第 38 行等处测试用法一致import { JsonRpcProvider } from ethers; const provider new JsonRpcProvider(https://eth-mainnet.example.com); provider._requestRate 10; // 每秒最多 10 个请求超出则自动排队等待该能力对公共 RPC 端点限流、测试环境稳定性都有实用价值尤其结合 v6.13.5 Use local dev net for testing ... to prevent tests getting throttled 可以反推在真实服务商 API 上限流是开发者必须面对的现实约束。六、ENS 演进UniversalResolver 与 ENSv2v6.17.0 是 ENS 支持的大版本共 6 条相关条目新增 ENSv2 集成、ENSv2 测试与 EVM coinType 修复、UniversalResolver 前向解析、反向查找、CCIP 反向解析、以及完全向后兼容的 API 调整。从 ens-resolver.ts 可以看到实现证据第 577 行static async getUniversalResolverAddress(provider)从 provider 获取 UniversalResolver 合约地址第 612~651 行lookupAddress反向解析实现——先校验 coinType第 638 行断言coinType BN_60即 ETH 的 SLIP-44 编号再调用 UniversalResolver 的reverse函数第 725 行UniversalResolver 的 ABI 片段function reverse(bytes name, uint coinType) view returns (string primary, address resolver, address reverseResolver)。v6.17.0 还包含两个值得注意的细节修复coinType 改用 bigintUse bigint for coinType instead of number valuescommit 4f6ec03避免超出 Number 安全整数范围的 coinType 精度丢失ResolverNotFound 映射为 null反向查找时若解析器不存在返回null而不是抛错commit d07cfb6与lookupAddress的容错语义一致。同时 v6.17.0 为 network.ts 第 401~411 行中的ensUniversalResolver网络配置主网0xeEeEEEeE14D718C2B47D9923Deab1335E144EeEe赋予了实际解析能力。此前 v6.11.1 还放宽了 ENS 通配符对 255 字节标签的支持Issue #4543v6.8.0 复刻了 ENS normalize 对空字符串的旧行为。七、区块数据结构transactionsRoot、prevRandao 与完整 Block 字段v6.17.0 根据 Issue #5077、#5078 为 Block 增加transactionsRoot字段。在 provider.ts 中第 555 行readonly transactionsRoot!: null | string;Block 类型声明第 638 行格式化时transactionsRoot: block.transactionsRoot第 682~695 行Block 构造时同时接收parentBeaconBlockRoot, stateRoot, receiptsRoot, transactionsRoot, timestamp, transactions。对应地format.ts 第 128 行用allowNull(formatHash, null)解析该字段允许为 null符合某些后端不返回该字段的情况formatting.ts 第 117 行定义了类型。此前 Block 结构已陆续补齐v6.11.0 增加 EIP-4788beacon root与 receipts root、state rootIssue #4570v6.12.0 增加prevRandaoIssue #3372v6.11.0 增加 EIP-4844 相关字段。这使开发者可以仅通过 ethers.js 即可访问完整的区块头元数据而无需另行解析原始 RLP。八、错误处理、安全与健壮性改进8.1 错误信息与调试v6.8.0 引入 error 的shortMessageIssue #4241方便快速定位失败原因v6.14.2 修复makeError对递归结构 stringify 的调用栈溢出Issue #4977、#4978v6.12.2 对长字符串改用非捕获正则防止内存耗尽Issue #4741v6.6.5 改进 fragment 解析错误信息Issue #4246v6.12.0 改进交易字段不匹配的错误信息Issue #4659。8.2 网络与安全v6.13.1 升级 ws 依赖修复 DoS 漏洞v6.8.0 更新到最新 noble 密码库Issue #3975v6.0.1 更新 secp256k1 库Issue #3719v6.2.0 移除 Function 子类使用解决 unsafe-eval 环境问题Issue #3749、#3763v6.14.2 对 gunzip 失败显式抛错防止未捕获异常Issue #4873、#4874。8.3 Fetch 与重定向语义v6.17.0 修复了 HTTP 重定向语义保留 301/302 的方法并支持 307/308Issue #3106、#5115。在 fetch.ts 中第 542 行if ([301, 302, 307, 308].indexOf(response.statusCode) 0)判断重定向第 547 行跟随重定向时保留原请求方法递归#send第 612~621 行redirect(location)方法执行安全校验禁止 HTTPS 降级为 HTTP并附上操作上下文。此前 v6.13.0 为 FetchRequest 增加了统一的超时与取消行为Issue #4122v6.2.2 修复了凭据credentials下的 FetchRequestIssue #3897v6.8.0 让getUrl配置更健壮Issue #4353。8.4 Provider 生命周期与事件v6.4.0 为 Provider 增加error事件Issue #3970、#3982v6.7.1 阻止已销毁 Provider 发出网络检测错误v6.9.0 增加safe与finalized事件Issue #3921配合 v6.9.0 的静态网络自动检测Issue #4199、#4418、#4441让开发者可以订阅到确定性更强的链状态。九、开发者体验与工具链9.1 常用工具方法verifyTypedDatav6.2.0验证 EIP-712 签名补齐了 typed-data 的验签闭环BLOb proof 拆分v6.16.0EIP-7594 场景下的 cells 拆分工具Result 深转换v6.12.0Issue #4681toObject/toArray支持嵌套数组的深层转换v6.13.0 修复父节点为数组时的深转换 bugIssue #4681Contract_in_运算符v6.3.0Issue #3901对 contract 与 contract.filters 提供in语义支持遗留 ABI JSON 片段v6.3.0Issue #3932兼容 v5 时代的 ABI 格式。9.2 包与构建v6.4.0 更积极的 tree-shaking、支持非 node16 moduleResolution 的传递依赖Issue #3920v6.0.6 为 dist 增加 UMD 输出Issue #3814v6.0.8 修复 exports 字段顺序Issue #3703、#3755v6.1.0 重新加入 require 导出的定义文件Issue #3703v6.2.0 修复部分打包器无法处理递归 pkg.exports 的问题Issue #3848。9.3 Contract 层改进v6.6.5 在 Contract Proxy 中反射 symbolsIssue #4048、允许 indexed filter topics 使用地址数组Issue #4259、修复 bytesX filter 编码Issue #4244v6.7.0 对不存在的 Contract 属性返回undefined而非抛错Issue #4266v6.11.0 扩展 Contract 子类以接受 BaseContract 超类构造参数Issue #4538、允许 human-readable ABI 使用 override 关键字Issue #4514、#4548。十、如何在实际项目中应用这些信息升级前对照升级 ethers.js 前先在 CHANGELOG.md 中检索自己用到的 API 名称如authorizationList、transactionsRoot、_requestRate确认目标版本的行为变更源码佐证本仓库的 lib.esm 与 lib.commonjs 是构建产物src.ts 是 TypeScript 源码两者并存可在源码中直接确认公共 API 的签名与默认值测试用例参考src.ts/_tests 下的测试如 create-provider.ts、test-ens.ts展示了新特性的标准用法例如 requestRate 限流的测试赋值方式版本声明各构建目录内的 package.json 与根目录 package.json 声明了实际的发布版本号可与 CHANGELOG.md 对照确认当前仓库对应的版本。结语从 v6.0.0 到 v6.17.0ethers.js 的演进路径清晰可循紧跟以太坊共识层与执行层的 EIP 节奏7702、4844、7594、6963、4788持续扩张第三方服务商与多链网络覆盖同时不断打磨错误处理、限流、重定向等工程细节。CHANGELOG.md 作为这份演进记录的浓缩载体配合本仓库完整的 TypeScript 源码与测试用例构成了开发者理解、评估和升级 ethers.js 的一手资料。对每一个关键条目本文都已给出 src.ts 中的具体实现文件与行号读者可以按图索骥深入验证。赞分享区块链Web3【免费下载链接】ethers.jsComplete Ethereum library and wallet implementation in JavaScript.项目地址https://gitcode.com/gh_mirrors/et/ethers.js点击查看免费下载相关推荐Erlang/OTP EUnit 版本演进全解从 2.0 到 2.11 的核心特性、宏与源码实现Erlang/OTP EUnit 版本演进全解从 2.0 到 2.11 的核心特性、宏与源码实现 EUnit 是 Erlang/OTP 官方的轻量级单元测试框编程语言语言运行时标准库编译器并发编程brpc 版本演进全解析从 0.9.0 到 0.9.7 的核心特性、源码实现与升级路径brpc 版本演进全解析从 0.9.0 到 0.9.7 的核心特性、源码实现与升级路径 本篇技术指南以当前仓库根目录下的 CHANGES.md https:/RPC框架后端微服务网络通信expect.js 版本演进深度解析从 History.md 看 0.1.0 到 0.3.0 的核心特性与源码实现expect.js 版本演进深度解析从 History.md 看 0.1.0 到 0.3.0 的核心特性与源码实现 本指南以本仓库内 expect.js 组件前端上一篇PyTorch-OpCounter社区代码马拉松24小时开发新功能挑战终极指南下一篇星露谷物语SMAPI新手必看从零开始的模组加载器完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表