赞
踩
如果你想获得更好的阅读体验,请前往我的博客
本博客的内容主要分为以下四部分:
一是Foundry的介绍与安装,主要介绍为什么选择Foundry进行智能合约开发和安装过程中的各种官方文档中未提及的问题;
二是智能合约的编写,主要介绍如何使用Foundry初始化开发环境,导入其他Solidity模块;
三是智能合约的测试,介绍Foundry中测试工具,以及如何使用Solidity编写测试脚本,以及输出Gas报告等内容;
四是智能合约的部署,介绍如何使用Anvil
构建本地测试环境并进行合约测试,并介绍如何将合约部署至测试网络。
本文介绍的内容都会较为初级,如果您是高级开发人员,建议您直接阅读文档
在智能合约编写领域,较为著名的智能合约编译和测试工作流为hardhat,hardhat使用npm包进行管理,使用JavaScript
作为测试工作流。但其速度受限于JavaScript的性能,总体而言较为缓慢,且需要在开发流程中变换使用JavaScript与Solidity两种编程语言。Foundry改变了这一工作流。
首先,Foundry使用Rust编写,其编译Solidity智能合约的速度更快,同时如果您使用Linux系统,foundry的安装也会非常简单。
其次,在开发流程中,Foundry仅使用solidity
一种编程语言,智能合约工程师可以仅使用solidity
完成智能合约编写、测试和部署。而且,Foundry提供了一套完整的开发工具箱,主要包括以下三部分:
最后,Foundry在对导入包的管理时通过git submodule
进行管理,可以随时同步更新。个人认为较npm的管理方式更加的优雅和可控。
如果您想更加全面的了解Foundry,我个人推荐您去阅读一下Foundry仓库的README.md以及它的文档
Foundry开发流程中需要Git
工具,由于此内容较为简单,读者可自行查阅安装方法。
对于Windows用户而言,我个人不建议直接使用官方文档给出的从头编译Foundry的方法,该方法需要你安装一套完整的Rust开发环境,而且编译过程中会出现大量的无关的编译产物(大概有600MB),且编译时间并不短,在10代酷睿i7的CPU和16G内存下,编译时间长达数分钟。
为了降低安装难度,我更加推荐直接使用官方文档提供的一键脚本,直接安装官方提供的编译产物。但此方法只适用于Linux系统。
如果你使用的Mac系统,可以跳过下面对Linux系统的讨论,直接运行后文给出的终端命令。
如果你使用的系统就是Linux,请注意是否使用了最新的版本,如Debian11
或Ubuntu 22.04
等版本。如果您使用Debian10
此类低版本系统,会出现因缺少关键运行库而报错以致程序无法运行。经过询问开发人员,得知官方是在Ubuntu 20.04
系统下进行的项目编译,依赖部分较高版本运行库,如果使用Debian10
等低版本系统会出现错误。
开发者认为兼容低版本Liunx系统会显著提高编译环境的复杂性,在短期内,官方不会兼容较低版本的Liunx。
如果你使用Windows,我个人推荐安装较高版本Linux的虚拟环境后再安装Foundry。如果您使用Windows10及以上的版本,您可以使用WSL虚拟环境。经过测试,Ubuntu 22.04 LTS
的WSL版本是符合Foundry一键脚本运行条件的,你可以在这里找到它的安装包并安装在你的Windows中。
如果你配置好了符合条件的Linux系统,可以直接使用下面给出的命令一键安装Foundry:
curl -L https://foundry.paradigm.xyz | bash
运行完上述命令后,在运行下列命令:
foundryup
最后可以通过一下命令检验是否安装成功:
forge -h
如果想了解更多关于安装的信息,可以自行阅读官方给出的文档
如果后续需要更新
foundry
,可以在此运行foundryup
命令,运行后会自动更新当前foundry
在初始化开发环境前,请确认你有以太坊钱包。由于下文存在导出以太坊账户私钥的敏感操作,所以这里建议你重新创建一个用于代码开发的以太坊账户。
以太坊提供了测试网络供开发者使用。
在下文中,我主要使用MetaMask作为钱包,同时主要使用Goerli TestNet
。当然,你的账户中需要一些测试用ETH,可以前往这个水龙头获取。注意,此水龙头要求您注册Alchemy
账号。
由于此文编写时
Ropsten TestNet
仍未废弃,所以后文采用了此测试网络。
本节内容主要参考了官方教程的First Steps with Foundry
简单的来说就是使用以下命令初始化开发环境:
forge init ERC20Test
其中,ERC20Test
可以更改为你想命名的项目名字。
接下来,我们需要安装一些开发库以更加方便地编写代码逻辑,此处我们将引入solmate
和Openzeppelin
两个开发库。前者是经过优化的且简单易读的智能合约开发库,但就仅实现了部分ERC功能;后者未经过优化,但包含的内容较多。在此次开发过程中,我们主要使用solmate
。
我们可以使用forge
工具非常简单的导入这两个库,使用的命令如下:
forge install Rari-Capital/solmate Openzeppelin/openzeppelin-contracts
安装完成后的目录如下:
我个人推荐使用VSCode作为Solidity的编辑器,一般来说,只需要进行下述两步操作:
forge remappings > remappings.txt
,该命令将生成映射文件避免报错如果你想获得更多信息,可以参考官方文档给出的Integrating with VSCode中的内容
本节主要介绍Solidity智能合约的编写,本节内容面向具有一定编程经验的开发者。如果你读者对本节的内容仍无法理解,可以先行阅读以下材料:
我们首先进行下述重命名:
src/Contract.sol
=> src/token.sol
script/Contract.s.sol
=> script/token.s.sol
test/Contract.t.sol
=> test/token.t.sol
对于Foundry来说,
.s.sol
和.t.sol
均为功能性代码的后缀,这两个后缀名虽然使用Solidity作为开发语言但作用不同于智能合约,主要起辅助作用
本次编写的智能合约与ERC20有关。简单来说ERC20允许我们在以太坊中进行发币。本文介绍的智能合约将不仅仅涉及简单的发币功能,还将增加代币与以太坊ETH互换的功能,开发者提取互换费用的功能。
更加详细的来说,本智能合约主要功能是用户需要向智能合约中转入ETH后获得代币,开发者可以提取用户为获得代币而转移到智能合约中的ETH。
打开src/token.sol
,写入以下内容,或者前往此处直接下载代码。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import "solmate/tokens/ERC20.sol";
import "openzeppe
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。