• hardhat 教程及 hardhat-deploy 插件使用


    1. 设置环境

    大多数以太坊库和工具都是用JavaScript编写的,Hardhat也是如此。 如果你不熟悉Node.js,它是一个建立在Chrome的V8 JavaScript引擎上的JavaScript运行时。 它是在Web浏览器之外运行JavaScript的最流行的解决方案,Hardhat也是基于Node.js开发的。

    安装Node.js

    如果你已经安装了Node.js>=12.0,你可以跳过本节。 如果没有,这里介绍如何在Ubuntu、MacOS和Windows上安装Node.js。

    在Windows上安装Node.js需要几个手动步骤, 我们将安装git、Node.js 12.x和npm, 下载并运行:

    1. Git的Windows安装程序
    2. 安转此处 的node-v12.XX.XX-x64.msi

    升级你的Node.js

    如果你的Node.js版本比12.0低,请按照下面的说明进行升级。

    安装yarn

    在本教程中,我们将使用yarn

    要安装它,请执行以下操作:

    npm install -g yarn

    2. 创建一个Hardhat项目

    我们将使用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编译器)。

    1. import {HardhatUserConfig} from 'hardhat/types';
    2. const config: HardhatUserConfig = {
    3. solidity: {
    4. version: '0.7.6',
    5. }
    6. };
    7. export default config;

    Hardhat的架构

    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,使其看起来像这样:

    1. import {HardhatUserConfig} from 'hardhat/types';
    2. import 'hardhat-deploy';
    3. import 'hardhat-deploy-ethers';
    4. const config: HardhatUserConfig = {
    5. solidity: {
    6. version: '0.7.6',
    7. },
    8. namedAccounts: {
    9. deployer: 0,
    10. },
    11. };
    12. export default config;

    我们还创建以下tsconfig.json

    1. {
    2. "compilerOptions": {
    3. "target": "es5",
    4. "module": "commonjs",
    5. "strict": true,
    6. "esModuleInterop": true,
    7. "moduleResolution": "node",
    8. "forceConsistentCasingInFileNames": true,
    9. "outDir": "dist"
    10. },
    11. "include": [
    12. "hardhat.config.ts",
    13. "./deploy",
    14. "./test",
    15. ]
    16. }

    3. 编写和编译智能合约

    我们创建一个简单的智能合约,实现一个可以转让的代币。 代币合约最常用来交换或储存价值。 在本教程中,我们不会深入讲解合约的Solidity代码,但你应该知道实现的逻辑:

    • 代币的发行总量是固定的,不能更改。
    • 所有发行的代币都分配到部署合约的地址。
    • 任何人都可以接受代币。
    • 拥有至少一块代币的人,都可以转让代币。
    • 代币是不可分割的。 你可以转让1、2、3或37枚代币,但不能转让2.5枚。

    你可能听说过ERC20,它是以太坊中的一种代币标准。 DAI、USDC、MKR和ZRX等代币遵循ERC20标准,这使得它们都能与任何可以处理ERC20代币的软件兼容。 为了简单起见,我们要建立的代币不是ERC20

    编写智能合约

    虽然默认情况下,hardhat使用 contracts 作为合约代码源文件夹,但我们更倾向于将其改为 src

    因此,你需要用新的配置来编辑你的hardhat.config.ts文件。

    1. import {HardhatUserConfig} from 'hardhat/types';
    2. import 'hardhat-deploy';
    3. import 'hardhat-deploy-ethers';
    4. const config: HardhatUserConfig = {
    5. solidity: {
    6. version: '0.7.6',
    7. },
    8. namedAccounts: {
    9. deployer: 0,
    10. },
    11. paths: {
    12. sources: 'src',
    13. },
    14. };
    15. export default config;

    首先创建一个名为 src 的新目录,并在该目录内创建一个名为 Token.sol 的文件。

    将下面的代码粘贴到文件中,建议花一分钟时间阅读代码及注释。

    要获得Solidity语法高亮支持, 我们推荐使用Visual Studio Code或Sublime Text 3,并安装对应的 Solidity 或 以太坊插件。

    1. // SPDX-License-Identifier: MIT
    2. // The line above is recommended and let you define the license of your contract
    3. // Solidity files have to start with this pragma.
    4. // It will be used by the Solidity compiler to validate its version.
    5. pragma solidity ^0.7.0;
    6. // This is the main building block for smart contracts.
    7. contract Token {
    8. // Some string type variables to identify the token.
    9. // The `public` modifier makes a variable readable from outside the contract.
    10. string public name = "My Hardhat Token";
    11. string public symbol = "MBT";
    12. // The fixed amount of tokens stored in an unsigned integer type variable.
    13. uint256 public totalSupply = 1000000;
    14. // An address type variable is used to store ethereum accounts.
    15. address public owner;
    16. // A mapping is a key/value map. Here we store each account balance.
    17. mapping(address => uint256) balances;
    18. /**
    19. * Contract initialization.
    20. *
    21. * The `constructor` is executed only once when the contract is created.
  • 相关阅读:
    Chrome浏览器怎么清理单个页面缓存,简单实用
    【目标检测】SSD损失函数详解
    有流量,但没有销售?增加网站销量的 6 个步骤
    java之线程间通信
    注册会计师怎么注册非执业?注会执业与非执业有何区别
    【数据分析】京东订单数据分析思路及Python代码
    【OFDM系列5】单输入单输出OFDM(SISO-OFDM)多径信道迫零(ZF)和最小均方误差(MMSE)均衡器原理和公式推导
    GIS工具maptalks开发手册(三)02——层级缩放工具
    Javaweb中的过滤器Filter如何理解——精简
    浅析 C# Console 控制台为什么也会卡死
  • 原文地址:https://blog.csdn.net/Clovemeo/article/details/127969122