使用Foundry，感受快，rust对写合约的支持
Tags: foundry, rust, solidity, hardhat
Published: 2022-02-20 09:03:40

## 介绍

Foundry 是一个新出的rust写的合约开发框架

rust一直在改变编程界的格局，btc C语言开发，eth go主导，也有 rust 的eth
波卡链 直接rust，兴起跨链的生态。

不少web开发工具，打包也采用rust来加速，swc，deno，都是rust 开发。
现在rust 改造到了合约开发框架

快和安全，就是rust 优势吧。
在foundry中也体现出了这点。

## 环境安装

[Releases · gakonst/foundry (github.com)](https://github.com/gakonst/foundry/releases)
这里可以下载安装，windows下forge install 的问题也已经解决。

foundry怎么开始玩呢，
首先安装rust 环境，这个我就不教了。
主要是，安装foundry，这一步特别慢，如果需要windows安装包，可以找我要

```
$ cargo install --git https://github.com/gakonst/foundry --bin forge --locked
```

###新建项目

```
$ mkdir n004
$ cd n004
$ forge init
```

成功后是这个样子，在windows上会出现，不自动下载ds-test的情况，自己下载再拷贝到这个lib目录下就可以
![16434469411.png](https://img.learnblockchain.cn/attachments/2022/01/pfu3U5PX61f502b223cc1.png)

HelloWorld.sol，和test目录里面的文件是我自己改的。

HelloWorld.sol的内容如下：

```
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.10;

contract HelloWorld {
string private greeting;
uint256 public version = 0;

    constructor(string memory _greeting) {
        greeting = _greeting;
    }

    function greet() public view returns (string memory) {
        return greeting;
    }

    function updateGreeting(string memory _greeting) public {
        version += 1;
        greeting = _greeting;
    }
}
```

再src里面再建立一个test目录，里面添加测试用例就好了

一个最简单的例子是这样

```
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import "ds-test/test.sol";
import "src/HelloWorld.sol";

contract HelloWorldTest is DSTest {
HelloWorld hello;

    function setUp() public {
        hello = new HelloWorld("Foundry is fast!");
    }

    function test1() public {
        assertEq(hello.greet(), "Foundry is fast!");
    }

    function test2() public {
        assertEq(hello.version(), 0);
        hello.updateGreeting("Hello World");
        assertEq(hello.version(), 1);
        assertEq(hello.greet(), "Hello World");
    }
}
```

有几点，要注意：

1. 引入DSTest类，引入要测试的合约
2. 测试类继承DSTest类，主要是为了使用DSTest的assertEq这些方法，更多的内容可以直接看
   DSTest类的代码。
3. new 就是部署合约

完成代码，就可以跑跑：

和harthat命令一样，开始测试

```
forge test
```

测试结果如下：

![16434477261.png](https://img.learnblockchain.cn/attachments/2022/01/CeVcGdwY61f505ba2c609.png)

可以直接调用
emit 输出几个日志，

```
emit log_string("hello");
```

运行forge test 是不会有变化的，需要加参数 -vvvvvvvvvvvvvv
v越多日志越详细，很unix
如下：
![16434495901.png](https://img.learnblockchain.cn/attachments/2022/01/Dx5GxjOX61f50d02890a0.png)

### 加入依赖

如果需要安装依赖包，像这样

```
forge install openzeppelin/openzeppelin-contracts
```

在windows上不会成功，自己下载到lib目录就好
如果需要使用@openzeppelin这种import
打开foundry.toml文件 查看

```
[default]
src = 'src'
out = 'out'
libs = ['lib']
remappings = ['ds-test/=lib/ds-test/src/,'@openzeppelin=lib/openzeppelin-contracts/']
```

改好后像这样：

```
remappings = ['@ds-test=lib/ds-test/src/','@openzeppelin=lib/openzeppelin-contracts/']
```

还有个专门的build命令，就是只编译吧。

test命令是先build，再test。

abi 文件在out目录

好了，就这样 ！
希望你玩得愉快，真的感觉到快了，我是觉得非常快了，上面编译forge特别慢。

这里可以下载编译好了的

https://github.com/gakonst/foundry/releases

一些项目的速度对比测试，基本都是快3倍以上

Project	Forge	DappTools	Speedup
guni-lev	28.6s	2m36s	         5.45x
solmate	6s	        46s。	          7.66x
geb。 	11s	        40s	                  3.63x
vaults	1.4s	5.5s	          3.9x

参考
[GitHub - gakonst/foundry: Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.](https://github.com/gakonst/foundry)
[Getting Started With Forge — Wilson (mirror.xyz)](https://w.mirror.xyz/mOUlpgkWA178HNUW7xR20TdbGRV6dMid7uChqxf9Z58)
[Getting Started with Forge — crisgarner.eth (mirror.xyz)](https://mirror.xyz/crisgarner.eth/BhQzl33tthkJJ3Oh2ehAD_2FXGGlMupKlrUUcDk0ALA)