hardhat开发框架3

上一篇: hardhat开发框架2

在上一篇中,我们了解到了

  • nvm 是node版本管理器
  • node.js是JavaScript runtime
  • npm是node.js的包管理工具
  • hardhat的历史有7年,是一家名为nomic labs的公司开发的
  • 可以通过搜索公司名词和它们的官网去发现新的工作机会
  • 在linux虚拟机中安装了hardhat和fountry(在windows安装这些遇到了很多的报错)

问题一: 学习solidity为什么要学基于JavaScript的hardhat的呢?感觉很奇怪,我之前学习c,c++,只要IDE和编译器就足够了

理解你为什么会觉得很奇怪!你提到的 C 和 C++ 开发环境确实相对简单,通常只需要 IDE 和编译器就能进行开发。但 Solidity 开发有些不同,因为它涉及到区块链、智能合约和去中心化的应用,这些特点使得开发工具链变得更加复杂,尤其是在测试、部署和与区块链交互时。

为什么学习 Hardhat

  1. 区块链开发需要更多的工具

    • 在传统编程语言(如 C、C++)中,代码通常在本地运行,开发者只需使用编译器和 IDE。但在区块链开发中,尤其是 Solidity,你不仅需要编写合约,还需要与 区块链网络(如以太坊)进行交互。Hardhat 提供了一个完整的开发环境,帮助你进行部署、调试、测试等操作。
  2. 自动化测试和调试

    • Hardhat 内置了强大的测试框架,可以用来自动化测试智能合约,确保合约按预期工作。它允许你在本地模拟以太坊网络,进行快速的合约部署、执行和调试,类似于 IDE 中的调试器和测试框架,但 Hardhat 是专为区块链环境设计的。
  3. 与智能合约交互

    • Solidity 合约不仅仅是写代码,还涉及到部署到区块链、与前端交互等过程。Hardhat 提供了与以太坊交互的功能(例如,部署合约、发送交易、调用合约方法等),简化了这些流程,使得开发者能够专注于逻辑实现,而不用担心底层复杂性。
  4. 测试环境

    • 在传统编程中,我们测试的是在本地计算机上运行的程序,而 Solidity 程序运行在 区块链网络 中。Hardhat 提供了一个本地的以太坊网络(Hardhat Network),模拟真实的区块链环境。开发者可以在没有实际花费 Gas 的情况下进行合约测试和交易模拟,这对于开发去中心化应用(dApp)非常重要。
  5. 开发者效率

    • Hardhat 可以大大提高开发效率,例如:快速编译、部署和测试、集成其他工具(如 ethers.js、web3.js)等,所有这些功能都能够在一个统一的框架下完成,避免了开发者在多个工具间切换的麻烦。
  6. 跨链开发支持

    • 目前 Hardhat 支持多个以太坊测试网络(如 Rinkeby、Goerli)以及本地网络和主网部署,使得开发者可以无缝地在不同网络环境下进行测试和开发,确保合约能够跨链兼容。

总结

  • C 和 C++ 的开发环境是传统的本地应用开发,而 Solidity 属于区块链和去中心化应用开发,它不仅需要编写合约代码,还需要与区块链进行交互,进行网络部署和测试。
  • Hardhat 提供了一个全面的开发框架,专为智能合约开发设计,解决了传统开发工具无法处理的区块链特有的挑战。

因此,Hardhat 这样的工具是 Solidity 开发中不可或缺的一部分,它为开发者提供了更多的功能和便利,使得区块链开发变得更加高效和可维护。

问题二: 那么hardhat是不是可以看作python的flask或者fastapi

是的,可以将 Hardhat 类比为 Python 的 FlaskFastAPI,但它们之间也有一些不同的地方。让我们详细分析一下:

