本文介绍了 Hardhat v2.21.0 的发布,首个基于 Rust 实现的以太坊开发运行时 EDR,分析了此更新对性能的提升,特别是测试运行速度的显著提高。文中还探讨了构建 EDR 的原因,未来的计划,包括 Hardhat 3 的特性增强、Solidity 测试的实现以及将 EDR 转向 WebAssembly 以提高可移植性等。
在三月,我们发布了 Hardhat v2.21.0,这是首个基于我们全新 E thereum D evelopment R untime(简称 EDR)的版本,它用 Rust 实现。这是一个重大变化,代表着 Hardhat 最大且最复杂的组件——其以太坊模拟层——在新的语言中进行了重写。根据设计,这次更新并未影响用户体验,只是提高了性能。在这篇文章中,我们将解释为什么我们构建了 EDR,讨论它的当前状况,并概述该项目未来的计划。
将 Hardhat 迁移到 EDR 是一项重大任务,使得在发布后的稳定化成为我们的首要任务。我们修复了所有主要漏洞,并确保所有社区插件能够继续正常工作。在性能方面,我们的主要目标是避免回归,同时还尝试了一些简单的优化。
使用 EDR 版本的 Hardhat(或更新版本)的大多数项目测试运行速度至少提高了 2 倍,部分项目甚至提高了 10 倍。
EDR 版本还使我们克服了一些重大第三方架构障碍,这些障碍一直阻止 Hardhat 在 Solidity 中实现测试。更多内容稍后再谈。
EDR 是一个基于 Rust 的工具运行时实现。目标是让第三方可以重复使用,以加速开发者工具的发展。它是 Nomic Foundation 长期路线图 的一部分,旨在通过简化工具的构建来改善以太坊的开发者体验。我们向这个愿景迈出的第一步是将 Hardhat Network 及其部分依赖用 Rust 进行了重写,为 EDR 奠定了基础,并通过 Hardhat 的现有用户群体对其进行了战斗测试。
Hardhat Network,作为 Hardhat 的运行时组件,具有可观测性功能,使得像 Solidity 堆栈跟踪、console.log
语句和关于回退事务的详细信息等功能得以实现。然而,它与 Hardhat 和 Node.js 紧密耦合。迁移到 Rust 使这些特性可以作为任何语言中的原生库,以及通过 WASM 在浏览器中使用。这种解耦意味着 Hardhat 中运行时可观测性的任何改进都将使基于 EDR 构建的未来工具受益。此外,迁移一些依赖并使用 revm 使我们对堆栈拥有更多控制权,从架构上使我们可以开始 Solidity 测试和多链支持的开发。
EDR 是这个策略的一部分,旨在成为一个灵活、可扩展、快速和语言无关的 EVM 本地开发运行时。另一部分是我们的 Slang 编译器,它也在 取得了很大进展。
在稳定 EDR 后,我们将重点转向启用一些关键的运行时功能,以备我们下一个重大版本:Hardhat 3。此版本将涉及对工具的全面重新设计和重写,以解决当前和未来生态系统的需求。以下是我们当前正在开发的两个关键特性。
在 L2 网络(如 Optimism)上开发通常需要分叉网络或在“以太坊模式”下本地开发,并寄希望于本地代码执行与生产中发生的情况匹配。我们旨在通过启用具有特定于以太坊主网以外网络行为的精准本地模拟来改善这一点。我们最初的重点将支持 OP Stack 网络,但我们计划在未来添加其他类型的链。在这种模式下,进行本地模拟将包括像 L1 数据费用或预部署这样的功能,从而实现更精准和可靠的开发环境。
Solidity 测试在 Hardhat 路线图上已经存在很长时间,但我们之前的依赖限制了我们实现此功能。随着 EDR 在手,我们终于可以朝着提供 Solidity 测试的方向努力。这将使开发过程中的信息流更加顺畅和高效,同时保持对基于 TypeScript 的测试的支持,以便满足需要更具表现力的通用语言的更复杂、集成式的测试场景。
作为 Hardhat 的新运行时,EDR 代表了一个崭新的工作平台,具有更高的潜力,并且我们对 Hardhat 3 发布后的计划感到兴奋。
当前版本是基于 N-API 构建的,以启用从 Node.js 的使用,但这种方法存在一个重大限制:它阻止了在浏览器中使用 EDR。为了解决这个问题,我们计划转向 WebAssembly(WASM),这将提供必要的可移植性而不牺牲性能。这将使社区能够构建一些很酷的基于浏览器的工具。
EDR API 目前处于内部使用的 beta 阶段。Hardhat 3 发布后,我们将致力于改进和稳定它,以使其可用于外部项目。
我们正在积极推动进一步增强调试体验。从改善堆栈跟踪和错误消息开始,随后将 Slang 集成到 EDR 中,以便允许对 Solidity 和 EVM 执行进行更精确的逐步检查。
虽然我们从 OP Stack 开始,但我们希望增加对 Arbitrum 和 zkSync 的支持,并为其他 L2 提供一个通用路径,以构建插件以在 EDR 上添加支持。
- 原文链接: blog.nomic.foundation/ru...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!