大多数以太坊库和工具都是用JavaScript编写的,Hardhat也是如此。 如果你不熟悉Node.js,它是一个建立在Chrome的V8 JavaScript引擎上的JavaScript运行时。 它是在Web浏览器之外运行JavaScript的最流行的解决方案,Hardhat也是基于Node.js开发的。
如果你已经安装了Node.js>=12.0
,你可以跳过本节。 如果没有,这里介绍如何在Ubuntu、MacOS和Windows上安装Node.js。
在Windows上安装Node.js需要几个手动步骤, 我们将安装git、Node.js 12.x和npm, 下载并运行:
node-v12.XX.XX-x64.msi
如果你的Node.js版本比12.0
低,请按照下面的说明进行升级。
在本教程中,我们将使用yarn
要安装它,请执行以下操作:
npm install -g yarn
我们将使用npm CLI安装Hardhat。 Node.js package manager是一个包管理器和JavaScript代码的在线存储库。
打开一个新的终端,运行这些命令。
mkdir hardhat-deploy-tutorial
cd hardhat-deploy-tutorial
yarn init --yes
yarn add -D hardhat
在安装Hardhat的同一个目录下,添加一个hardhat.config.ts
(我们将使用typescript和solidity 0.7.6编译器)。
- import {HardhatUserConfig} from 'hardhat/types';
- const config: HardhatUserConfig = {
- solidity: {
- version: '0.7.6',
- }
- };
- export default config;
Hardhat是围绕**任务(Tasks)和插件(plugs)**的概念设计的。 Hardhat的大部分功能来自于插件,作为开发者可以自由选择你想使用的插件。
任务
每次你从CLI运行Hardhat时,你都在运行一个任务,例如npx hardhat compile
就是在运行compile
任务。 要查看项目中当前可用的任务,运行npx hardhat
。 可以通过运行 npx hardhat help [task]
来自由探索任何任务。
你可以创建自己的任务。 查看创建任务指南。
插件
Hardhat不限制你使用什么工具,但它也内置了一些默认的工具。 所有这些都可以替换掉。 大多数时候,使用某个工具的方式是通过插件集成到Hardhat中。
在本教程中,我们将使用hardhat-deploy-ethers和hardhat-deploy插件。 它们将允许你与以太坊交互,并测试合约。 后面我们会解释如何使用的。 我们还安装了ethers chai和Mocha以及typescript。在项目目录下运行以下命令安装它们:
yarn add -D hardhat-deploy hardhat-deploy-ethers ethers chai chai-ethers mocha @types/chai @types/mocha @types/node typescript ts-node dotenv
编辑hardhat.config.ts
,使其看起来像这样:
- import {HardhatUserConfig} from 'hardhat/types';
- import 'hardhat-deploy';
- import 'hardhat-deploy-ethers';
-
- const config: HardhatUserConfig = {
- solidity: {
- version: '0.7.6',
- },
- namedAccounts: {
- deployer: 0,
- },
- };
- export default config;
我们还创建以下tsconfig.json
。
- {
- "compilerOptions": {
- "target": "es5",
- "module": "commonjs",
- "strict": true,
- "esModuleInterop": true,
- "moduleResolution": "node",
- "forceConsistentCasingInFileNames": true,
- "outDir": "dist"
- },
-
- "include": [
- "hardhat.config.ts",
- "./deploy",
- "./test",
- ]
- }
我们创建一个简单的智能合约,实现一个可以转让的代币。 代币合约最常用来交换或储存价值。 在本教程中,我们不会深入讲解合约的Solidity代码,但你应该知道实现的逻辑:
你可能听说过ERC20,它是以太坊中的一种代币标准。 DAI、USDC、MKR和ZRX等代币遵循ERC20标准,这使得它们都能与任何可以处理ERC20代币的软件兼容。 为了简单起见,我们要建立的代币不是ERC20。
虽然默认情况下,hardhat使用 contracts
作为合约代码源文件夹,但我们更倾向于将其改为 src
。
因此,你需要用新的配置来编辑你的hardhat.config.ts
文件。
- import {HardhatUserConfig} from 'hardhat/types';
- import 'hardhat-deploy';
- import 'hardhat-deploy-ethers';
-
- const config: HardhatUserConfig = {
- solidity: {
- version: '0.7.6',
- },
- namedAccounts: {
- deployer: 0,
- },
- paths: {
- sources: 'src',
- },
- };
- export default config;
首先创建一个名为 src
的新目录,并在该目录内创建一个名为 Token.sol
的文件。
将下面的代码粘贴到文件中,建议花一分钟时间阅读代码及注释。
要获得Solidity语法高亮支持, 我们推荐使用Visual Studio Code或Sublime Text 3,并安装对应的 Solidity 或 以太坊插件。
- // SPDX-License-Identifier: MIT
- // The line above is recommended and let you define the license of your contract
- // Solidity files have to start with this pragma.
- // It will be used by the Solidity compiler to validate its version.
- pragma solidity ^0.7.0;
-
-
- // This is the main building block for smart contracts.
- contract Token {
- // Some string type variables to identify the token.
- // The `public` modifier makes a variable readable from outside the contract.
- string public name = "My Hardhat Token";
- string public symbol = "MBT";
-
- // The fixed amount of tokens stored in an unsigned integer type variable.
- uint256 public totalSupply = 1000000;
-
- // An address type variable is used to store ethereum accounts.
- address public owner;
-
- // A mapping is a key/value map. Here we store each account balance.
- mapping(address => uint256) balances;
-
- /**
- * Contract initialization.
- *
- * The `constructor` is executed only once when the contract is created.
-