EVM开发者工具详解 + Foundry设置

本文介绍了以太坊开发中常用的工具,包括Foundry、Hardhat、Tenderly和Blockscout,它们都依赖EVM traces来帮助开发者测试、调试和理解智能合约的行为。文章还详细介绍了如何使用Foundry搭建本地调试环境,部署合约,并模拟交易,以便开发者能够逐步检查EVM的处理过程。

在深入研究字节码和原始 EVM 追踪之前,值得了解一下使这种探索成为可能的开发者工具

每一个现代以太坊框架:Foundry、Hardhat、Tenderly、Blockscout。都建立在相同的基础之上:EVM 追踪。这些追踪捕获了每个执行的 opcode,每个内部调用,以及花费的每个 gas 单元,允许开发者测试、调试和准确理解他们的合约在做什么。

在这篇文章中,你将学习到:

1. Foundry

2. Hardhat

3. Tenderly

4. Blockscout

在这篇文章中,我们将比较这些工具在实践中如何使用追踪,然后使用 Foundry 设置一个本地调试环境,这样你就可以逐步部署、测试和检查合约,而无需 mainnet 交易。

EVM 的开发者工具

在我们深入研究原始 EVM 内部原理之前,值得了解一下真正的开发者工具如何在实践中使用追踪,以及这些追踪有助于解决哪些问题。

当今大多数智能合约工具都依赖于追踪,以便在低级别检查交易:它们如何执行,在哪里失败,进行了哪些内部调用,以及状态如何被修改。无论你是运行测试、调试 reverts,还是在部署后分析合约,你几乎总是在幕后依赖于追踪数据。

一个追踪展示了:

  • 每个被执行的 opcode
  • 每一步的 stackmemory,和 program counter (PC)
  • 什么时候发生 子调用(如外部合约调用)
  • 什么 storage 被读取或写入
  • revert 发生在哪里以及为什么(如果发生了)

让我们看看生态系统中一些最流行的工具如何使用 EVM 追踪:

  • Foundry 用于开发和测试智能合约的快速的、CLI 原生的框架。它使用 EVM 追踪来模拟和分析测试期间的交易,使其易于捕获错误、理解失败,并在部署前验证合约行为。Foundry 在本地为你提供这种可见性,而无需部署或等待链上执行。它旨在让开发者自信地构建并高效地调试,追踪数据深入集成到测试工作流程中。网络 fork 和本地模拟可用。] Hardhat 灵活的开发环境,主要通过插件和内部开发工具使用 EVM 追踪。虽然默认情况下它不会直接暴露追踪,但它利用追踪来增强测试反馈,在交易失败时显示错误消息、堆栈追踪和调用数据。网络 fork 和本地模拟可用。
  • Tenderly 用于模拟和调试智能合约交易的可视化平台。它使用 EVM 追踪在丰富的 UI 中重建执行过程 —— 在每一步显示 opcodes、堆栈值、内存、存储差异和 gas 成本。Tenderly 支持 network forking,允许你在隔离的环境中针对主网或支持的测试网的快照模拟交易。虽然它没有提供与 Foundry 或 Hardhat 相同的本地控制,但它通过浏览器或 API 提供了强大的模拟功能 —— 包括 测试变更、模拟账户预览 gas 使用量 而无需发送真实交易的能力。它特别适用于检查实时交易行为和调试部署后复杂的合约。
  • Blockscout → 这是一个以太坊兼容链的区块浏览器。它使用追踪来显示内部合约调用、嵌套执行流程和在基本交易列表中不可见的值转移。适用于已挖掘的交易,不提供模拟。它的作用是观察性的:帮助开发者和用户了解给定交易被确认后内部发生了什么。

