Web3 初学者:如何使用 Foundry 测试 ERC20 合约并进行模糊测试

本文介绍了如何使用新工具Foundry进行智能合约开发,特别是ERC20标准合约的测试和部署。通过详细的步骤说明,读者可以了解Foundry的安装、目录结构、代码编写以及测试方法,包括基础测试和模糊测试。文中还包含了相关代码示例和技巧,适合希望深入理解Foundry使用的开发者。

感谢: https://www.paradigm.xyz/

背景

如果你是 web3 和智能合约开发的新手,那你真是走运。与几年前相比,如今开发智能合约要容易得多。在几年前,开发智能合约的唯一工具是 Truffle。随后,著名的工具 Builder 现在被称为 Hardhat链接 到其重新品牌的文章)。

就在几周前,我们发表了一篇关于比较 Hardhat 和 Truffle 的文章,以及今天可用于更快速高效地开发智能合约的工具:Hardhat 还是 Truffle?作为初学者的区块链开发者,我该选择哪个

新工具的出现:Foundry

在发布上述文章后,我们的许多观众向我们请求,希望我们也能涵盖 Foundry。Foundry 作为一个智能合约开发的工具在区块链行业中是新兴的,只在 2021 年 12 月推出。尽管 Foundry 仅有 6 个月的历史,但它 nevertheless 获得了大量赞誉,被认为是测试智能合约的最快工具之一。

本文重点

本文并不是介绍使用 Foundry 的好处,关于这一点你可以查阅这篇文章:介绍 Foundry 以太坊开发工具箱;但本文的重点在于:

  1. 你如何使用 Foundry 来测试一个标准的 ERC20 智能合约以及
  2. 你如何使用 Foundry 在测试网络上部署 ERC20 智能合约

感谢致辞

在我们深入讲解 Foundry 之前,我们想向我们的嘉宾作者 Akshay 致以衷心的感谢(可以通过 TwitterLinkedInMedium 联系到他),没有他的卓越努力,这一切都不可能实现。他是我们下面所有文档的核心人物。

安装

对于 LinuxMac 用户,只需运行以下命令:

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

然后运行命令 foundryup 在你的本地系统上安装 Foundry。

这将安装 foundryup,一个帮助你安装 forge、cast 和 anvil 的工具:这是 Foundry 进行全面智能合约开发的三大支柱。

虽然这三个都是独立的工具,但老实说,你将同时使用这三个工具来更快速高效地开发和测试你的智能合约。

对于 Windows 操作系统,安装步骤有所不同。请按照以下步骤进行:

  1. 下载 Rust :- https://www.rust-lang.org/tools/install
  2. 运行下载的 exe 文件
  3. 选择 1 默认安装

你的 Windows 终端应该如下所示:

接下来,运行以下命令:

cargo install --git https://github.com/foundry-rs/foundry foundry-cli anvil --bins --locked

请注意,运行上述命令之前必须在你的 Windows 中安装 Microsoft Visual Studio。

编码、编码、再编码 💻

不浪费任何时间,我们将进入编码。今天我们的目标是专注于 Foundry 的“模糊测试”功能,因此我们选择了一个 ERC20 代币的示例智能合约。

步骤 1: 创建一个你喜欢名称的文件夹,或使用我们建议的名称:foundryFirstSteps,可以在你的笔记本电脑/台式机/编码机器上的任何位置。

步骤 2: 打开终端,cd 到 foundryFirstSteps 并运行以下命令:

forge init

你应该在屏幕上看到类似这样的内容:

步骤 3: 在 VSCode 或你喜爱的代码编辑器中打开这个文件夹。该文件夹的目录结构应该如下所示:

目录结构简要回顾:

  1. lib 文件夹就像 Foundry 的动力核心。这是你在项目中需要的最重要的文件夹。

你可以随意浏览这个特别文件夹,但我们建议你不要过多操作,因为你不知道你可能会破坏什么,这将影响我们整个编码体验。

  1. 另外,你还有 2 个主要文件夹,一个是 Sourcesrc,另一个是 scripts。我们将在 src 文件夹中进行智能合约开发。

步骤 3: 在 src 文件夹中创建一个新的智能合约文件,命名为 MyToken.sol,并将以下内容复制到该文件:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import "openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20{

    constructor (string memory _name, string memory _symbol) ERC20 (_name,_symbol){
    }

    function mint(address to, uint256 amount) public virtual {
        _mint(to,amount);
    }

    function burn(address form, uint amount) public virtual {
        _burn(form, amount);
    }
}

正如你所注意到的,这是一个非常标准的 ERC20 智能合约,合约中没有任何花哨的东西。

步骤 4: 要在我们的 Foundry 仓库中安装 openzeppelin-contracts [因为这不是节点模块],你需要运行以下命令:

forge install openzeppelin/openzepplin-contracts

