type
status
date
slug
summary
tags
category
icon
password
首先进行智能合约的设计与开发。因为后端的功能实现,是要调用合约的。并且当我们设计和编写好合约之后,整个项目的核心业务就更加清晰了。
合约项目地址:
环境安装
Foundry套件 前往Foundry官网
Foundry是一个非常快速,可移植和模块化的工具包,是Rust编写的EVM应用程序开发。包含以下组件:
- Forge: 构建、测试、调试和部署Solidity合约。
- Cast: 用于与EVM智能合约交互,发送交易和获取链上数据。
- Anvil: 一个轻量的本地以太坊开发节点。
- Chisel: 快速、实用、冗长的Solidity REPL。
Solidity 前往Solidity官网
在官网对应的安装指南页,可以选择自己喜欢的方式进行安装。
初始化项目
首先,使用 foundry 快速初始化项目。
选择你喜欢的文件夹,运行以下命令
生成的初始化项目如下,会帮我们创建一个 Counter 的简单合约项目。
你可以运行
$ forge build src
来尝试编译合约,或者使用$ forge test --mt testFuzz_SetNumber -vvv
来运行测试合约中的testFuzz_SetNumber(uint256 x)
函数。依赖安装
在本项目中,我们会使用 Openzeppelin 这个开源代码库。
Openzeppelin 是一个实现了很多标准的合约,具备良好的 Gas 优化和安全审计的合约库。
这会将
openzeppelin
库存放在 lib
目录下。随后,我们在项目的根目录,创建一个
remappings.txt
文件,写入并执行
$ forge remappings
进行路径映射。合约编写
🧑🏫 如果你没有学习过Solidity,那么请先前往 Solidity by Example 学习Solidity相关基础。
首先定义项目中两个重要的结构体,
Project
和 Participant
。在
src
目录下创建 Model.sol
文件,定义项目使用的结构体。主合约
在
src
目录下,创建我们的主合约文件 FairTicket.sol
这里我就直接贴完整代码了,因为拆开讲可能过于零碎,我直接在代码注释里面详细说明。
测试合约
一个合格的Solidity项目,对主合约的每个函数,每种情况对进行测试是非常有必要的,要求测试覆盖率需要达到100%。
你需要在
test
文件夹下,创建 FairTicket.t.sol
文件,编写测试合约。利用 AI 解放枯燥劳动,请用 AI 生成测试用力。只需要选中我们的全部主合约代码,告诉它:根据主合约代码,生成覆盖率100%的测试合约代码。
AI 洋洋洒洒帮我写出了700+行的测试文件,并且几次来回就达成了100%。测试代码目的是为了验证合约的每个功能符合我们的预期,合约安全是Dapp的首要考虑项。
本项目的合约比较简单,相信你的 AI 生成的测试用例也非常简单。
Foundry 提供了非常强大的测试Cheatcode,如果 AI 生成的测试用例中,有你无法理解的
vm.xx()
函数,请查看 Foundry 官网文档提供的 Cheatcode Reference。或者直接让 AI 解释。以下几个命令可以帮助你查看单个测试用例的运行详情
输出测试信息
部署合约
✨Anvil 初登场
在终端
anvil
一下,一个简单的本地 evm 链就启动了,anvil 默认的 ChainID 是31337。同时 anvil 会给我们准备初始的10个账户,按照序号进行对应,比如 Accounts(0) 地址对应是 PrivateKeys(0) 处的私钥。为了方便部署,我们创建一个部署合约脚本。
在
script
文件夹下,创建 FairTicket.s.sol
。为了安全和方便,我们将私钥和设置保存在
.env
文件中。创建
.env
文件,并写入开始部署
请保证 anvil 正在运行。
在空闲终端中,输入。
在本终端中,你会看到类似如下输出。
在 anvil 终端中,你会看到类似如下输出。
script
通常用于在部署项目前,设置一些参数,初始化各个合约的参数、依赖,以及它们之间的关系等。如果是用
anvil
命令直接运行,每次都是运行一个新的链。如果想要保存链的状态,请使用 anvil --dump-state state.json
,可使用 anvil --load-state state.json
恢复链的状态。不要在任何时候在代码文件中明文编写你的真实私钥!也切记不要上传包含私钥的配置文件!
本用例中使用的是 anvil 测试链的账户,不包含真实资金。
- Author:Ago
- URL:http://www.sunago.top/article/fairticket-contract
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!