在过去的三年里,Foundry已发展成为智能合约开发者的首选工具,今天,我们自豪地宣布 Foundry v1.0
当我们在 2021 年 12 月首次宣布 Foundry 时,我们的目标是创建最灵活和最快的 EVM 开发工具包。在过去的三年里,Foundry 已发展成为智能合约开发者的首选工具,广泛应用于独立开发者和领先协议团队。
今天,我们自豪地宣布 Foundry v1.0,标志着我们在提供最稳定和高性能的 EVM 开发工具包的旅程中的一个重要里程碑。
我们相信,为了加速以太坊的发展,我们需要为开发者提供最佳的工具,以便更快地编写、测试和交付代码。这一切都得益于我们强大的开源社区通过反馈和贡献推动改进。继续阅读以了解 Foundry v1.0 中的新功能以及接下来的计划。
forge test
新增了标志,以增强你的测试体验,例如在失败时启用重试、改进测试进度跟踪和不变性测试指标的用户体验。Foundry v1.0 提供了更好的调试能力,包括内部调用跟踪和状态可视化,让你能够调试交易的每一个细节。foundryup
指向 stable
版本。结果是一个成熟、高性能的工具包,为 EVM 开发设定了新的标准。我们建立了一个强大且不断壮大的 EVM 开发者社区。Foundry 拥有 8.6k 星标、466 名独立贡献者和 4939 个PR,Foundry 将长期存在。
快速的代码编译和快速运行的测试套件意味着更短的反馈周期,使开发者和团队能够更快地交付产品。
我们对领先的 Solidity 库进行了基准测试,以测量编译每个库中所有合约所需的时间。我们的基准测试显示,Forge 编译的速度始终比 Hardhat 快 2.1 倍到 5.2 倍,具体取决于缓存的使用情况。
来源:https://github.com/foundry-rs/foundry?tab=readme-ov-file#compilation-benchmarks
更快的测试意味着开发者更快的反馈周期。与 v0.2 相比,我们的测试性能在不变性测试和单元/模糊测试方面提高了 2 倍。下一节关于不变性测试将深入探讨我们如何在 v1.0 中显著提高不变性测试的性能。
我们对领先的智能合约库进行了基准测试,以测量运行测试套件(包括单元测试、模糊测试、不变性测试和集成测试)所需的时间。缓存的集成测试还显示了 Foundry 在同一块高度下重复运行分叉测试的有效性,得益于 RPC 缓存。
基准测试使用 v1.0 与 v0.2(nightly-de33b6af53005037b463318d2628b5cfcaf39916)进行比较。
模糊测试和跟踪代码覆盖率对智能合约安全至关重要。模糊测试通过随机生成的测试输入帮助开发者发现边界情况。运行这些测试可能会消耗大量计算资源,因此 Foundry v1.0 提供了改进的性能,以确保你可以快速无缝地运行模糊测试。
在 v1.0 版本中,Foundry 的模糊测试和代码覆盖率的执行时间提高了 40%。这使得开发者能够在 CI 中运行更多的测试用例,而不会增加成本,从而在协作开发中实现更快的反馈循环。
来源:https://x.com/gakonst/status/1864060511253680180
在快速开发过程中,保持智能合约的安全至关重要,跟踪代码库中哪些部分被测试覆盖也很重要。使用 Foundry v1.0,forge coverage
帮助你验证和跟踪代码覆盖率,速度提高了 3.5 倍。以下基准测试显示了 v1.0 和 v0.2 在代码覆盖率执行时间上的比较:
不变性测试 确保系统的关键假设在不同状态下保持真实,是帮助开发者发现合约逻辑错误的重要工具。
当不变性测试失败时,输出通常是复杂的失败案例,涉及多个步骤。缩减是指在保留失败的同时减少原始反例的过程。在 v1.0 版本中,缩减算法经过重写,性能显著优于之前的实现。
来自社区的基准测试 显示 Foundry v1.0 相较于 v0.2 和 Echidna 的显著性能提升,速度提高了 高达 1000 倍。Echidna 在更复杂的测试场景(如 Unstoppable)中仍表现更好,主要得益于其覆盖引导的模糊测试能力。为了解决这个问题,覆盖引导的模糊测试已被纳入 Foundry 今年的路线图,以进一步提高不变性测试的性能。
虽然速度很重要,但更重要的是能够找到导致失败的序列,使用 Foundry v1.0,我们成功找到了 v0.2 未能捕捉到的失败案例(例如在 Unstoppable 中)。
通过在使用 cast run
调试交易或运行 forge test
时传递 --decode-internal
标志,你可以调试解码的内部调用,查看状态变化并跟踪解码的事件发射,以帮助你更细致地调试交易。
Uniswap V4 交换的示例。来源:https://github.com/foundry-rs/foundry/pull/8222
我们工具箱中的另一个有用工具是结合 --flamechart
或 --flamegraph
选项运行 forge test
,可视化昂贵的操作、深层调用栈和潜在的优化目标。
火焰图帮助可视化随时间变化的 gas 使用情况,显示每个函数的调用时间(执行顺序)以及每个步骤在时间线中消耗的 gas 量。
来源:https://x.com/zerosnacks/status/1837142546436202968
Foundry v1.0 的改进跟踪包括对外部库调用、回退函数调用、存储槽的状态差异、余额变化、代码修改和事件发射的完全解码的 calldata 和返回值,使你能够更清晰地了解合约的执行路径及其与依赖项的交互。以下是 Foundry 堆栈跟踪的示例,其中存储变化,计数器(存储槽 0
)被更改了两次,第一次显式设置为 9
,然后递增到 10
。
Foundry 现在自动保存执行上下文,并允许你以确定性方式重放任何失败的测试。这意味着你可以快速重现和调试任何测试失败,并更快地修复测试。
Foundry v1.0 大幅改善了大型智能合约代码库的开发者体验,通过 forge test --show-progress
提供实时测试执行进度:
为了有效进行不变性测试,开发者需要指标来深入了解实际测试的内容。在 v1.0 中,我们引入了详细的指标,通过在 foundry.toml
中启用不变性指标 ,让你对成功调用、回退率和被丢弃调用有全面的可见性。
来源: https://x.com/lucasmanuel_eth/status/1854630498636878130
大多数情况下,仅仅测试智能合约的输出是不够的。作弊代码让你可以操控区块链的状态,以及测试特定的回退和事件。
Gas 优化对智能合约开发至关重要。我们新的 gas 快照作弊代码让你能够精确测量 gas 使用情况,帮助你识别和优化合约的热点。Gas 快照被写入 snapshots
目录,以便检查到 .git
,允许你随着时间的推移测量和评估 gas 优化的影响。
有时模糊测试器可以发现合约中真实但预期的错误,特别是在针对有状态的分叉进行测试时。assumeNoRevert
作弊代码允许丢弃当前运行并在下一个调用回退时开始新的模糊测试运行。
Foundry v1.0 增强了 expectRevert
测试工具,允许检查即将调用的预期回退次数,并确保不会发生回退(期望 0 次回退)。
某些用例,例如多链部署,可能需要高级钱包管理。Foundry v1.0 提供 rememberKeys
作弊代码,以在脚本环境中派生和保存多个钱包,而 getWallets
返回一个地址数组,其私钥在脚本中可用:
Foundry v1.0 解锁了通过作弊代码部署合约的可能性,方法是从工件目录中获取合约字节码。这可以通过新引入的 deployCode
作弊代码完成,可以使用合约名称或合约工件的路径进行调用。
Foundry v1.0 配备了 getBroadcast
作弊代码,允许访问已部署地址和先前广播交易的详细信息。例如,在部署 Counter
合约后,可以轻松获取交易哈希和新创建合约的地址:
此外,两个新作弊代码 getArtifactPathByCode
和 getArtifactPathByDeployedCode
帮助你以编程方式找到与每个合约部署对应的工件:
为了高效测试和调试,我们开发了作弊代码来可视化交易的副作用。这是通过使用 startStateDiffRecording
记录状态转换,然后使用 getStateDiff
和 getStateDiffJson
作弊代码获取交易执行前后的链状态差异来完成的,下面是一个示例。
注意:在即将发布的版本中,状态差异作弊代码的输出将改进,以显示解码值。
符号执行是一种强大的技术,通过将输入变量视为数学表达式来探索所有可能的执行路径,从而帮助发现边缘情况。这可以帮助识别微妙的错误,如整数溢出、重入漏洞和复杂的数学边缘情况,而无需为每种情况显式编写测试用例。
虽然它并未内置于 Foundry v1.0 中,但我们使其易于与你最喜欢的符号执行工具集成,例如 Kontrol 或 Halmos。下面是一个示例,使用 Kontrol 验证 OpenZeppelin ERC20 的铸造功能在任何地址和任何余额下的行为是否正确:
请查看 作弊代码参考 以探索我们所有的作弊代码和文档。
以太坊 Pectra 硬分叉定于 2025 年 3 月或 4 月进行,并将为 EVM 带来激动人心的功能,例如启用账户抽象(EIP-7702)。
EIP-7702 解锁了诸如 gas 赞助等功能,但也包括其他用例,例如交易捆绑或授予子密钥有限权限。此 EIP 引入了一种新的交易类型,允许外部拥有账户(EOA)像智能合约一样工作。
Forge
自 2024 年 10 月以来支持 EIP-7702,以便开发者在 L1 上可用之前开始原型设计新功能。要开始,只需在 foundry.toml
中设置 evm_version="prague"
或将 --evm-version prague
作为参数传递。
使用 cast
,用户可以签署授权 ,将所有调用委托给其地址的智能合约字节码:
使用 cast send --auth
,你可以发送签署的授权(或让其他方发送,例如补贴 gas)。有关更多信息,请查看 Odyssey 示例 以了解 EIP-7702。
要运行与 EIP-7702 兼容的节点实例,可以在启动 Anvil 时使用 prague
硬分叉:anvil --hardfork prague
Foundry v1.0 配备了一组作弊代码,可用于签署 EIP-7702 授权并将调用委托为 EIP-7702 交易:signDelegation
用于生成签署的授权,attachDelegation
用于将下一个交易指定为 EIP-7702 委托,signAndAttachDelegation
将签署和附加合并为一个步骤,简化了委托过程。
来源: https://book.getfoundry.sh/cheatcodes/sign-delegation
EIP-7212 引入了一个针对 secp256r1 椭圆曲线的预编译,这是一种广泛用于 Apple Secure Enclave 和 WebAuthn 等协议的曲线,基本上解锁了使用你的Passkey签署交易的能力。
Foundry v1.0 配备了一个作弊代码 signP256
,让你轻松使用 secp256r1 私钥签署摘要。
紧随 Pectra 之后的以太坊硬分叉名为 Fusaka,将包括一系列新的 EIP,称为 EOF。确切的时间表尚未确定,但 Foundry 已经为开发者提供了尝试的能力。
EOF 旨在提高智能合约部署和执行的效率和安全性。它为以太坊区块链上的智能合约引入了一种新的容器格式。
要使用 EOF 编译合约,你只需传递 --eof
标志。
同样的 --eof
标志可以用于部署合约。
要解码和检查 EOF 容器字节,Foundry v1.0 提供了 cast decode-eof 选项。
下面的截图显示了该命令如何返回解码响应,高亮显示头部和代码部分,以帮助理解合约字节码在新格式下的组织方式。要深入了解 EOF,请查看我们的 EOF 示例。
在 v1.0 中,我们希望使 Foundry 过渡到一个稳定的 API,为社区提供关于定期发布节奏、明确的时间表和迁移路径以及版本化 API 的具体保证。
我们的发布流程结构如下:
master
包含夜间构建和新功能开发release
分支用于特定的发布候选版本,作为新的稳定版本之前stable
包含稳定版本发布,通过 foundryup
提供在任何 release
之前,我们将把版本作为 发布候选 提供,并给社区机会进行测试并与我们分享反馈。我们所有的发布都使用 Github 工件认证进行 认证和验证,以便你验证我们二进制文件的完整性。
迁移到 v1.0 通过我们的 迁移指南 非常简单。
虽然 v1.0 代表了一个稳定和成熟的工具包,但我们对 Foundry 的愿景仍在不断发展。我们特别期待以下路线图上的功能:
anvil
提升为 reth-anvil
,并带来更强大的本地开发能力,开箱即用的 reth 性能和功能。revm
提高模块化和灵活性。只需运行命令安装 foundryup
:
Foundry v1.0 的实现离不开我们充满活力的贡献者社区,成千上万的开发者每天使用 Foundry,提供宝贵的反馈并推动以太坊开发的边界。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!