相似之处

  1. 用于构建应用

    • Hardhat 是一个 开发框架,专为 以太坊智能合约开发 设计,提供了开发、测试、调试和部署智能合约的功能。它让开发者能够快速构建去中心化应用(dApp)。
    • 类似地,FlaskFastAPI 是用于构建 Web 应用 的框架,提供了快速构建 RESTful API 或 Web 服务的功能。它们简化了 Web 应用开发过程,允许开发者快速实现后端逻辑、路由、请求处理等。
  2. 轻量级和灵活性

    • FlaskFastAPI 都是 轻量级框架,不强制使用特定的库或工具,开发者可以自由选择想要的功能和扩展。同样,Hardhat 也是轻量级的,它本身并不包含复杂的 Web 前端或数据库功能,而是专注于智能合约开发,因此开发者可以灵活地选择其他工具(如 ethers.js)来与合约交互。
  3. 内置功能和工具

    • Flask 提供了路由、请求处理、模板渲染等功能,但也允许开发者根据需求扩展功能,比如集成数据库、身份验证等。
    • Hardhat 提供了内置的功能,如本地 以太坊网络(用于测试合约),自动化测试(通过 Mocha 和 Chai)以及与合约的交互功能(通过 ethers.jsweb3.js)。它也允许你集成其他工具和库,来增强智能合约的功能。

不同之处

  1. 应用领域不同

    • FlaskFastAPI 是用于构建 Web 应用,主要处理 HTTP 请求、路由、数据库操作等。
    • Hardhat 是专为 区块链开发 设计的框架,主要关注 智能合约 的编写、测试、调试和部署。它的核心是与 以太坊 区块链进行交互,而不是处理 HTTP 请求或 Web 页面。
  2. 开发的目标不同

    • FlaskFastAPI 旨在构建 后端 API 或 Web 应用,通过处理 HTTP 请求和响应来与前端或客户端交互。
    • Hardhat 旨在帮助开发者构建和部署 智能合约,并通过 JavaScript 和 Solidity 编写与区块链的交互。

总结

  • Hardhat 可以类比为 FlaskFastAPI,因为它们都是用于开发某类特定应用的框架,提供了基础功能并允许扩展。
  • 但是,Hardhat 是专为 以太坊智能合约 开发设计的框架,而 FlaskFastAPI 是专为 Web 应用API 开发设计的。

所以,Hardhat 是一个类似于 FlaskFastAPI 的框架,但它面向的是区块链开发,特别是智能合约开发。

问题三: Cancun 是什么

Cancun 是以太坊(Ethereum)网络的一次重要升级(硬分叉)的代号,类似于 伦敦(London)伊斯坦布尔(Istanbul) 等过去的升级。它是以太坊 EIP-4844 提案的一部分,这个提案被称为 “Proto-Danksharding”,旨在提高以太坊的可扩展性。

Cancun 升级的核心目标:

  1. 提高可扩展性

    • Cancun 的主要目的是 扩展以太坊 的处理能力,尤其是通过改进 数据存储交易处理 的方式,进一步降低交易成本。
    • 其中最重要的技术之一是 EIP-4844,它提出了 Proto-Danksharding,通过引入 便宜的交易数据,改善了以太坊的扩展性。
  2. Proto-Danksharding

    • Proto-Danksharding 是一种分片技术,旨在通过让不同的数据片段在网络中并行处理,提升以太坊处理交易的能力。EIP-4844 提供了一种早期实现分片的方法,目的是为未来的 Danksharding 做准备。
    • EIP-4844 引入了新的数据格式,称为 **”blobs”**,它可以将大量的交易数据批量打包,并以低廉的费用在以太坊网络上进行处理。
  3. 提高交易效率和降低费用

    • 通过 Proto-Danksharding,以太坊将能够更高效地处理大量的交易,从而 降低交易费用,这对以太坊的 去中心化金融(DeFi)NFT 市场至关重要。

Cancun 升级与以太坊的未来

  • Cancun 升级是以太坊长期扩展计划的一部分,预计会为以太坊带来更强的 可扩展性 和更低的 交易费用。它为未来更全面的 Danksharding 升级铺平了道路。
  • 该升级将在 以太坊 2.0(即合并后) 的基础上进一步优化,以太坊网络将能够支持更多的用户和更高频率的交易,推动以太坊成为全球去中心化应用的基础设施。

总结

Cancun 是以太坊网络的一次升级,主要聚焦于提高可扩展性、降低交易费用,并为未来的 Danksharding(分片技术)打下基础。它通过引入 Proto-DankshardingEIP-4844,使得以太坊能处理更多的交易数据,提高性能和降低成本,提升网络的效率。

问题四: Mocha是什么?

Mocha 是一个流行的 JavaScript 测试框架,用于编写和执行 单元测试集成测试功能测试。它的主要特点是 灵活性易用性可扩展性,使得开发者能够方便地组织和执行测试用例,确保代码的正确性。

Mocha 的主要功能

  1. 测试框架

    • Mocha 提供了一个结构化的测试环境,允许你编写和执行各种测试。它提供了一个简洁的 API,用于定义和组织测试用例。
  2. 支持异步测试

    • Mocha 支持异步测试,非常适合处理需要等待回调、Promises 或 async/await 的异步操作(如文件 I/O、网络请求等)。
  3. 断言支持

    • Mocha 本身不包含断言库,但可以与多种断言库(如 Chai)配合使用,开发者可以通过它来验证代码行为。
  4. 钩子(Hooks)

    • Mocha 提供了 钩子(如 before(), after(), beforeEach(), afterEach()),可以在测试运行前后执行特定的初始化和清理操作,确保每个测试的独立性。
  5. 多种报告格式

    • Mocha 支持不同的输出格式,可以生成详细的报告或简单的摘要,帮助开发者查看测试结果。

常见的 Mocha 术语

  1. describe:用来描述一个测试套件,通常包含多个测试用例(it)。

    1
    2
    3
    describe('Math functions', function () {
    // 测试用例
    });
  2. it:用来定义一个具体的测试用例。

    1
    2
    3
    it('should add two numbers correctly', function () {
    // 测试代码
    });
  3. **before() / after() / beforeEach() / afterEach()**:

    • before:在所有测试用例执行之前运行一次。
    • after:在所有测试用例执行之后运行一次。
    • beforeEach:在每个测试用例执行之前运行。
    • afterEach:在每个测试用例执行之后运行。

Mocha 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 引入 Mocha 和 Chai
const { expect } = require('chai');
const { sum, subtract } = require('./math'); // 假设这是你要测试的函数

describe('Math Functions', function () {
describe('sum', function () {
it('should add two numbers correctly', function () {
expect(sum(1, 2)).to.equal(3);
});
});

describe('subtract', function () {
it('should subtract two numbers correctly', function () {
expect(subtract(5, 3)).to.equal(2);
});
});
});

Mocha 的运行方式

  • Mocha 可以通过命令行执行,通常和 Chai(断言库)一起使用。你可以在终端中运行以下命令来执行 Mocha 测试:

    1
    npx mocha

Mocha 的优势

  1. 简洁易用:Mocha 提供了非常简单且直观的 API,便于上手,适合初学者。
  2. 强大的社区支持:作为 JavaScript 测试领域的老牌框架,Mocha 有着广泛的社区支持和大量的插件。
  3. 异步支持:Mocha 对异步操作支持良好,适合现代 JavaScript 应用程序,尤其是在处理网络请求、文件操作等异步代码时。
  4. 与其他工具兼容:Mocha 可以与 ChaiSinon 等断言库和模拟库配合使用,支持更复杂的测试需求。

总结

Mocha 是一个功能强大的 JavaScript 测试框架,用于组织和执行测试。它支持异步操作,能够和各种断言库(如 Chai)兼容,适合用于测试 Web 应用、Node.js 服务和其他 JavaScript 项目。Mocha 简单易用,并且在社区中有很高的普及率。

