本文介绍了如何使用新工具Foundry进行智能合约开发,特别是ERC20标准合约的测试和部署。通过详细的步骤说明,读者可以了解Foundry的安装、目录结构、代码编写以及测试方法,包括基础测试和模糊测试。文中还包含了相关代码示例和技巧,适合希望深入理解Foundry使用的开发者。
如果你是 web3 和智能合约开发的新手,那你真是走运。与几年前相比,如今开发智能合约要容易得多。在几年前,开发智能合约的唯一工具是 Truffle。随后,著名的工具 Builder 现在被称为 Hardhat( 链接 到其重新品牌的文章)。
就在几周前,我们发表了一篇关于比较 Hardhat 和 Truffle 的文章,以及今天可用于更快速高效地开发智能合约的工具:Hardhat 还是 Truffle?作为初学者的区块链开发者,我该选择哪个
在发布上述文章后,我们的许多观众向我们请求,希望我们也能涵盖 Foundry。Foundry 作为一个智能合约开发的工具在区块链行业中是新兴的,只在 2021 年 12 月推出。尽管 Foundry 仅有 6 个月的历史,但它 nevertheless 获得了大量赞誉,被认为是测试智能合约的最快工具之一。
本文并不是介绍使用 Foundry 的好处,关于这一点你可以查阅这篇文章:介绍 Foundry 以太坊开发工具箱;但本文的重点在于:
在我们深入讲解 Foundry 之前,我们想向我们的嘉宾作者 Akshay 致以衷心的感谢(可以通过 Twitter、LinkedIn 和 Medium 联系到他),没有他的卓越努力,这一切都不可能实现。他是我们下面所有文档的核心人物。
对于 Linux 和 Mac 用户,只需运行以下命令:
curl -L https://foundry.paradigm.xyz | bash
然后运行命令 foundryup
在你的本地系统上安装 Foundry。
这将安装 foundryup,一个帮助你安装 forge、cast 和 anvil 的工具:这是 Foundry 进行全面智能合约开发的三大支柱。
虽然这三个都是独立的工具,但老实说,你将同时使用这三个工具来更快速高效地开发和测试你的智能合约。
对于 Windows 操作系统,安装步骤有所不同。请按照以下步骤进行:
你的 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 或你喜爱的代码编辑器中打开这个文件夹。该文件夹的目录结构应该如下所示:
目录结构简要回顾:
你可以随意浏览这个特别文件夹,但我们建议你不要过多操作,因为你不知道你可能会破坏什么,这将影响我们整个编码体验。
步骤 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: 测试(本文的核心)
学习提示!!!
在 Hardhat 中,通过 hardhat.config.js 配置定义签名者或地址的选项;Foundry 不会有 foundry.config.ts。因此,从特定地址创建签名者和进行交易的能力是在测试文件中直接设置。
在定义签名者之后,我们有设置,用我们选择的名称和符号来部署合约,然后测试名称和符号是否正确设置。
我们不会浪费你的时间去解释上述测试。这些测试相当简单,且自我解释。
正如你所注意到的,我们交替使用 assertTrue
和 assertEq
。以下是一个简单的指南:
assertTrue -> 使用此方法当你的测试函数返回布尔值时
assertEq -> 当你的测试函数返回 uint,address,string 时使用此方法
使用命令 forge test
运行测试。
如果你收到任何错误信息,请尝试运行命令 RUST_BACKTRACE=1 forge test
将 Rust 回溯环境变量设置为 false。
因此,你的输出应该类似于:
Prank: 不要对这里的名称进行评判,以下是其含义:
.connect(address)
进行智能合约调用相似。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-Dev,Akshay Tarpara 和 Pari Tomar
- 原文链接: medium.com/buildbear/web...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!