Decert.me 要连载教程了, 《Solidity 开发教程》 力求系统、深入的介绍 Solidity 开发, 同时这是一套交互式教程,你可以实时的修改教程里的合约代码并运行。
本教程来自贡献者 @Tiny熊,让我们正式开始学习吧。
如果你已经是 Hardhat 的使用者,可以直接跳到文末,参与挑战领取技能认证 NFT。
Hardhat 提供了一个灵活且易于使用的环境,可以轻松地编写、测试和部署智能合约。类似的开发工具或框架还有: Remix IDE, Truffle , Foundry, 目前最受欢迎的是 Hardhat 与 Foundry。
Hardhat 使用 Node 进行包管理,如果你熟悉 Node 及 Javascript, Hardhat 将非常简单上手。
Hardhat还内置了Hardhat 网络(Hardhat Node),它是为开发而设计的本地以太坊网络。 用来部署合约,运行测试和调试代码。
在本文中,我们将介绍:
- 创建及配置Hardhat项目
- 编写智能合约
- Hardhat 编译合约
- 使用 Ethers.js 和为合约编写自动化测试
- 使用
console.log()
调试 Solidity - 使用 Hardhat 部署合约
- 使用 Hardhat Etherscan 进行开源验证。
- Hardhat 插件的使用
本文对应的代码在:https://github.com/xilibi2003/training_camp_2/tree/main/w1_hardhat
创建及配置Hardhat项目
Hardhat 构建在Node.js之上, 使用 Hardhat 要求我们在电脑先安装好Node.js (>= 16.0), 环境准备可以参考这里。
先创建项目目录:
mkdir hardhat-tutorial
cd hardhat-tutorial
初始化 Node 项目:
npm init
安装 Hardhat :
npm install --save-dev hardhat
在安装Hardhat的目录下运行:
npx hardhat
使用键盘选择"创建一个新的hardhat.config.js(Create a JavaScript project
)" ,然后回车。
$ npx hardhat
888 888 888 888 888
888 888 888 888 888
888 888 888 888 888
8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
888 888 "88b 888P" d88" 888 888 "88b "88b 888
888 888 .d888888 888 888 888 888 888 .d888888 888
888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
👷 Welcome to Hardhat v2.13.0 👷
? What do you want to do? …
❯ Create a JavaScript project
Create a TypeScript project
Create an empty hardhat.config.js
Quit
这个 JavaScript Hardhat 工程会默认下载 hardhat-toolbox 插件
及一些常规设置:
创建好的Hardhat工程包含文件有:
contracts
:智能合约目录scripts
:部署脚本文件test
:智能合约测试用例文件夹。hardhat.config.js
:配置文件,配置hardhat连接的网络及编译选项。
编写合约
合约开发推荐使用 VSCode 编辑器 + solidity 插件,在contracts
下新建一个合约文件 Counter.sol
(*.sol
是 Solidity 合约文件的后缀名), 复制如下代码:
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Counter {
uint counter;
constructor() {
counter = 0;
}
function count() public {
counter = counter + 1;
}
function get() public view returns (uint) {
return counter;
}
}
接下来就可以编译这个合约了。
使用OpenZepplin 等第三方库
在编写合约时,尽量不要重复造轮子,基于优质开源的第三方库,不仅可以提交效率,还可以让我们的合约代码更安全,例如要开发一个 Token,可以用npm 安装OpenZepplin 库:
npm install @openzeppelin/contracts --save-dev
然后在合约中 import
相应库中的合约文件及可。
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract Token is ERC20 {
constructor(uint256 initialSupply) ERC20("Token Name", "Token Symbol") {
_mint(msg.sender, initialSupply);
}
}