所有这些工具都依赖于 EVM 追踪,但它们以不同的方式使用它们。

  • FoundryHardhat 将追踪带入你的本地工作流程,让你控制执行、状态和模拟,以进行快速的迭代测试。
  • Tenderly 提供了一个可视化模拟平台,支持网络 forking、账户模拟和深度追踪检查 —— 但通过托管 UI 或 API 而不是本地控制。
  • Blockscout 专注于追踪可视化,而不是模拟 —— 它非常适合检查已挖掘的交易,但不让你 fork 或测试假设情况。

在这篇文章的其余部分,我们将使用 Foundry,它在本地、可编写脚本的环境中为我们提供了完整的追踪可见性,非常适合理解 EVM 的实际工作原理。

使用 Foundry 在本地部署:从设置到合约

让我们从零开始,设置 Foundry,部署一个合约,并在本地模拟一个交易。

pragma solidity ^0.8.12;
contract Storage {
    struct my_storage_struct {
        uint256 number;
        string owner;
    }
    my_storage_struct my_storage;

    function store(my_storage_struct calldata new_storage) public {
        if (new_storage.number > 100) {
            revert("Number too large");
        }
        my_storage = new_storage;
    }
    function retrieve() public view returns (my_storage_struct memory){
        return my_storage;
    }
}

在我们追踪任何东西之前,让我们先进行这个演练,它假设你具有基本的命令行经验并且安装了 git

步骤 1:安装 Foundry

Foundry 提供了一个快速的 CLI,用于测试、部署和与智能合约交互。使用以下命令安装它:

curl -L https://foundry.paradigm.xyz | bash
foundryup

这将安装 forge(测试运行器)、cast(交易 + RPC CLI)和 anvil(本地 EVM 节点)

forge --version
cast --version
anvil --version

步骤 2:初始化一个新项目

mkdir evm-trace-demo
cd evm-trace-demo
forge init

这为你提供:

  • 用于合约的 src/ 文件夹
  • 用于测试的 test/ 文件夹
  • 用于 solidity 脚本的 script/ 文件夹
  • foundry.toml 配置文件

步骤 3:编写合约

src/Storage.sol 内部,粘贴上面的合约。

步骤 4:编译合约

运行 forge build。你应该看不到任何错误,并且生成了 out/Storage.sol/Storage.json ABI 文件。

步骤 5:启动本地节点

通过运行以下命令启动 Anvil,Foundry 的本地 EVM:

anvil

这将启动一个本地的、兼容 fork 的链,并为你提供 10 个预先出资的测试账户,它们的私钥以相同的顺序列出。

注意注意打印的第一个私钥和地址,我们将使用它们进行部署,

你将看到我们新 fork 的链运行在 http://localhost:8545

步骤 6:部署合约

使用 forge 部署合约:

forge create src/Storage.sol:Storage \
  --rpc-url http://localhost:8545 \
  --private-key <your-key> \
  --broadcast

输出应该看起来像:

[⠊] Compiling...
[⠒] Compiling 1 files with Solc 0.8.30
[⠢] Solc 0.8.30 finished in 37.11ms
Compiler run successful!
Deployer: <your-address>
Deployed to: <the-address-of-the-smart-contract>
Transaction hash: <some-tx-hash>

注意:<your-key> 是前一个终端中打印的密钥之一。

没有--braodcast forge 将只进行 dry-run,而不会在 anvil 上部署。

这完成了你的本地设置。此时,你已经:

  • 编译并部署了一个合约
  • 一个正在运行的本地节点
  • 对交易、存储和追踪的完全控制

接下来,我们将模拟对 store() 函数的调用,并逐步探索 EVM 如何处理该调用。

总结

EVM 追踪为现代以太坊工具提供支持。这篇文章比较了 Foundry、Hardhat、Tenderly 和 Blockscout,然后引导你启动一个本地 Foundry 实验室:安装、初始化、构建、运行 Anvil 和部署。 这样你就可以逐步测试和检查交易,而无需接触主网。

  • 原文链接: medium.com/@andrey_obruc...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Andrey Obruchkov
Andrey Obruchkov
江湖只有他的大名,没有他的介绍。