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

2022-02-22 18:18:41 浏览数 (1)

本文作者:auok007[1]

介绍

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

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

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

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

环境安装

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

代码语言:javascript复制
$ cargo install --git https://github.com/gakonst/foundry --bin forge --locked

###新建项目

代码语言:javascript复制
$ mkdir n004
$ cd n004
$ forge init

成功后是这个样子,在 windows 上会出现,不自动下载 ds-test 的情况,自己下载再拷贝到这个 lib 目录下就可以

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

HelloWorld.sol 的内容如下:

代码语言:javascript复制
// 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 目录,里面添加测试用例就好了

一个最简单的例子是这样

代码语言:javascript复制
// 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 命令一样,开始测试

代码语言:javascript复制
forge test

测试结果如下:

16434477261.png

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

代码语言:javascript复制
emit log_string("hello");

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

加入依赖

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

代码语言:javascript复制
forge install openzeppelin/openzeppelin-contracts

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

代码语言:javascript复制
[default]
src = 'src'
out = 'out'
libs = ['lib']
remappings = ['ds-test/=lib/ds-test/src/,'@openzeppelin=lib/openzeppelin-contracts/']

改好后像这样:

代码语言:javascript复制
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.[2]

Getting Started With Forge — Wilson (mirror.xyz)[3]

Getting Started with Forge — crisgarner.eth (mirror.xyz)[4]

参考资料

[1]

auok007: https://learnblockchain.cn/people/6025

[2]

GitHub - gakonst/foundry: Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.: https://github.com/gakonst/foundry

[3]

Getting Started With Forge — Wilson (mirror.xyz): https://w.mirror.xyz/mOUlpgkWA178HNUW7xR20TdbGRV6dMid7uChqxf9Z58

[4]

Getting Started with Forge — crisgarner.eth (mirror.xyz): https://mirror.xyz/crisgarner.eth/BhQzl33tthkJJ3Oh2ehAD_2FXGGlMupKlrUUcDk0ALA

0 人点赞