DEV Community

晓道
晓道

Posted on

3 3

使用Foundry,感受快,rust对写合约的支持

介绍

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

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

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

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

环境安装

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

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

$ cargo install --git https://github.com/gakonst/foundry --bin forge --locked
Enter fullscreen mode Exit fullscreen mode

新建项目

$ mkdir n004
$ cd n004
$ forge init
Enter fullscreen mode Exit fullscreen mode

成功后是这个样子,在windows上会出现,不自动下载ds-test的情况,自己下载再拷贝到这个lib目录下就可以
16434469411.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;
    }
}
Enter fullscreen mode Exit fullscreen mode

再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");
    }
}
Enter fullscreen mode Exit fullscreen mode

有几点,要注意:

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

完成代码,就可以跑跑:

和harthat命令一样,开始测试

forge test
Enter fullscreen mode Exit fullscreen mode

测试结果如下:

16434477261.png

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

emit log_string("hello");
Enter fullscreen mode Exit fullscreen mode

运行forge test 是不会有变化的,需要加参数 -vvvvvvvvvvvvvv
v越多日志越详细,很unix
如下:
16434495901.png

加入依赖

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

forge install openzeppelin/openzeppelin-contracts
Enter fullscreen mode Exit fullscreen mode

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

[default]
src = 'src'
out = 'out'
libs = ['lib']
remappings = ['ds-test/=lib/ds-test/src/,'@openzeppelin=lib/openzeppelin-contracts/']
Enter fullscreen mode Exit fullscreen mode

改好后像这样:

remappings = ['@ds-test=lib/ds-test/src/','@openzeppelin=lib/openzeppelin-contracts/']
Enter fullscreen mode Exit fullscreen mode

还有个专门的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.
Getting Started With Forge — Wilson (mirror.xyz)
Getting Started with Forge — crisgarner.eth (mirror.xyz)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs