hardhat开发框架2

上一篇: hardhat开发框架
在上一篇中,我们了解到了

  • 实际开发环境的工作流程是什么
  • hardhat和remix的区别是什么
  • foundry和hardhat的区别
  • 对于初学者来说,remix > hardhat > foundry

让我们一步一步来学习 Hardhat,从基础开始,直到深入使用它进行合约开发、测试和部署。

1. 阅读 Hardhat 官方文档:

首先,我们需要确保你已经浏览了 Hardhat 官方文档的基础内容,了解 Hardhat 的基本概念和核心功能。以下是一些你需要特别注意的部分:

  • **Hardhat 官方文档**:

    • 阅读概述部分,了解 Hardhat 是什么,为什么使用它。
    • 阅读 安装和设置 部分,掌握如何创建和配置 Hardhat 项目。

2. 设置 Hardhat 项目:

在开始使用 Hardhat 之前,我们需要先设置一个基本的 Hardhat 项目。

步骤:

  1. 安装 Node.js 和 NPM

    • 确保你已经安装了 Node.js,你可以在终端中运行以下命令来检查:

      1
      2
      node -v
      npm -v
  2. 初始化项目文件夹

    • 创建一个新的文件夹,并初始化 npm 项目:

      1
      2
      3
      mkdir hardhat-project
      cd hardhat-project
      npm init -y
  3. 安装 Hardhat

    • 安装 Hardhat:

      1
      npm install --save-dev hardhat
  4. 创建 Hardhat 项目

    • 使用 Hardhat 初始化项目:

      1
      npx hardhat

      选择 Create a basic sample project,然后根据提示完成安装。

  5. 项目结构
    初始化后,你会看到类似这样的文件结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /hardhat-project
    ├── contracts/
    │ └── Greeter.sol
    ├── scripts/
    │ └── deploy.js
    ├── test/
    │ └── sample-test.js
    ├── hardhat.config.js
    └── package.json
    • contracts/:存放 Solidity 合约的目录。
    • scripts/:存放部署脚本的目录。
    • test/:存放测试代码的目录。
    • hardhat.config.js:Hardhat 配置文件,用于配置网络、编译器等。

3. 编写并测试 Solidity 合约:

现在我们已经设置好 Hardhat 项目,可以开始编写和测试我们的第一个 Solidity 合约。

步骤:

  1. 创建 Solidity 合约

    • contracts/ 目录下创建一个新的 Solidity 合约文件,比如 MyContract.sol

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      // SPDX-License-Identifier: MIT
      pragma solidity ^0.8.0;

      contract MyContract {
      uint256 public value;

      function setValue(uint256 _value) public {
      value = _value;
      }
      }
  2. 编写测试脚本

    • test/ 目录下创建一个新的 JavaScript 测试文件,比如 myContract-test.js

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      const { expect } = require("chai");

      describe("MyContract", function () {
      it("should set value correctly", async function () {
      const [owner] = await ethers.getSigners();

      const MyContract = await ethers.getContractFactory("MyContract");
      const myContract = await MyContract.deploy();
      await myContract.deployed();

      await myContract.setValue(42);

      const value = await myContract.value();
      expect(value).to.equal(42);
      });
      });
  3. 运行测试

    • 你可以使用 Hardhat 的测试命令来运行测试:

      1
      npx hardhat test

4. 使用 Assertions 库:

Hardhat 默认集成了 Chai 测试库,用于进行断言。你可以在测试中使用 expectshouldassert 等断言方法来验证合约的行为。

  • 示例:

    1
    expect(await myContract.value()).to.equal(42);  // 使用 `expect`
  • 其他常见断言方法:

    1
    assert.equal(await myContract.value(), 42);  // 使用 `assert`

5. 在 Solidity 中写 Fuzz 测试:

Fuzz 测试(模糊测试)是一种自动化测试技术,通过随机输入来找出合约中的潜在漏洞。

