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`),则该交易被放弃

posted @ 2022-08-10 18:34  俊king  阅读(219)  评论(0)    收藏  举报