3

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

 2 years ago
source link: https://learnblockchain.cn/article/3502
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

rust 版的合约开发工具Foundry入门

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

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

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

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

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

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

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

emit log_string("hello");

运行forge test 是不会有变化的,需要加参数 -vvvvvvvvvvvvvv
v越多日志越详细,很unix
如下:
16434495901.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.
Getting Started With Forge — Wilson (mirror.xyz)
Getting Started with Forge — crisgarner.eth (mirror.xyz)

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2022-01-29 18:01
  • 阅读 ( 228 )
  • 学分 ( 14 )
  • 分类:智能合约

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK