🗒️Foundry框架学习
type
status
date
slug
summary
tags
category
icon
password
✅一些Foundry框架知识点。简单记录,方便回顾。
项目安装步骤
1. 终端执行命令:

注:若安装过程中出现以下错误信息:
curl: (7) Failed to connect to raw.githubusercontent.com port 443 after 22 ms: Connection refused
表明DNS污染,尝试执行以下操作:
①修改文件:sudo vim /etc/hosts
②文件末尾添加:
③安装network-manager:sudo apt-get install network-manager
④重启网络:sudo systemctl restart NetworkManager
最后两步是关键
2. 按照提示安装foundry:

输入forge --version,可得到forge版本

每当你想安装Foundry的更新时,只需再次运行
foundryup
3. 初始化foundry项目
创建新的空文件夹,输入:forge init (或 forge init --force)

项目目录文件如下:

恭喜你,项目成功建立!
安装依赖库
和remix不同,foundry不能自动解析导入库,需要安装依赖库。

从这个网址安装chainlink最新的依赖库:


foundry.toml添加配置:
重新构建项目:

成功!
部署(forge create)
执行结果中会打印出部署的交易 hash 、部署的合约地址以及验证状态。
●
rpc-url
: 即区块链节点 RPC,例如:https://eth-sepolia.g.alchemy.com/v2/xxxxxxxxx●
private-key
: 即钱包私钥,建议创建专门用来开发测试的新钱包。●
etherscan-api-key
: 即区块链浏览器的 API KEY TOKEN,用于验证合约。●
verify
: 验证合约,即在浏览器中开源合约的代码●
MyContract
: 实际部署的合约,由于一个 solidity 中允许存在多个合约,因此这里指定需要部署的合约名称。●
constructor-args
: 合约的构造参数,如果没有,可以不设置该属性可以用
.env
文件保存隐私信息(如:节点 RPC、私钥等),记得用source .env
:Cast
用于执行以太坊 RPC 调用。 可以使用 Cast 进行智能合约调用、发送交易或检索任何类型的链数据。
Anvil
Anvil 允许开发者在本地环境中运行一个轻量级的以太坊节点。
要启动 Anvil,只需在命令行中输入
anvil
,它将自动启动一个本地节点。启动后,你将看到一系列已生成的开发账户和私钥,以及节点侦听的地址和端口信息。默认情况下,Anvil 生成10个开发账户,但你可以通过以下命令指定生成更多或更少的账户:
anvil -h
可以查看所有 Anvil 提供的配置选项。Chisel
Chisel 是一个 Solidity REPL("读取-评估-打印-循环 "的缩写),它允许开发人员编写和测试 Solidity 代码片段。它提供了一个交互式环境,用于编写和执行 Solidity 代码,同时还提供了一组内置命令,用于处理和调试代码。
启动 Chisel 非常简单,只需在命令行中输入
chisel
即可。foundry测试
测试文件在test\下。任何具有以
test
开头的函数的合约都被认为是一个测试。 通常,测试将按照约定放在 test
中,并以 .t.sol
结尾。
• setUp
:在每个测试用例运行之前调用的可选函数
• testFail
: test
前缀的测试的反面 - 如果函数没有 revert,则测试失败代码基本样式如下:
注:测试函数必须具有
external
或public
可见性。 声明为internal
或 private
不会被 Forge 选中,即使它们以 test
为前缀。运行测试代码:

可以在forge test后添加-vv或-vvv或-vvvv或-vvvvv,几个v就代表测试的详细度是多少,默认为1。
详细程度:
- 2:打印所有测试的日志
- 3:打印失败测试的执行跟踪
- 4:打印所有测试的执行跟踪,并为失败的测试设置跟踪
- 5:打印所有测试的执行和设置跟踪
特指某合约或函数:
Foundry脚本
在scrpt\目录下,文件名为***.s.sol。
代码基本样式如下:
startBroadcast()
:表示开始记录所有后续的交易。这通常用于部署或执行交易。stopBroadcast()
:表示停止记录交易。进行foundry部署脚本:

分叉测试
分叉是指在特定时间点创建区块链状态的副本。这个副本称为fork,然后用于在模拟环境中运行测试。
- 新建.env文件,在Alchemy中新建app,然后复制所需链的链接到.env文件:
- .gitignore文件中需要有:
- 刷新:
- 测试
- 测试覆盖率

生成测试覆盖率并保存到coverage.txt文件中,显示还没有测试的行:
作弊码(cheatcodes)
vm.*
函数是Foundry的内置函数,用于Solidity智能合约的测试。- vm.prank()
将
msg.sender
设置为指定地址, 下一次合约调用由该地址发起。- vm.txGasPrice()
设置gas价格
- vm.startBroadcast():
开始记录并广播之后的交易。
这段时间内,所有的状态修改操作(例如合约部署、状态更新)都会被记录下来。
- vm.stopBroadcast():
停止广播所有交易。
在这之后,操作不会再被广播到链上,但之前广播的事务可以继续进行并被验证。
- vm.expectEmit()
用于预期某个事件会被触发,并捕获该事件的参数。
五个参数,前三个布尔值用于
indexed
参数,第四个用于 data
,最后一个是合约地址。- vm.warp()
设置区块链的当前时间戳,单位为秒。
- vm.roll()
设置当前区块号。
- vm.readfile()
用于读取文件内容,并将其内容作为字符串返回。
ffi
ffi允许执行任意 shell 命令并捕获输出。
chisel
用于在本地或分叉网络上快速测试 Solidity 片段。
foundry-devops
为了只和最近部署的合约进行交互,安装foundry-devops工具:
makefile
如果觉得终端输入的命令过于复杂,可以安装make:
新建Makefile文件:
代码举例:
然后如果要在sepolia上部署合约,只需:
前端
安装插件live server。可右键打开html文件。

makeAddr():
Forge 测试框架提供的一个工具函数,用于生成一个固定的、相同的地址。例:
模糊测试(Fuzz testing)
通过向合约函数提供大量随机数据来测试其行为,自动化地找到潜在的漏洞和异常情况。可分为无状态模糊测试和有状态模糊测试。
无状态模糊测试
无状态模糊测试的重点是测试单个函数在不同输入下的行为,而不关注合约的状态变化。测试每个输入都是独立的,不会受前一个测试结果的影响。
- 适用场景:简单的数学函数、验证函数、条件检查等。
- 示例:假设我们有一个函数
multiply(uint256 a, uint256 b)
,无状态模糊测试会通过为a
和b
生成各种随机值,测试multiply
函数的输出是否符合预期。
有状态模糊测试
有状态模糊测试则侧重于测试函数在合约的状态发生变化后,其行为是否仍然正确。它会模拟不同状态下的合约行为,例如调用函数时合约余额、用户余额或其他状态变量的变化。
- 适用场景:复杂的智能合约,尤其是涉及多步骤交互的场景,如去中心化交易所、借贷合约等。
- 示例:如果一个借贷合约有
deposit
、borrow
和repay
功能,有状态模糊测试可以模拟用户先存款,再借款,再还款的过程,测试每个状态变化是否符合预期。
不变量测试(Invariant Tests)
不变量(
invariant
)定义合约在所有状态下应该保持的规则,然后在一系列随机操作后验证这些规则是否依然成立。多用于有状态模糊测试。Handler
可以看作是一种用于生成和执行随机操作序列的助手,定义可能影响合约状态的操作,通过这些操作模拟用户行为。
在foundry.toml的配置中:单元测试(Unit Testing)
测试应用程序中最小的、独立的单元,比如函数或方法。单元测试通常针对单个功能进行测试,不依赖其他模块。
集成测试(Integration Testing)
测试多个单元模块或功能之间的集成,以确保它们在一起工作时能正确交互。
Fork 测试(Fork Testing)
通过创建现有区块链状态的分叉来进行测试,通常用于模拟真实网络环境中的交互。
上一篇
Solidity易混点
下一篇
项目开发问题
Loading...