步骤:

  1. 启用 Fuzz 测试

    • 在 Hardhat 中,你可以使用 forge(Foundry 提供的工具)来进行 fuzz 测试,但 Hardhat 本身不直接支持 fuzz 测试。不过,你可以通过 Hardhat Plugin 来启用这种功能,或者结合使用 Foundry 来进行更高级的测试。

6. 使用 Hardhat 插件:

Hardhat 拥有丰富的插件系统,允许你扩展 Hardhat 的功能。常见的插件有:

  • **@nomiclabs/hardhat-ethers**:用于与 ethers.js 进行集成。
  • **@nomiclabs/hardhat-waffle**:用于与 Waffle 测试框架集成。
  • **hardhat-gas-reporter**:用于报告 Gas 使用情况。

安装插件:

1
npm install --save-dev @nomiclabs/hardhat-ethers @nomiclabs/hardhat-waffle

然后在 hardhat.config.js 中引入插件:

1
2
require("@nomiclabs/hardhat-ethers");
require("@nomiclabs/hardhat-waffle");

7. 写 TypeScript 测试:

Hardhat 支持 TypeScript,可以让你编写类型安全的测试代码。要启用 TypeScript,首先安装 ts-nodetypescript

1
npm install --save-dev typescript ts-node

然后在 hardhat.config.js 中启用 TypeScript:

1
2
3
require("hardhat-deploy");
require("@nomiclabs/hardhat-waffle");
require("ts-node/register");

test/ 文件夹中,创建一个 .ts 后缀的测试文件,比如 myContract-test.ts


8. 确保测试的覆盖范围:

为了确保你的测试覆盖了合约的所有关键路径,Hardhat 支持生成 测试覆盖率报告。你可以使用 solidity-coverage 插件来生成报告。

安装插件:

1
npm install --save-dev solidity-coverage

配置:

hardhat.config.js 中加入:

1
require("solidity-coverage");

然后运行覆盖率检查:

1
npx hardhat coverage

9. 配置合约与变量:

hardhat.config.js 中配置合约的相关变量和网络。例如,配置 Gas 限制优化设置 等。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module.exports = {
solidity: {
version: "0.8.0",
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
},
networks: {
hardhat: {
chainId: 1337,
},
rinkeby: {
url: "https://rinkeby.infura.io/v3/YOUR_INFURA_PROJECT_ID",
accounts: [`0x${YOUR_PRIVATE_KEY}`],
},
},
};

10. 验证合约:

Hardhat 也支持合约的自动验证,你可以使用 hardhat-etherscan 插件来自动验证合约。

安装插件:

1
npm install --save-dev @nomiclabs/hardhat-etherscan

配置:

hardhat.config.js 中添加:

1
2
3
4
5
6
7
require("@nomiclabs/hardhat-etherscan");

module.exports = {
etherscan: {
apiKey: "YOUR_ETHERSCAN_API_KEY",
},
};

然后运行合约验证:

1
npx hardhat verify --network rinkeby DEPLOYED_CONTRACT_ADDRESS

总结:

通过这些步骤,你将能全面掌握 Hardhat 的基础用法,包括项目设置、编写合约、测试、使用插件、进行类型测试等。希望这能帮助你深入理解 Hardhat,并能够在实际项目中熟练运用它。如果有任何具体问题,随时向我提问!

问题一: nvm是什么?

nvmNode Version Manager 的缩写,是一个用于管理 Node.js 版本的命令行工具。它允许开发者在同一台机器上安装和切换多个版本的 Node.js,非常适合需要在不同项目中使用不同 Node.js 版本的开发者。

nvm 的功能

  1. 安装不同版本的 Node.js

    • 你可以使用 nvm 安装多个版本的 Node.js,并且可以轻松切换到任何版本。
  2. 切换 Node.js 版本

    • nvm 允许你快速切换当前的 Node.js 版本,这对于同时开发多个项目时尤其有用,每个项目可能需要不同的 Node.js 版本。
  3. 全局管理 npm 包

    • 每个版本的 Node.js 都有独立的 npm,因此可以根据不同的 Node.js 版本管理不同的全局 npm 包。

