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 项目和 区块链开发者 的必备工具。

问题六: nvm和pip有什么区别

nvmNode.js 版本管理工具,用于安装和切换不同版本的 Node.js。
pipPython 的包管理工具,用于安装和管理 Python 包。
简而言之,nvm 管理 Node.js 版本pip 管理 Python 包

问题七: node.js是什么

Node.js 是一个基于 V8 引擎(由 Google Chrome 提供)的 JavaScript 运行时环境。它使得开发者可以在 服务器端运行 JavaScript,而不仅仅是在浏览器中。Node.js 采用事件驱动、非阻塞 I/O 模型,适用于构建高性能、可扩展的网络应用,特别是在处理大量并发请求时。它广泛应用于开发 Web 服务器API实时应用等。

问题八: runtime是什么

Runtime(运行时)指的是程序在执行时所依赖的环境或系统,它提供了程序运行所需的资源和支持。简单来说,Runtime 是指程序从启动到结束期间执行所需要的各种服务和环境。

举个例子

  1. Node.js Runtime:Node.js 提供了一个 JavaScript 运行时环境,使得 JavaScript 不仅可以在浏览器中运行,还可以在服务器上运行,处理文件操作、网络请求等。
  2. Java Runtime:Java 程序依赖于 JVM(Java Virtual Machine) 来提供执行环境,使得 Java 程序可以跨平台运行。

总结

Runtime 是程序运行时所依赖的环境,它为程序提供必要的支持(如内存管理、文件处理等),使得程序能够在不同平台上执行。

问题九: npm是什么?

npmNode Package Manager)是 Node.js 的包管理工具,主要用于管理 JavaScript 库和工具。它帮助开发者:

  1. 安装和管理依赖包:npm 使得开发者能够轻松地安装、更新、卸载第三方 JavaScript 库(例如 Express、React)。
  2. 管理项目依赖:npm 会将项目依赖的库记录在 package.json 文件中,确保项目的依赖版本一致。
  3. 发布自己的包:开发者可以使用 npm 发布自己创建的 JavaScript 库,供其他人使用。

命令示例

  • 安装依赖包:npm install <package-name>
  • 更新包:npm update
  • 卸载包:npm uninstall <package-name>

简而言之,npm 是 JavaScript 生态系统中用于管理依赖包和项目的工具。