hardhat的使用

安装完成后,您将拥有一个功能齐全的 Hardhat 3 项目。要验证所有设置是否正确,请运行
npx hardhat --help

要对您的项目进行完整测试运行,请运行: npx hardhat test

你理解得基本是对的,但我可以帮助你更准确地解读 npx hardhat test 这条命令的含义和流程。

npx hardhat test 的含义

  • **npx**:npx 是一个包执行工具,用于直接执行在 node_modules 目录中的包,或者执行安装在全局的包。在这里,它用于执行本地安装的 Hardhat

  • **hardhat test**:这是 Hardhat 提供的一个命令,用于执行合约的 自动化测试。这个命令会自动查找你的测试文件并运行它们。Hardhat 会编译你的 Solidity 合约,运行测试,并输出结果。

详细执行流程

  1. 编译 Solidity 合约

    • Hardhat 使用 Solidity 编译器(solc)来编译位于 contracts 目录下的 Solidity 合约文件。在你的输出中:

      1
      Compiled 1 Solidity file with solc 0.8.28 (evm target: cancun)

      这表示 Hardhat 使用 solc 编译器的版本 0.8.28 编译了一个 Solidity 文件,目标是 **EVM (Ethereum Virtual Machine)**,并且选择了 Cancun 作为 EVM 目标(Cancun 是以太坊升级的一部分,可能与 EVM 相关的改进有关)。

  2. 编译 Solidity 测试文件

    • 如果你的项目中有 Solidity 测试文件,Hardhat 会对这些文件进行编译。在你的输出中:

      1
      Compiled 1 Solidity test file with solc 0.8.28 (evm target: cancun)

      这表示除了正常的合约文件外,Hardhat 还编译了一个 Solidity 测试文件。

  3. 运行 Solidity 测试

    • Solidity 测试 是直接用 Solidity 编写的,通常用于测试合约的逻辑。Hardhat 会运行这些 Solidity 编写的测试,并输出结果。比如在你的输出中:

      1
      Running Solidity tests

      然后显示通过的测试:

      1
      3 passing
  4. 运行 JavaScript 测试(Node.js 测试)

    • Hardhat 默认也支持使用 JavaScript 测试框架(例如 Mocha)来测试 Solidity 合约的行为。在你的输出中:

      1
      Running node:test tests

      这表示正在运行用 Node.js 和 Mocha 写的测试,这些测试用于验证合约的逻辑、事件等行为。

      你在输出中看到的测试通过结果:

      1
      2
      ✔ Should emit the Increment event when calling the inc() function
      ✔ The sum of the Increment events should match the current value

总结

  • npx hardhat test 是用来运行 Solidity 测试和 JavaScript 测试 的命令。
  • Solidity 测试:是使用 Solidity 编写的合约测试,通常用于验证合约功能是否按预期工作。
  • Node.js 测试(JavaScript 测试):是用 JavaScript(通常配合 Mocha 或 Chai)编写的测试,主要用于测试合约部署后与区块链交互的行为(如事件、状态变化等)。

所以,**npx hardhat test** 命令的作用是:

  1. 编译你在 contracts 目录下的 Solidity 合约和测试文件。
  2. 运行这些 Solidity 测试Node.js 测试,并输出测试结果。

问题五: ethers.js 是什么?

Ethers.js 是一个轻量级的 JavaScript 库,用于与 Ethereum 区块链进行交互。它提供了一种简便的方式来连接 Ethereum 节点、发送交易、读取区块链上的数据,并与智能合约进行交互。

