Hardhat内置区块链节点

Hardhat内置了一个为开发而设计的本地以太坊网络,Hardhat Network。这个节点允许你部署合约,运行测试和调试代码。

Hardhat Network是如何工作的?

- 它在收到每笔交易后,立即按顺序出块,没有任何延迟。
- 底层是基于 @ethereumjs/vm EVM 实现, 与ganache、Remix和Ethereum Studio 使用的相同EVM。
- 支持以下的硬分叉:
    - byzantium
    - constantinople
    - petersburg
    - istanbul
    - muirGlacier

如何使用它?

- 当 defaultNetwork为空或设置为 hardhat时,则Hardhat 默认在启动运行实例。
- 它以用来运行测试、以及在控制台、脚本和任务中使用它。
- 插件(ethers.js, web3.js, Waffle, Truffle等)会直接连接到其提供者。
- T不需要对你的测试或脚本做任何修改。
- 它只是另一个网络,它可以与--network一起使用。

 从钱包和其他软件连接到Hardhat网络

Hardhat Network可以以独立的方式运行,以便外部客户端可以连接到它。这可以是MetaMask、Dapp前端,或一个脚本。要以这种方式运行Hardhat Network,请运行:

```

npx hardhat node

```

它将启动Hardhat Network,并作为一个公开的JSON-RPC和WebSocket服务器。

然后,只要将钱包或应用程序连接到http://localhost:8545 。

如果你想把Hardhat连接到这个节点,你只需要使用--network localhost来运行命令。

Solidity 堆栈跟踪

Hardhat Network 拥有一流的Solidity支持。它总是知道哪些正在运行的智能合约,具体做什么,以及为什么失败。

如果一个交易或调用失败,Hardhat Network将抛出一个异常。 这个异常将组合 JavaScript 和 Solidity 栈追踪:从 JavaScript/TypeScript 开始的堆栈追踪,直到你 到合约的调用,并继续完整的 Solidity 调用堆栈。

这是一个使用 TruffleContract 的Hardhat Network异常的示例:

```

Error: Transaction reverted: function selector was not recognized and there's no fallback function
  at ERC721Mock.<unrecognized-selector> (contracts/mocks/ERC721Mock.sol:9)
  at ERC721Mock._checkOnERC721Received (contracts/token/ERC721/ERC721.sol:334)
  at ERC721Mock._safeTransferFrom (contracts/token/ERC721/ERC721.sol:196)
  at ERC721Mock.safeTransferFrom (contracts/token/ERC721/ERC721.sol:179)
  at ERC721Mock.safeTransferFrom (contracts/token/ERC721/ERC721.sol:162)
  at TruffleContract.safeTransferFrom (node_modules/@nomiclabs/truffle-contract/lib/execute.js:157:24)
  at Context.<anonymous> (test/token/ERC721/ERC721.behavior.js:321:26)

```

最后两行对应的是执行失败交易的JavaScript测试代码。 其余的是 Solidity 堆栈跟踪。 这样你就能清楚地知道为什么测试没有通过。

自动错误信息

Hardhat Network 总是知道你的交易或调用失败的原因,利用这些信息调试合约将更容易。

当一个交易无故失败时,Hardhat Network会在以下情况下创建一个明确的错误信息:

- 附加ETH调用一个非 payable 函数

- 发送ETH到一个没有可支付的回退或接收功能的合约上

- 在没有回退函数的情况下调用一个不存在的函数

- 用不正确的参数调用一个函数

- 调用一个没有返回正确参数数量的外部函数

- 在一个非合约账户上调用一个外部函数

- 由于外部调用的参数而无法执行(例如发送过多的ETH)。

- 没有使用 DELEGATECALL 调用库

- 不正确地调用预编译的合约

- 试图部署一个超过EIP-170规定的字节码大小限制的合约。

分叉主网

Hardhat网络默认是空的,除了一些有初始余额的账户。但有时,拥有一个模拟主网状态的本地网络会更有用,这就是主网forking的作用。

要分叉主网,你需要连接一个URL连接到主网节点。例如,使用Alchemy,你可以用这个命令启动一个本地节点来分叉主网:

```

npx hardhat node --fork https://eth-mainnet.alchemyapi.io/v2/<key>

```

必须用你自己的Alchemy API密钥替换命令中的<key>。

完成之后,你可以在你的节点中做任何在Hardhat网络中做的事情:查看控制台日志,获得堆栈跟踪或使用默认账户来部署新的合约。

如果你想让这成为默认行为,你可以通过修改Hardhat配置来做到这一点: 


```

networks: {
  hardhat: {
    forking: {
      url: "https://eth-mainnet.alchemyapi.io/v2/<key>"
    }
  }
}

```

在此配置下,如果你执行一个使用Hardhat网络的任务,该任务将启动一个分叉的节点并在其上运行。

日志

Hardhat Network基于其跟踪基础设施提供丰富的日志记录,这将有助于开发和调试智能合约。

例如,一个成功的交易和一个失败的调用将看起来像这样:

```

eth_sendTransaction
  Contract deployment: Greeter
  Contract address: 0x8858eeb3dfffa017d4bce9801d340d36cf895ccf
  Transaction: 0x7ea2754e53f09508d42bd3074046f90595bedd61fcdf75a4764453454733add0
  From: 0xc783df8a850f42e7f7e57013759c285caa701eb6
  Value: 0 ETH
  Gas used: 568851 of 2844255
  Block: #2 - Hash: 0x4847b316b12170c576999183da927c2f2056aa7d8f49f6e87430e6654a56dab0

  console.log:
    Deploying a Greeter with greeting: Hello, world!

eth_call
  Contract call: Greeter#greet
  From: 0xc783df8a850f42e7f7e57013759c285caa701eb6

  Error: VM Exception while processing transaction: revert Not feeling like it
      at Greeter.greet (contracts/Greeter.sol:14)
      at process._tickCallback (internal/process/next_tick.js:68:7)

```

当使用Hardhat Network的节点(即npx hardhat node)时,默认启用日志功能,但当在进程中使用Hardhat Network提供者时,则禁用。 参见 Hardhat Network's config 以了解更多关于如何控制日志记录。

JSON-RPC 支持的方法

支持的方法

eth_accounts
eth_blockNumber
eth_call
eth_chainId
eth_coinbase
eth_estimateGas
eth_gasPrice
eth_getBalance
eth_getBlockByHash
eth_getBlockByNumber
eth_getBlockTransactionCountByHash
eth_getBlockTransactionCountByNumber
eth_getCode
eth_getFilterChanges
eth_getFilterLogs
eth_getLogs
eth_getStorageAt
eth_getTransactionByBlockHashAndIndex
eth_getTransactionByBlockNumberAndIndex
eth_getTransactionByHash
eth_getTransactionCount
eth_getTransactionReceipt
eth_mining
eth_newBlockFilter
eth_newFilter
eth_newPendingTransactionFilter
eth_pendingTransactions
eth_sendRawTransaction
eth_sendTransaction
eth_signTypedData
eth_sign
eth_subscribe
eth_syncing
eth_uninstallFilter
eth_unsubscribe
net_listening
net_peerCount
net_version
web3_clientVersion
web3_sha3
 

猜你喜欢

转载自blog.csdn.net/2301_76642277/article/details/130725511