如何安装 nvm

1. 在 macOS 或 Linux 上安装

  • 你可以通过以下命令来安装 nvm

    1
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

    这会下载并运行一个安装脚本,安装完后,需要关闭终端再重新打开,或者运行以下命令以便生效:

    1
    source ~/.bashrc  # 或者 source ~/.zshrc(根据你使用的终端配置文件而定)

2. 在 Windows 上安装

  • Windows 用户可以使用 nvm-windows 进行安装。直接下载最新的安装包并安装。

常用的 nvm 命令

  1. 安装 Node.js 版本

    • 安装指定版本的 Node.js:

      1
      nvm install 14.17.0  # 安装 Node.js 14.17.0 版本
    • 安装最新的稳定版本:

      1
      nvm install stable  # 安装最新的稳定版本
  2. 查看已安装的 Node.js 版本

    • 列出所有已安装的版本:

      1
      nvm list
  3. 使用指定版本的 Node.js

    • 切换到某个特定版本:

      1
      nvm use 14.17.0  # 切换到 14.17.0 版本
    • 你也可以切换到最新的版本:

      1
      nvm use node  # 使用最新的稳定版本
  4. 设置默认的 Node.js 版本

    • 设置一个默认的 Node.js 版本,这个版本将在新的终端会话中自动启用:

      1
      nvm alias default 14.17.0
  5. 卸载 Node.js 版本

    • 删除指定的 Node.js 版本:

      1
      nvm uninstall 14.17.0

nvm 的优势

  • 项目兼容性:不同项目可能需要不同的 Node.js 版本,nvm 让你能够为每个项目选择和管理不同的版本。
  • 避免版本冲突:避免了全局安装 Node.js 版本冲突的情况,因为你可以在全局环境中有多个版本并进行切换。
  • 简化版本管理:当 Node.js 发布新版本时,你可以轻松更新到新版本,或者切换回一个旧版本进行兼容性测试。

总结

nvm 是一个非常实用的工具,尤其是在需要管理多个 Node.js 版本的开发环境中。它能帮助你轻松切换版本,避免版本冲突,并提高开发效率。

问题二: npx是什么?

npxnpm 自带的一个命令执行工具,用途非常简单:
👉 让你不用全局安装,也能直接运行 npm 包里的命令。


📌 简单一句话解释

npx = 临时使用某个 npm 包来执行命令,不用安装到全局。


🔍 为什么需要 npx?

以前你要运行 Hardhat、Create-React-App、Truffle 等工具,必须全局安装:

1
npm install -g hardhat

但现在用 npx,可以:

1
npx hardhat

⚡ 不需要安装!
⚡ 不会污染全局!
⚡ 自动下载临时文件然后执行!


🧪 举个实际例子:Hardhat

在新项目目录下可以直接:

1
npx hardhat

它会自动启动 Hardhat 项目创建向导。


📦 npx 的工作原理

当你运行:

1
npx package-name

npx 会:

  1. 检查你项目的 node_modules/.bin/,有没有这个命令
  2. 如果没有,就临时下载一个版本
  3. 执行后自动清理

所以 npx 非常适合 CLI 工具。


🆚 npx 和 npm 的区别

工具 作用
npm 安装、卸载、管理包
npx 执行 npm 包中的命令(不一定安装)

📌 你在 Hardhat、Next.js、React、Solidity 学习中会经常用到

示例:

1
2
3
4
npx hardhat
npx create-react-app myapp
npx ts-node script.ts
npx eslint .

如果你愿意,我可以顺便帮你解释:

  • npm installnpm install -g 的差异
  • node_modules/.bin 是什么
  • npx 在 Hardhat 项目目录下具体执行了什么

你想深入到什么程度?

问题三: 为什么“高级的”工具总是命令行形式,而“初级”工具总是图形化的?

这是一个非常经典、非常本质的问题,甚至能解释为什么编程世界会分成“专业者”和“使用者”两大类。

