2022/07/07 Solidity_HardHat_Day1
# 2022/07/07 Solidity_Hardhat_Day1
### 链接钱包或`Dapp`到`HardHat`网络
**`HardHat`运行时:**
1. `HardHat`启动时会启动一个`HardHat NetWork`内存实例. `MetaMask、Dapp、脚本`可以连接它
**独立的方式运行`HardHat NetWork`:**
指令: `npx hardhat node` ---> 将暴露一个`JSON-RPC`接口链接到`HardHat`网络上
**可以将合约部署到该节点上:**
`npx hardhat run scripts/脚本名称 --network 节点名称`
**上诉就完成了一个合约编译、部署、节点启动、部署合约到节点的全流程操作**
### HardHat配置项
**配置项文件:**
`hardhat.config.js`或者`hardhat.config.ts` ---> 这取决于用什么写测试用例
**配置项文件对象:**
1. `defaultNetwork` ---> 默认的网络配置项. 为空或设置为`hardhat`时,则`Hardhat`默认在启动运行实例
2. `networks` ---> 基于`JSON-RPC`的网络和内置的`Hardhat`网络
3. `solidity`
4. `paths`
5. `mocha`
#### 网络配置
**可以在配置项中设置`hardhat`配置项 ---> 基于`Hardhat NetWork`:**
1. `chainId`: 设置链`Id`
2. `from`: 设置默认发件人地址,如果不存在则默认使用`Hardhat Network`第一个帐户
3. `gas`: 每笔交易中默认使用的`gas`限制.
4. `gasPrice`: 默认值`auto`
5. `gasMultiplier`: 预估的`gas`
6. `blockGasLimit`: 在`Hardhat Network`的区块链中使用的块气体限制.默认值`9500000`
7. `loggingEnabled`:一个布尔值,用于控制`Hardhat Network`是否记录每个请求.默认值:`false` 对于进程内的`Hardhat Network 提供者`,`true`对于`Hardhat Network`支持的`JSON-RPC`服务器(即`node`任务)
**基于`JSON-RPC`的配置:**
1. `url`: 节点的`url`
2. `httpHeaders`: 设置在发出`JSON-RPC`请求时要使用的额外`HTTP`标头.它接受一个将标头名称映射到它们的值的`JavaScript`对象.默认值:`undefined`
3. `timeout`: 发送到`JSON-RPC`服务器的请求超时(毫秒).如果请求花费的时间超过此时间,它将被取消.默认值:`20000`
`Hardhat Network`允许在`Solidity`代码中调用`console.log()`来打印日志信息和合约变量 ---> 前提是引入`hardhat`包下的`consol.sol`文件
**`console.log`函数的规则:**
1. `call`调用和交易中都可以使用`console.log`,在`view`中可用在`pure`函数中不起作用
2. `console.log`是用标准的`Solidity`实现,在`Hardhat Network`中会检测到这些输出.使得在任何其他工具可以编译(如`Remix、Waffle`或`Truffle`)
3. `console.log`会花费少量`gas`
#### Solidity配置
1. `version`: `solc`版本
2. `settings`: 与`JSON`的`settings`具有相同架构的对象
3. `compilers`: 编译器配置对象列表
4. `overrides`: 编译器配置覆盖对象的可选映射.将文件名映射到编译器配置对象
#### 路径配置
`paths`可用的`key`:
1. `root`: `hardhat`项目的根,此路径是从`hardhat.config.js`的目录解析的.默认值:包含配置文件的目录.
2. `sources`: 存储合约目录,默认值:`./contracts`
3. `tests`: 测试所在目录,默认值`./test`
4. `cache`: `Hardhat`缓存其内部内容的目录.默认值`./cache`
5. `artifacts`: 存储编译工件的目录.默认值:`'./artifacts'`
#### mocha配置
1. 设置`timeout:`即可
#### Hardhat配置快速集成其他工具
`Hardhat`的配置文件将始终在任何任务之前运行,因此可以使用它与其他工具集成.
需要导入`@babel/register`.
### 分叉主网
`Hardhat`网络默认是空的,除了一些有初始余额的账户
主网`forking`的作用就是模拟主网状态的本地网络
**本地启动节点分叉主网:**
`npx hardhat node --fork url<key>` ---> 可以在网络配置当中设置主网分叉
`
networks: {
hardhat: {
forking: {
url: "url<key>"
}
}
}
`
### 挖矿配置
- 自动挖开(`Automine`): 发送的每笔交易都会自动包含在一个新的区块中
- 间隔挖矿(`Interval mining`): 定期挖一个新区块,其中包括尽可能多的待处理交易
**配置`hardhat`网络并且配置挖矿模式:**
`
networks: {
hardhat: {
mining: {
auto: false,
interval: 5000
}
}
}
`
`
networks: {
hardhat: {
mining: {
auto: false,
interval: [3000, 6000]
}
}
}
`
**手动挖矿:**
`
networks: {
hardhat: {
mining: {
auto: false,
interval: 0
}
}
}
`
**`Mempool`行为:**
自动挖矿被禁用,每一个发送的交易都会被添加到`mempool`中.`hardhat`的`mempool`遵循的规则:
- `Gas`价格高的交易会先执行
- 如果有两笔交易可以包括在内,而且两笔交易的`Gas`价格相同,那么先收到的那笔交易就先执行
- 如果一个交易是无效的(例如,它的`nonce`低于发送它的地址的`nonce`的`nonce`),则该交易被放弃

浙公网安备 33010602011771号