此外,你需要创建一个名为 remappings.txt 的文件,然后在 remappings.txt 中放入这一行:

ds-test/=lib/forge-std/lib/ds-test/src/
forge-std/=lib/forge-std/src/
openzeppelin-contracts/=lib/openzeppelin-contracts/

这告诉 Forge,“嘿,每当你碰到 openzepplin/,就去 lib/openzeppelin-contracts/ 里寻找。”

步骤 5: 测试(本文的核心)

  • 在你的 test 文件夹中,已经有一个名为 Contract.t.sol 的文件;你可以选择删除它,或者删除其内容并重命名为 MyToken.t.sol;因为我们将创建自己的测试文件并运行这些测试。
  • 现在,我们将逐一进行每个测试项目,以便你能很好地掌握这些内容:
  • 设置:

  • 从 lib 文件夹中导入最重要的文件:Test.sol。这个文件将是我们将编写的测试的瑞士军刀。确保正确导入这个文件非常关键,任何导入错误都会导致我们的测试失败。
  • 然后,我们将导入我们的合约 MyToken.sol;或者说,你选择为合约命名的文件名。
  • 一些基本变量设置:
  1. Address aliceAddress bob。正如你所注意到的,我们为这个定义调用了一个 vm 函数。
  2. VMVM.sol 导入;通过 Test.sol 及其导入 Script.sol
  3. 名称应该很直接:它是 Virtual Machine.sol 的缩写;
  4. 如果你跟随 addr 函数,你会意识到一个非常重要的事情。这个函数返回给定私钥的一组地址。

学习提示!!!

在 Hardhat 中,通过 hardhat.config.js 配置定义签名者或地址的选项;Foundry 不会有 foundry.config.ts。因此,从特定地址创建签名者和进行交易的能力是在测试文件中直接设置。

在定义签名者之后,我们有设置,用我们选择的名称和符号来部署合约,然后测试名称和符号是否正确设置。

  • 基本测试:

我们不会浪费你的时间去解释上述测试。这些测试相当简单,且自我解释。

正如你所注意到的,我们交替使用 assertTrueassertEq。以下是一个简单的指南:

assertTrue -> 使用此方法当你的测试函数返回布尔值时

assertEq -> 当你的测试函数返回 uint,address,string 时使用此方法

使用命令 forge test 运行测试。

如果你收到任何错误信息,请尝试运行命令 RUST_BACKTRACE=1 forge test 将 Rust 回溯环境变量设置为 false。

因此,你的输出应该类似于:

  • 高级测试:

Prank: 不要对这里的名称进行评判,以下是其含义:

  1. vm.prank(address) → 这将确保在这一行之后递送的调用是来自于特定地址的;这与在 Hardhat 中使用 .connect(address) 进行智能合约调用相似。
  2. vm.startPrank(address) → [类似于上述 vm.prank] 在这个函数中,我在这一行之后做的所有调用将从该地址发出,除非调用 vm.StopPrank

简单来说,我们可以通过 prank、startPrank 和 stopPrank 任意更改 msg.sender 的值。

  • 失败测试:

  • 同样,我们也不打算浪费你的时间来解释上述测试;因为这些测试也相当简单且自我解释。唯一独特的是这些测试将检查和确认测试函数的区块链交易是失败的而不是成功的。

模糊测试

如上所述,使用 Foundry 进行智能合约开发的最大优势之一是内置的模糊测试功能。请注意,模糊测试并不是在执行智能合约开发时无法通过 Truffle 或 Hardhat 实现的;唯一的区别在于它不是这些工具中的内置功能,而且使用 JS 进行智能合约测试时很难实现模糊测试。从 Foundry 了解到,一些 Hardhat 用户已请求 Hardhat 组织考虑此功能:https://github.com/NomicFoundation/hardhat/issues/2136

上面是我们在测试合约中进行的模糊测试示例。

在编程和软件开发中,模糊测试或模糊测试是一种自动化软件测试技术,涉及向计算机程序提供无效、意外或随机数据作为输入。

来源: 维基百科

简单阅读上述内容,你会意识到这些测试是为了将随机值输入到我们的测试中。这些测试用于找出测试中的边缘情况。

默认情况下,模糊测试将每个测试案例运行 256 次,使用随机输入。如果你想增加运行次数,只需在 foundry.toml 中添加 fuzz_runs = <inputNumber>

以上所有代码都在这里: GitHub链接 ☁️ 💻 🔗

你可以自由使用现有的代码库。遗憾的是,Foundry 仍在开发中,因此可能会遇到一些问题。别担心,你可以在 @uv_labs 上给我们发推文,我们将与你合作解决问题。

如果你喜欢我们的工作,请: (a) 关注我们的出版物:https://medium.com/uv-labs 和 (b) 给我们一个星星🙏。

作者(欢迎反馈):👇

Amateur-DevAkshay TarparaPari Tomar

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

0 条评论

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