下面我给你一个 通俗但深刻 的解释——你会完全看懂为什么高级工具倾向命令行,而初级工具偏图形化 GUI。


🧠 1. GUI = 简单易上手,但牺牲灵活性

图形界面(GUI)让你:

  • 点按钮
  • 拖拽
  • 选项框

对新手来说很友好,因为:

  • 不需要记东西
  • 不可能输错指令
  • 学习成本低

但 GUI 有一个致命问题:

你看到的是什么按钮,就只能做什么事情。

GUI 由设计者决定,你的行为范围被提前限定死。

换句话说:

  • 简单 = 强制限制自由
  • 易用 = 限制灵活性

⚡ 2. CLI = 灵活、强大、自动化,但需要学习

命令行(CLI)让你:

  • 组合命令
  • 自定义参数
  • 批量处理
  • 自动化脚本
  • 和其他工具链接管道

CLI 工具的设计思路是:

给你“所有能力”,你想怎么用都可以。

这会导致两个特点:

优点:

  • 组合能力无限强
  • 自动化能力极高(脚本化)
  • 更稳定更专业
  • 可以被程序调用(CI/CD, DevOps, 自动部署)

缺点:

  • 要记命令
  • 对初学者不友好
  • 使用门槛有点高

🎯 3. 为什么越“高级”的工作越需要 CLI?

因为 高级工作意味着需要处理复杂场景,而复杂场景:

  • GUI 不可能覆盖全部按钮
  • GUI 无法批量、自动、脚本执行
  • GUI 做不了高级组合操作

举例:

🟦 高级工程师要做的事情

  • 自动部署 1000 个服务(GUI 不够用)
  • 修改合约、编译、打包、测试、部署(GUI 不够灵活)
  • 写 CI/CD Pipeline(GUI 做不了)
  • 分析日志、链上数据、调试(CLI 才能脚本)
  • 操作服务器(无 GUI)

🟩 初学者的需求

  • 创建项目(点按钮)
  • 看日志(图形化界面)
  • 点“部署”按钮
  • 查看变量、调试

所以:

GUI 是“培训轮子”,适合入门与学习。
CLI 是“真正的工具”,适合专业生产环境。


🎮 4. 游戏也一样(用游戏比喻你更好懂)

  • 新手玩家:点点点,滑鼠操作
  • 高端玩家:全键盘快捷键、宏命令、自定义脚本

高级玩家为什么不用 GUI 菜单?

因为 快捷键 + 命令 才能达到极高效率。

开发者世界一样。


🧩 5. 为什么程序员喜欢命令行?

因为 CLI:

  • 可重复(写脚本自动化)
  • 可组合(管道 | 和 &&)
  • 可远程(没有 GUI 时仍能工作)
  • 可被程序调用(机器人操作)
  • 更稳定(不会像 GUI 一样崩溃)
  • 更精确(参数完全可控)

你会发现一个规律:

真正的大型系统、生产环境、连续部署,全靠命令行。

比如:

  • Linux 服务器 99% 没有 GUI
  • DevOps 全是 CLI + YAML
  • Docker/Kubernetes 完全是 CLI
  • 区块链合约开发 Hardhat、Foundry 全是 CLI

因为这些工具设计给专业人士,不是给一般用户。


🧨 最精炼的一句话总结

GUI = 简单但有限制,适合入门。
CLI = 强大但需要学习,适合专业。

所以,“高级工具”必须是命令行,
因为高级人员需要的是“力量”,而不是“按钮”。


如果你愿意,我可以继续讲:

  • 为什么 Hardhat/Founry/Truffle 全是 CLI?
  • 为什么 VS Code、Remix 是 GUI,但高级操作都要 CLI?
  • 为什么程序员越高级越不用鼠标?

你想继续深入吗?

为什么 Hardhat/Founry/Truffle 全是 CLI?