Ethers.js 的主要特点包括:

  1. 轻量级:Ethers.js 的设计目标之一就是保持小巧,并且不依赖于大型的第三方库。

  2. 兼容性:它可以在浏览器、Node.js 和其他 JavaScript 环境中运行,支持与以太坊网络的各种交互。

  3. 简洁的 API:Ethers.js 提供了一个简单且易于理解的 API,使开发者能够轻松地与 Ethereum 区块链进行交互。

  4. 安全性:Ethers.js 提供了强大的工具来生成、管理和签名 Ethereum 密钥对,它有助于提升钱包管理的安全性。

  5. 与智能合约的交互:通过 Ethers.js,开发者可以轻松地部署、调用和监听智能合约事件。

  6. 支持钱包连接:Ethers.js 可以与硬件钱包、MetaMask 等浏览器插件钱包进行集成,支持用户管理账户和交易。

  7. 广泛的支持:支持多种以太坊网络,包括主网、测试网(如 Rinkeby、Ropsten 等),以及自定义网络。

举个例子,使用 Ethers.js 发送一笔交易的代码可能是这样的:

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

// 设置一个提供者(Provider),例如使用 Etherscan 或 Infura
const provider = new ethers.JsonRpcProvider("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID");

// 创建一个钱包实例
const wallet = new ethers.Wallet("YOUR_PRIVATE_KEY", provider);

// 发送交易
async function sendTransaction() {
const tx = await wallet.sendTransaction({
to: "0xRecipientAddress",
value: ethers.parseEther("0.1"), // 发送 0.1 ETH
});
console.log("Transaction hash:", tx.hash);
}

sendTransaction();

Ethers.js 是一个很受欢迎的工具,特别适合开发去中心化应用(dApp),因为它简洁、易用、且功能强大。如果你正在开发 Web3 或以太坊相关的项目,它是一个非常不错的选择!

问题六: 这条命令是什么意思?

npm add --save-dev @nomicfoundation/hardhat-toolbox-viem @nomicfoundation/hardhat-ignition viem

这条命令是用来通过 npm 安装一组开发依赖项到你的 Node.js 项目中,主要用于 Hardhat 的开发环境和工具。下面是这条命令的分解和解释:

1
npm add --save-dev @nomicfoundation/hardhat-toolbox-viem @nomicfoundation/hardhat-ignition viem

1. npm add

  • npm add 是安装包的命令,类似于 npm install。它的作用是安装指定的包。
  • --save-dev 参数表示将这些依赖添加到项目的 devDependencies 中,也就是将它们标记为开发依赖。开发依赖是指在开发和测试过程中需要的包,但不需要在生产环境中使用。

2. @nomicfoundation/hardhat-toolbox-viem

  • 这是一个 Hardhat 的插件包,带有一些工具和功能,旨在支持与 Viem 相关的操作。Viem 是一个轻量级的 Ethereum 客户端库,用于与以太坊区块链交互。
  • 这个包是由 Nomic Foundation 提供的,属于 Hardhat 的工具箱的一部分,用于增强开发者与以太坊交互的能力。

3. @nomicfoundation/hardhat-ignition

  • 这是另一个由 Nomic Foundation 提供的 Hardhat 插件,通常用于智能合约的部署和管理,帮助开发者将合约部署到以太坊网络或其他兼容的网络。
  • hardhat-ignition 可以简化与合约部署相关的任务,并集成到 Hardhat 项目中。

4. viem

  • viem 是一个用于与以太坊进行交互的轻量级库,允许开发者通过 JavaScript 进行区块链交互。
  • 这个库可以替代 web3.jsethers.js 等库,提供更加简洁和高效的方式与以太坊节点交互。

总结:

这条命令的作用是:

  1. 安装 @nomicfoundation/hardhat-toolbox-viem@nomicfoundation/hardhat-ignitionviem 这些开发工具。
  2. 将它们作为开发依赖(--save-dev)添加到项目中,这意味着它们只在开发和测试环境中使用,而不会在生产环境中部署。

这些工具将帮助你在 Hardhat 项目中与 Viem 轻量客户端进行交互,并且提供智能合约的部署支持。