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?
区块链开发需要更多的工具:
- 在传统编程语言(如 C、C++)中,代码通常在本地运行,开发者只需使用编译器和 IDE。但在区块链开发中,尤其是 Solidity,你不仅需要编写合约,还需要与 区块链网络(如以太坊)进行交互。Hardhat 提供了一个完整的开发环境,帮助你进行部署、调试、测试等操作。
自动化测试和调试:
- Hardhat 内置了强大的测试框架,可以用来自动化测试智能合约,确保合约按预期工作。它允许你在本地模拟以太坊网络,进行快速的合约部署、执行和调试,类似于 IDE 中的调试器和测试框架,但 Hardhat 是专为区块链环境设计的。
与智能合约交互:
- Solidity 合约不仅仅是写代码,还涉及到部署到区块链、与前端交互等过程。Hardhat 提供了与以太坊交互的功能(例如,部署合约、发送交易、调用合约方法等),简化了这些流程,使得开发者能够专注于逻辑实现,而不用担心底层复杂性。
测试环境:
- 在传统编程中,我们测试的是在本地计算机上运行的程序,而 Solidity 程序运行在 区块链网络 中。Hardhat 提供了一个本地的以太坊网络(Hardhat Network),模拟真实的区块链环境。开发者可以在没有实际花费 Gas 的情况下进行合约测试和交易模拟,这对于开发去中心化应用(dApp)非常重要。
开发者效率:
- Hardhat 可以大大提高开发效率,例如:快速编译、部署和测试、集成其他工具(如 ethers.js、web3.js)等,所有这些功能都能够在一个统一的框架下完成,避免了开发者在多个工具间切换的麻烦。
跨链开发支持:
- 目前 Hardhat 支持多个以太坊测试网络(如 Rinkeby、Goerli)以及本地网络和主网部署,使得开发者可以无缝地在不同网络环境下进行测试和开发,确保合约能够跨链兼容。
总结:
- C 和 C++ 的开发环境是传统的本地应用开发,而 Solidity 属于区块链和去中心化应用开发,它不仅需要编写合约代码,还需要与区块链进行交互,进行网络部署和测试。
- Hardhat 提供了一个全面的开发框架,专为智能合约开发设计,解决了传统开发工具无法处理的区块链特有的挑战。
因此,Hardhat 这样的工具是 Solidity 开发中不可或缺的一部分,它为开发者提供了更多的功能和便利,使得区块链开发变得更加高效和可维护。
问题二: 那么hardhat是不是可以看作python的flask或者fastapi
是的,可以将 Hardhat 类比为 Python 的 Flask 或 FastAPI,但它们之间也有一些不同的地方。让我们详细分析一下:
相似之处:
用于构建应用:
- Hardhat 是一个 开发框架,专为 以太坊智能合约开发 设计,提供了开发、测试、调试和部署智能合约的功能。它让开发者能够快速构建去中心化应用(dApp)。
- 类似地,Flask 和 FastAPI 是用于构建 Web 应用 的框架,提供了快速构建 RESTful API 或 Web 服务的功能。它们简化了 Web 应用开发过程,允许开发者快速实现后端逻辑、路由、请求处理等。
轻量级和灵活性:
- Flask 和 FastAPI 都是 轻量级框架,不强制使用特定的库或工具,开发者可以自由选择想要的功能和扩展。同样,Hardhat 也是轻量级的,它本身并不包含复杂的 Web 前端或数据库功能,而是专注于智能合约开发,因此开发者可以灵活地选择其他工具(如 ethers.js)来与合约交互。
内置功能和工具:
- Flask 提供了路由、请求处理、模板渲染等功能,但也允许开发者根据需求扩展功能,比如集成数据库、身份验证等。
- Hardhat 提供了内置的功能,如本地 以太坊网络(用于测试合约),自动化测试(通过 Mocha 和 Chai)以及与合约的交互功能(通过
ethers.js或web3.js)。它也允许你集成其他工具和库,来增强智能合约的功能。
不同之处:
应用领域不同:
- Flask 和 FastAPI 是用于构建 Web 应用,主要处理 HTTP 请求、路由、数据库操作等。
- Hardhat 是专为 区块链开发 设计的框架,主要关注 智能合约 的编写、测试、调试和部署。它的核心是与 以太坊 区块链进行交互,而不是处理 HTTP 请求或 Web 页面。
开发的目标不同:
- Flask 和 FastAPI 旨在构建 后端 API 或 Web 应用,通过处理 HTTP 请求和响应来与前端或客户端交互。
- Hardhat 旨在帮助开发者构建和部署 智能合约,并通过 JavaScript 和 Solidity 编写与区块链的交互。
总结:
- Hardhat 可以类比为 Flask 或 FastAPI,因为它们都是用于开发某类特定应用的框架,提供了基础功能并允许扩展。
- 但是,Hardhat 是专为 以太坊智能合约 开发设计的框架,而 Flask 和 FastAPI 是专为 Web 应用 和 API 开发设计的。
所以,Hardhat 是一个类似于 Flask 或 FastAPI 的框架,但它面向的是区块链开发,特别是智能合约开发。
问题三: Cancun 是什么
Cancun 是以太坊(Ethereum)网络的一次重要升级(硬分叉)的代号,类似于 伦敦(London)、伊斯坦布尔(Istanbul) 等过去的升级。它是以太坊 EIP-4844 提案的一部分,这个提案被称为 “Proto-Danksharding”,旨在提高以太坊的可扩展性。
Cancun 升级的核心目标:
提高可扩展性:
- Cancun 的主要目的是 扩展以太坊 的处理能力,尤其是通过改进 数据存储 和 交易处理 的方式,进一步降低交易成本。
- 其中最重要的技术之一是 EIP-4844,它提出了 Proto-Danksharding,通过引入 便宜的交易数据,改善了以太坊的扩展性。
Proto-Danksharding:
- Proto-Danksharding 是一种分片技术,旨在通过让不同的数据片段在网络中并行处理,提升以太坊处理交易的能力。EIP-4844 提供了一种早期实现分片的方法,目的是为未来的 Danksharding 做准备。
- EIP-4844 引入了新的数据格式,称为 **”blobs”**,它可以将大量的交易数据批量打包,并以低廉的费用在以太坊网络上进行处理。
提高交易效率和降低费用:
- 通过 Proto-Danksharding,以太坊将能够更高效地处理大量的交易,从而 降低交易费用,这对以太坊的 去中心化金融(DeFi) 和 NFT 市场至关重要。
Cancun 升级与以太坊的未来:
- Cancun 升级是以太坊长期扩展计划的一部分,预计会为以太坊带来更强的 可扩展性 和更低的 交易费用。它为未来更全面的 Danksharding 升级铺平了道路。
- 该升级将在 以太坊 2.0(即合并后) 的基础上进一步优化,以太坊网络将能够支持更多的用户和更高频率的交易,推动以太坊成为全球去中心化应用的基础设施。
总结:
Cancun 是以太坊网络的一次升级,主要聚焦于提高可扩展性、降低交易费用,并为未来的 Danksharding(分片技术)打下基础。它通过引入 Proto-Danksharding 和 EIP-4844,使得以太坊能处理更多的交易数据,提高性能和降低成本,提升网络的效率。
问题四: Mocha是什么?
Mocha 是一个流行的 JavaScript 测试框架,用于编写和执行 单元测试、集成测试 和 功能测试。它的主要特点是 灵活性、易用性 和 可扩展性,使得开发者能够方便地组织和执行测试用例,确保代码的正确性。
Mocha 的主要功能:
测试框架:
- Mocha 提供了一个结构化的测试环境,允许你编写和执行各种测试。它提供了一个简洁的 API,用于定义和组织测试用例。
支持异步测试:
- Mocha 支持异步测试,非常适合处理需要等待回调、Promises 或
async/await的异步操作(如文件 I/O、网络请求等)。
- Mocha 支持异步测试,非常适合处理需要等待回调、Promises 或
断言支持:
- Mocha 本身不包含断言库,但可以与多种断言库(如 Chai)配合使用,开发者可以通过它来验证代码行为。
钩子(Hooks):
- Mocha 提供了 钩子(如
before(),after(),beforeEach(),afterEach()),可以在测试运行前后执行特定的初始化和清理操作,确保每个测试的独立性。
- Mocha 提供了 钩子(如
多种报告格式:
- Mocha 支持不同的输出格式,可以生成详细的报告或简单的摘要,帮助开发者查看测试结果。
常见的 Mocha 术语:
describe:用来描述一个测试套件,通常包含多个测试用例(
it)。1
2
3describe('Math functions', function () {
// 测试用例
});it:用来定义一个具体的测试用例。
1
2
3it('should add two numbers correctly', function () {
// 测试代码
});**before() / after() / beforeEach() / afterEach()**:
- before:在所有测试用例执行之前运行一次。
- after:在所有测试用例执行之后运行一次。
- beforeEach:在每个测试用例执行之前运行。
- afterEach:在每个测试用例执行之后运行。
Mocha 示例:
1 | |
Mocha 的运行方式:
Mocha 可以通过命令行执行,通常和 Chai(断言库)一起使用。你可以在终端中运行以下命令来执行 Mocha 测试:
1
npx mocha
Mocha 的优势:
- 简洁易用:Mocha 提供了非常简单且直观的 API,便于上手,适合初学者。
- 强大的社区支持:作为 JavaScript 测试领域的老牌框架,Mocha 有着广泛的社区支持和大量的插件。
- 异步支持:Mocha 对异步操作支持良好,适合现代 JavaScript 应用程序,尤其是在处理网络请求、文件操作等异步代码时。
- 与其他工具兼容:Mocha 可以与 Chai、Sinon 等断言库和模拟库配合使用,支持更复杂的测试需求。
总结:
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 合约,运行测试,并输出结果。
详细执行流程:
编译 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 相关的改进有关)。
编译 Solidity 测试文件:
如果你的项目中有 Solidity 测试文件,Hardhat 会对这些文件进行编译。在你的输出中:
1
Compiled 1 Solidity test file with solc 0.8.28 (evm target: cancun)这表示除了正常的合约文件外,Hardhat 还编译了一个 Solidity 测试文件。
运行 Solidity 测试:
Solidity 测试 是直接用 Solidity 编写的,通常用于测试合约的逻辑。Hardhat 会运行这些 Solidity 编写的测试,并输出结果。比如在你的输出中:
1
Running Solidity tests然后显示通过的测试:
1
3 passing
运行 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** 命令的作用是:
- 编译你在
contracts目录下的 Solidity 合约和测试文件。 - 运行这些 Solidity 测试 和 Node.js 测试,并输出测试结果。
问题五: ethers.js 是什么?
Ethers.js 是一个轻量级的 JavaScript 库,用于与 Ethereum 区块链进行交互。它提供了一种简便的方式来连接 Ethereum 节点、发送交易、读取区块链上的数据,并与智能合约进行交互。
Ethers.js 的主要特点包括:
轻量级:Ethers.js 的设计目标之一就是保持小巧,并且不依赖于大型的第三方库。
兼容性:它可以在浏览器、Node.js 和其他 JavaScript 环境中运行,支持与以太坊网络的各种交互。
简洁的 API:Ethers.js 提供了一个简单且易于理解的 API,使开发者能够轻松地与 Ethereum 区块链进行交互。
安全性:Ethers.js 提供了强大的工具来生成、管理和签名 Ethereum 密钥对,它有助于提升钱包管理的安全性。
与智能合约的交互:通过 Ethers.js,开发者可以轻松地部署、调用和监听智能合约事件。
支持钱包连接:Ethers.js 可以与硬件钱包、MetaMask 等浏览器插件钱包进行集成,支持用户管理账户和交易。
广泛的支持:支持多种以太坊网络,包括主网、测试网(如 Rinkeby、Ropsten 等),以及自定义网络。
举个例子,使用 Ethers.js 发送一笔交易的代码可能是这样的:
1 | |
Ethers.js 是一个很受欢迎的工具,特别适合开发去中心化应用(dApp),因为它简洁、易用、且功能强大。如果你正在开发 Web3 或以太坊相关的项目,它是一个非常不错的选择!
问题六: 这条命令是什么意思?
npm add --save-dev @nomicfoundation/hardhat-toolbox-viem @nomicfoundation/hardhat-ignition viem
这条命令是用来通过 npm 安装一组开发依赖项到你的 Node.js 项目中,主要用于 Hardhat 的开发环境和工具。下面是这条命令的分解和解释:
1 | |
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.js 或 ethers.js 等库,提供更加简洁和高效的方式与以太坊节点交互。
总结:
这条命令的作用是:
- 安装
@nomicfoundation/hardhat-toolbox-viem、@nomicfoundation/hardhat-ignition和viem这些开发工具。 - 将它们作为开发依赖(
--save-dev)添加到项目中,这意味着它们只在开发和测试环境中使用,而不会在生产环境中部署。
这些工具将帮助你在 Hardhat 项目中与 Viem 轻量客户端进行交互,并且提供智能合约的部署支持。