Hardhat, Foundry, 和 Truffle 都是智能合约开发中非常流行的工具链,它们都采用了 **命令行界面 (CLI)**。这是有多方面原因的,以下是一些主要的原因:

  1. 灵活性与控制
  • CLI 提供更高的灵活性和控制。开发者通过命令行工具可以精确控制每一个操作,灵活地指定不同的参数、配置和环境,而图形界面(GUI)通常无法提供这种层次的定制。
  • 比如,使用 CLI 时,你可以轻松指定要部署的 合约网络环境Gas 限制,甚至是 自动化脚本测试覆盖率 等。这些都可以通过简单的命令行参数调整,而 GUI 要实现这些灵活性和可调性通常需要复杂的界面和更多的用户输入。

例子

  • 在 Hardhat 中,你可以通过命令指定要连接的以太坊网络(如 Goerli、Rinkeby、Local Testnet),而在 GUI 中做这些配置可能会变得复杂且不直观。

    1
    npx hardhat run scripts/deploy.js --network rinkeby
  1. 效率和自动化
  • CLI 工具适合高效的自动化工作流。命令行可以方便地与其他工具和脚本配合使用,支持自动化测试、部署、代码审计等复杂任务,开发者可以把常用命令写成脚本并自动化执行。
  • 批量处理和快速执行:使用命令行,可以快速批量执行一系列操作,如运行所有测试、部署合约、检查合约 Gas 使用情况等,这些操作对于大规模项目的开发尤为重要。

例子

  • 使用 Truffle 或 Foundry,你可以编写自动化脚本来进行智能合约的部署、测试,甚至将部署过程集成到 CI/CD 流程中。

    1
    truffle migrate --network ropsten
  1. 便于与其他工具集成
  • CLI 更容易与其他工具链和开发环境集成。开发过程中,通常需要集成许多其他工具(如前端框架、Git、CI/CD 系统、测试框架等)。命令行非常适合这种集成,因为它允许开发者通过脚本、API 调用和自动化工具无缝地与其他系统配合。
  • 使用 GUI 实现与其他开发工具的集成则会复杂很多。

例子

  • 在 Hardhat 中,你可以通过脚本或命令行直接集成 ethers.jsweb3.js,或者将部署、测试等过程集成到持续集成(CI)系统中。CLI 的灵活性使得这一切变得更加简单和自动化。
  1. 轻量级与性能
  • CLI 更加轻量,性能更好。与图形界面相比,命令行工具在启动和执行时需要的资源更少,运行速度更快。图形界面通常需要加载大量的视觉元素和用户交互组件,这在某些开发场景下可能会影响性能。
  • 在开发过程中,尤其是进行大量测试和高频交互时,CLI 的高效性非常明显。开发者能够通过命令行快速执行多个操作,避免了图形界面中可能出现的卡顿和延迟。

例子

  • Foundry,作为一个基于 Rust 的工具,速度非常快,能够通过命令行高效地进行合约测试、Gas 分析等操作。而图形界面在这类高频测试和性能要求较高的场景下通常不如 CLI 快。
  1. 开发者社区的习惯
  • 开发者习惯:命令行工具是大多数开发者的常用工具。开发者习惯通过 CLI 进行快速的操作,而图形界面可能会限制一些开发者的工作流。CLI 允许开发者更加自由、灵活地编写脚本、管理项目。
  • 工具链的一致性:很多区块链开发工具(如 Node.js、npm、Truffle、Hardhat 等)都采用了命令行界面,这使得开发者可以在熟悉的环境中工作,提升工作效率。
  1. 可扩展性和定制性
  • CLI 提供高度的可扩展性和定制性,允许开发者根据自己的需求编写脚本、添加功能或修改配置。对于专业开发者来说,CLI 工具是不可或缺的,因为它们可以更轻松地通过自定义脚本、插件等方式扩展工具功能。
  • 对于想要集成其他功能(如定制测试、部署、监控合约等)的开发者,CLI 提供了丰富的选项和灵活的接口,几乎可以实现无限的自定义。
  1. 图形界面适用场景较少
  • 图形界面不适用于所有场景,尤其是当涉及到一些复杂的设置、自动化或脚本化操作时,图形界面显得比较笨重。例如,当进行大规模测试或需要频繁切换不同网络时,图形界面可能无法提供相同程度的灵活性和效率。
  • 因此,许多开发工具选择用 CLI 来提供 底层功能,同时保留 图形界面 来处理一些简单的配置和调试任务。

总结:

HardhatFoundryTruffle 都是 CLI 工具链,主要是因为命令行提供了 更高的灵活性、效率、可定制性,并能够 无缝集成到开发流程中。虽然图形界面对某些简单任务有优势,但对于 复杂开发、自动化、性能需求 等场景,命令行工具提供了更合适的解决方案。


如果打个比喻的话,cli就像骨架和肌肉,而GUI就像皮肤和头发。用户注重GUI,但实际上cli才是一个人能否动起来的关键因素。

你打的比喻非常生动且贴切!确实可以这样理解:

  • CLI 就像骨架和肌肉:CLI 提供了系统的 核心功能灵活性,就像骨架和肌肉为一个人提供了支持和运动能力。它让所有的工作和操作得以高效、有序地进行,支撑着整个应用的运转。CLI 可以通过精细的命令和脚本处理复杂的任务,像是自动化测试、合约部署、网络配置等高效的操作,完全依赖于命令行工具的控制。

  • GUI 就像皮肤和头发:GUI 是面向 用户体验交互 的,它让用户能够 直观地与应用交互,就像皮肤和头发让一个人看起来更具吸引力和易于接近。GUI 让复杂的操作变得更简单、友好,尤其适用于那些不太了解底层操作的用户或开发者。它提供了一个视觉化、简化的界面,便于理解和使用。

为什么这个比喻准确?

  1. CLI 提供了力量和灵活性

    • 就像骨架和肌肉构成了人的 结构和行动能力,CLI 赋予了开发者 深度控制灵活性,帮助他们高效地完成任务、处理复杂场景,并进行自动化。
    • 例如,在 Solidity 开发中,CLI 工具可以让你编写和运行自动化测试脚本、进行复杂的合约部署和网络配置,而 GUI 可能只限于一些简单的交互。
  2. GUI 提供了易用性和可视化

    • GUI 的作用就像皮肤和头发一样,尽管它为用户提供了 美观和易用性,但背后的 实际功能逻辑控制 还是依赖于 CLI。例如,在开发框架(如 Hardhat 或 Truffle)中,虽然有图形化界面帮助展示合约的状态和运行情况,但 核心的操作(如部署、测试、调试等)却是在 CLI 中执行的。
  3. 不可或缺的互补关系

    • 就像一个人没有骨架和肌肉无法正常活动,单靠皮肤和头发也无法生存一样,CLI 和 GUI 是互补的。CLI 提供了强大的 功能和灵活性,而 GUI 提供了 直观的界面和交互体验。开发者和用户根据需求选择最合适的工具,CLI 适用于需要高度定制和自动化的场景,而 GUI 则适合日常使用和可视化操作。

总结:

这个比喻准确地表达了 CLI 和 GUI 的关系:CLI 是应用程序的“骨架和肌肉”,提供核心的功能和操作能力;而 GUI 是“皮肤和头发”,提供良好的用户体验和直观的界面。尽管用户更多关注的是 GUI,但没有 CLI 的底层支持,应用程序无法有效运作。

问题四: hardhat2和hardhat3的区别

Hardhat 2Hardhat 3 之间的区别主要集中在一些新特性、性能改进和 API 变化上。Hardhat 作为以太坊智能合约开发的一个流行工具框架,随着版本更新持续改进和优化,Hardhat 3 引入了一些新的特性和 API 更新,下面是两者的主要区别:

1. 性能改进与优化

  • Hardhat 3 在性能方面有显著提升,特别是在处理大型项目和复杂任务时,速度更快,资源占用更少。
  • 比如,任务执行合约编译 过程得到了优化,减少了每次编译和部署时的等待时间。

