Foundry 创建新项目

本章介绍如何创建一个新的 Foundry 项目。

推特@Hita_DAO    DiscordHitaDAO

我们演示如何创建一个 Foundry 新项目,并对项目进行编译和测试。

新建项目

新建一个 Foundry 新项目,需要使用 forge init 命令:

$ forge init hello

让我们看看 forge 为我们生成的内容:

$ cd hello
$ tree . -d -L 1
.
├── lib
├── script
├── src
└── test

4 directories

这是使用 forge 命令初始化一个新的项目,最终形成的项目结构。

各个目录的用途:

  • lib:用于存放项目依赖的库。如果你的项目依赖于外部智能合约或库(比如 OpenZeppelin 的合约),它们将会被安装在这个目录下。
  • script:包含用于与智能合约交互的脚本。这些脚本可以用来部署合约、执行交易或者调用合约的函数。
  • src:存放项目的 Solidity 源代码文件。我们编写和测试的智能合约代码位于这个目录。
  • test:包含项目的测试文件。我们使用 Foundry 编写和执行针对智能合约的测试,以验证合约功能的正确性。

这个结构旨在帮助开发者组织和管理智能合约项目,使得代码更加模块化,便于管理和协作。

通过将合约代码、测试和脚本分别放在不同的目录中,开发者可以更容易地维护项目,并使用 forge 提供的命令高效地进行编译、测试和部署等操作。

新项目的 src 目录下生成了一个例子合约 Counter.sol。我们实际项目中,通常会删除这个例子合约,并把我们开发的合约放入 src 目录下。

新项目的 test 目录下生成了一个测试合约 Counter.t.sol。我们实际项目中,通常会删除这个测试合约,并编写自己的测试合约。

编译合约

我们可以使用 forge compile 编译合约:

$ forge compile
Compiling 10 files with 0.8.16
Solc 0.8.16 finished in 3.97s
Compiler run successful

执行 forge compile 命令,会对 src 目录下的合约进行编译。如果合约有错误就会提示错误信息,当我们修改完合约后,可以再次执行该命令,直至通过编译

另外,有些 Foundry 版本会有 forge build 命令,它与 forge compile 功能基本相同,我们不再单独解释。

测试合约

我们可以使用 forge test 运行测试:

$ forge test
No files changed, compilation skipped

Running 2 tests for test/Counter.t.sol:CounterTest
[PASS] testIncrement() (gas: 28312)
[PASS] testSetNumber(uint256) (runs: 256, μ: 27376, ~: 28387)
Test result: ok. 2 passed; 0 failed; finished in 24.43ms

执行 forge test 命令,就会使用 test 目录下的测试合约进行测试,并输出测试结果。

我们依据测试结果,修改合约的错误后,可以再次执行该命令,直至通过测试。

使用模板创建项目

如果我们想使用不同的模板创建一个新项目,可以通过指令参数 --template,如下所示:

$ forge init --template https://github.com/foundry-rs/forge-template hello_template

通过指定模板的方式,可以创建一个跟模板相同的新项目。

例子中的模板是一个空 Foundry 项目,里面的合约是一个空合约,测试脚本也是一个空脚本。

缓存文件

我们使用 forge 命令编译或者测试合约时,会产生了两个新目录:out 和 cache

这两个目录中是为了缓存编译和测试结果,用来提高运行效率。

out 目录包含了合约工件,例如 ABI; cache 用来作为缓存编译结果,以便仅仅去重新编译那些需要编译的内容。