🗒️Foundry框架学习

type
status
date
slug
summary
tags
category
icon
password
✅一些Foundry框架知识点。简单记录,方便回顾。

项目安装步骤

1. 终端执行命令:

notion image
注:若安装过程中出现以下错误信息:
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:

notion image
输入forge --version,可得到forge版本
notion image
每当你想安装Foundry的更新时,只需再次运行foundryup

3. 初始化foundry项目

创建新的空文件夹,输入:forge init (或 forge init --force)
notion image
项目目录文件如下:
notion image
恭喜你,项目成功建立!
 

安装依赖库

和remix不同,foundry不能自动解析导入库,需要安装依赖库。
notion image
这个网址安装chainlink最新的依赖库:
notion image
notion image
foundry.toml添加配置:
重新构建项目:
notion image
成功!

部署(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:在每个测试用例运行之前调用的可选函数 • testFailtest 前缀的测试的反面 - 如果函数没有 revert,则测试失败
代码基本样式如下:
注:测试函数必须具有externalpublic可见性。 声明为internal或 private 不会被 Forge 选中,即使它们以 test 为前缀。
运行测试代码:
notion image
可以在forge test后添加-vv或-vvv或-vvvv或-vvvvv,几个v就代表测试的详细度是多少,默认为1。
详细程度:
  • 2:打印所有测试的日志
  • 3:打印失败测试的执行跟踪
  • 4:打印所有测试的执行跟踪,并为失败的测试设置跟踪
  • 5:打印所有测试的执行和设置跟踪
特指某合约或函数:

Foundry脚本

在scrpt\目录下,文件名为***.s.sol。
代码基本样式如下:
startBroadcast():表示开始记录所有后续的交易。这通常用于部署或执行交易。
stopBroadcast():表示停止记录交易。
进行foundry部署脚本:
notion image

分叉测试

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

makeAddr():

Forge 测试框架提供的一个工具函数,用于生成一个固定的、相同的地址。例:

模糊测试(Fuzz testing)

通过向合约函数提供大量随机数据来测试其行为,自动化地找到潜在的漏洞和异常情况。可分为无状态模糊测试和有状态模糊测试。

无状态模糊测试

无状态模糊测试的重点是测试单个函数在不同输入下的行为,而不关注合约的状态变化。测试每个输入都是独立的,不会受前一个测试结果的影响。
  • 适用场景:简单的数学函数、验证函数、条件检查等。
  • 示例:假设我们有一个函数multiply(uint256 a, uint256 b),无状态模糊测试会通过为ab生成各种随机值,测试multiply函数的输出是否符合预期。

有状态模糊测试

有状态模糊测试则侧重于测试函数在合约的状态发生变化后,其行为是否仍然正确。它会模拟不同状态下的合约行为,例如调用函数时合约余额、用户余额或其他状态变量的变化。
  • 适用场景:复杂的智能合约,尤其是涉及多步骤交互的场景,如去中心化交易所、借贷合约等。
  • 示例:如果一个借贷合约有depositborrowrepay功能,有状态模糊测试可以模拟用户先存款,再借款,再还款的过程,测试每个状态变化是否符合预期。

不变量测试(Invariant Tests)

不变量(invariant)定义合约在所有状态下应该保持的规则,然后在一系列随机操作后验证这些规则是否依然成立。多用于有状态模糊测试。
Handler可以看作是一种用于生成和执行随机操作序列的助手,定义可能影响合约状态的操作,通过这些操作模拟用户行为。 在foundry.toml的配置中:

单元测试(Unit Testing)

测试应用程序中最小的、独立的单元,比如函数或方法。单元测试通常针对单个功能进行测试,不依赖其他模块。

集成测试(Integration Testing)

测试多个单元模块或功能之间的集成,以确保它们在一起工作时能正确交互。

Fork 测试(Fork Testing)

通过创建现有区块链状态的分叉来进行测试,通常用于模拟真实网络环境中的交互。
 
上一篇
Solidity易混点
下一篇
项目开发问题
Loading...