2. 新的配置文件格式

  • Hardhat 3 引入了一些新的配置选项和更灵活的 配置文件格式,特别是在 hardhat.config.js 中的改动。这使得开发者可以更加灵活地定制项目配置。
  • Plugin 管理:硬化了插件管理和配置的方式,让插件配置更加模块化和简洁。
  • 例如,Hardhat 3 开始支持通过配置不同的 网络环境 来指定合约的部署目标,使得处理多链部署变得更简单。

3. Solidity 编译器改进

  • Hardhat 3 默认更新了 Solidity 编译器 版本,支持更多的编译选项,比如更细致的优化设置。
  • 该版本也改进了合约编译的性能和错误信息的提示,编译错误的提示更加清晰和详细,帮助开发者更容易地定位问题。

4. 新增支持的插件

  • Hardhat 3 引入了更多新的插件和更好的插件支持,提升了与其他开发工具的兼容性。
  • 其中,Hardhat-deployHardhat-ethers 插件在 Hardhat 3 中得到了进一步增强,支持更加高效的合约部署和合约交互。

5. 更好的 TypeScript 支持

  • Hardhat 3TypeScript 提供了更强大的支持,使得开发者能够更加方便地编写类型安全的测试代码和部署脚本。
  • 如果你使用 TypeScript,Hardhat 3 在项目设置、自动化测试、脚本运行等方面提供了更好的 TypeScript 配置支持。

6. Hardhat Network 改进

  • Hardhat NetworkHardhat 3 中得到了进一步增强,提供了更多的调试功能和状态追踪能力。现在,开发者可以更加方便地使用 Hardhat 提供的本地网络进行测试和调试。
  • 例如,现在 Hardhat Network 允许开发者使用 硬件钱包模拟 来进行部署和测试。

7. API 更新和破坏性更改

  • Hardhat 3 对一些 API 进行了更新,部分之前的 API 被弃用或有了新方式。这意味着一些老版本的代码可能需要做调整,以便与新版本兼容。
  • 比如,Hardhat 3 引入了新的插件接口,旧的插件可能需要更新才能继续使用。

8. 更好的调试和错误处理

  • Hardhat 3 中,调试功能得到了显著的改进,尤其是在出错时的 错误信息反馈堆栈跟踪 更加清晰,帮助开发者更容易定位错误原因。
  • 错误和异常处理机制也有了增强,减少了调试时的复杂度。

9. 更好的 ethers.js 集成

  • Hardhat 3 进一步加强了与 ethers.js 库的集成,允许开发者更加简便地与以太坊区块链交互。比如,Hardhat 3 对合约实例化和发送交易的过程进行了优化,简化了与以太坊的交互。

10. 文档和开发者体验提升

  • Hardhat 3 提升了 文档质量,增加了更多的教程和示例,帮助新手开发者更容易上手。
  • 开发者体验 上,Hardhat 3 对命令行工具、调试工具和插件的支持都有了很大的改进,提供了更好的交互和反馈。

总结:Hardhat 2 vs Hardhat 3

特性 Hardhat 2 Hardhat 3
性能 较慢,处理复杂项目时有性能瓶颈 性能优化,执行速度更快,资源占用更低
配置文件 基本配置选项 配置文件更灵活,支持更细致的配置选项
Solidity 编译器 支持 Solidity 编译器,但不够优化 默认更新编译器版本,支持更多编译选项
TypeScript 支持 基本支持 更强大的 TypeScript 支持,类型安全更好
插件系统 插件支持较基础,有限的集成能力 更强大的插件系统,支持更多插件和更好的插件集成
调试功能 调试功能较基础 提供更强大的调试功能和错误反馈机制
API 变化 稳定,API 不会有太大变化 引入了新的 API 和接口,部分破坏性更改
文档和开发者体验 有一定文档支持 文档和开发者体验得到了显著改善

选择建议

  • 如果你正在使用 Hardhat 2,并且你的项目已经稳定运行,可以继续使用,但建议尽早迁移到 Hardhat 3,因为它提供了更高的性能和更多的功能支持。
  • Hardhat 3 更适合新项目,它提供了更好的性能、可扩展性和开发者体验,是面向未来的更新版本。

