本文介绍了以太坊开发中常用的工具,包括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 内部原理之前,值得了解一下真正的开发者工具如何在实践中使用追踪,以及这些追踪有助于解决哪些问题。
当今大多数智能合约工具都依赖于追踪,以便在低级别检查交易:它们如何执行,在哪里失败,进行了哪些内部调用,以及状态如何被修改。无论你是运行测试、调试 reverts,还是在部署后分析合约,你几乎总是在幕后依赖于追踪数据。
一个追踪展示了:
让我们看看生态系统中一些最流行的工具如何使用 EVM 追踪:
所有这些工具都依赖于 EVM 追踪,但它们以不同的方式使用它们。
在这篇文章的其余部分,我们将使用 Foundry,它在本地、可编写脚本的环境中为我们提供了完整的追踪可见性,非常适合理解 EVM 的实际工作原理。
让我们从零开始,设置 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/ 文件夹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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!