您现在的位置是:首页 >其他 >Hardhat内置区块链节点网站首页其他
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