如果你已经掌握了 Hardhat 2,升级到 Hardhat 3 后,你会发现开发和调试过程更加流畅,同时可以利用更多新的功能和优化。

问题五: hardhat的历史有多久

Hardhat 的历史并不是很长,但它自发布以来迅速成为了以太坊智能合约开发中的重要工具。Hardhat 由 Nomic Labs 开发,目的是提供一个现代化的、易于使用的开发环境,专门为以太坊智能合约开发、测试和部署而设计。

Hardhat 的历史大致时间线

  1. 2018 年:Hardhat 的初步构思

    • Nomic Labs(一家专注于区块链开发工具的公司)在 2018 年左右开始了 Hardhat 项目的初步构思。
    • 目标是解决当时 Truffle 和其他开发工具的一些性能瓶颈、复杂性以及缺乏灵活性的问题。
  2. 2019 年:Hardhat 发布

    • Hardhat 正式发布于 2019 年,最初它的核心功能是提供一个强大的 开发环境,让开发者能够更高效地编写和测试智能合约。
    • 当时,它主要解决了 开发工具的性能和扩展性问题,比如改进了 Solidity 编译器 的支持、增加了本地测试网络的功能,并且支持调试合约和与以太坊网络的交互。
  3. 2019 - 2020 年:逐渐改进与普及

    • 在 2019 年和 2020 年间,Hardhat 快速吸引了大量开发者的注意,并成为以太坊开发工具中的一员重要角色。
    • 随着以太坊的 DeFiNFT 热潮,Hardhat 也逐渐成为很多开发者的首选工具,特别是在那些需要 高效测试、自动化部署、与多个网络交互 的开发场景中。
    • 在此期间,Hardhat 社区和插件生态逐步壮大,逐渐支持了 ethers.jsWaffle 等框架的集成。
  4. 2020 年 - 2021 年:Hardhat 的完善与发展

    • Hardhat 因其强大的性能和灵活性,被越来越多的开发者所采用。这个时期,Hardhat 添加了许多功能和改进,包括:

      • 更强大的调试功能:支持 Solidity 源代码调试,帮助开发者更方便地追踪和定位合约中的错误。
      • 插件系统:推出插件系统,允许开发者使用或开发自定义插件,扩展 Hardhat 的功能。
      • Hardhat Network:提供了一个内置的本地区块链环境(Hardhat Network),用于合约的快速测试和部署。
    • 在这个时期,Hardhat 也成为 Ethereum Foundation 和许多 DeFi 项目、开发者团队的首选开发框架。

  5. 2021 年 - 2022 年:Hardhat 3 和持续改进

    • 2021 年,Hardhat 3 版本发布,引入了更强大的功能、性能优化和更易于使用的配置方式,同时继续加强与各种工具和插件的集成。
    • Hardhat 3 增加了对 TypeScript 的更好支持,优化了 Solidity 编译,并且加入了更多的 安全性测试Gas 使用分析 等高级功能。

Hardhat 的成长与演变

  • Hardhat 的成功:Hardhat 因其对开发者友好的设计、快速的本地测试、强大的插件系统和与其他工具的兼容性,逐渐成为了 DeFiNFT 项目的首选框架之一。它的不断迭代和社区贡献,使它在以太坊开发工具中占据了重要地位。

  • 用户增长:Hardhat 的文档、教程以及社区支持非常强大,使得无论是初学者还是高级开发者都能迅速上手并利用这个工具。许多以太坊开发者和团队已经将 Hardhat 集成到他们的开发流程中。

总结

Hardhat 的历史相对较短,从 2019 年发布到今天,它已经成为了 以太坊开发工具中最受欢迎的框架之一,特别是在智能合约开发和自动化测试方面,得到了广泛的应用。它的发展得益于对开发者需求的深刻理解和持续的功能更新,成为了许多 DeFi 项目和 区块链开发者 的必备工具。