我正在使用Hardhat框架来测试我的智能合约。我还在使用React和NextJS开发一个前端应用程序。
我目前正在本地机器中分叉多边形测试网,并使用它来部署我的合同。然而,我希望我的前端与分叉测试网中的智能合约进行交互,而不是真正的实时测试网。
为了分叉测试网,我在hardhat.config.js
:中有这个
networks: {
hardhat: {
forking: {
url: "https://polygon-mumbai.g.alchemy.com/v2/xxxxxxxxxxxxxxxxxxxxxxxxx",
blockNumber: 27270000
}
}
},
我在前端设置了web3,如下所示:
if (typeof window !== "undefined" && typeof window.ethereum !== "undefined") {
// We are in the browser and metamask is running.
window.ethereum.request({ method: "eth_requestAccounts" });
web3 = new Web3(window.ethereum);
} else {
// We are on the server *OR* the user is not running metamask
const provider = new Web3.providers.HttpProvider(
"https://polygon-mumbai.g.alchemy.com/v2/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
);
web3 = new Web3(provider);
}
我可以在分叉网络中成功部署我的合同。
到目前为止,运行npm next dev
允许我的前端与实时测试网上的智能合约进行交互,这不是我想要的。如何更改我的开发环境以与分叉网络进行交互?
当您启动本地安全帽节点npx hardhat node
时,您将看到一条消息,如:Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/
然后,只需将您的钱包或应用程序连接到http://127.0.0.1:8545.
使用安全帽分叉意味着
您可以启动一个分叉主网的Hardhat Network实例。这意味着它将模拟与主网具有相同的状态,但它将作为本地开发网络工作。
因此,根据您的配置,您需要启动本地安全帽节点(查看如何(:
$ npx hardhat node
Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/
此本地URL(RPC URL(是您需要指向钱包的位置。
MetaMask
特别是对于安全帽,请确保将chainId: 1337
添加到hardhat.config.js
中(请参阅元任务链ID问题(:
module.exports = {
solidity: "0.8.17",
networks: {
hardhat: {
chainId: 1337,
forking: {
url: "https://polygon-mumbai.g.alchemy.com/v2/xxxxxxxxxxxxxxxxxxxxxxxxx",
blockNumber: 27270000,
},
},
},
};
然后在本地运行分叉节点后,您应该能够通过将本地网络添加到MetaMask钱包来进行连接。
请参阅如何添加自定义网络RPC:
- 单击顶部的"网络"下拉列表
- 选择添加网络
- 网络名称可以是您想要的任何名称(Hardhat(
- 为RPC URL输入
http://127.0.0.1:8545
- 输入
1337
作为链ID - 由于您在多边形上,请输入
MATIC
作为"货币符号"> - 点击保存并确保已切换到本地网络
注意:
要设置web3js
对象并连接到本地节点(通过WebSocket(,您应该能够调用:
const web3 = new Web3(Web3.givenProvider || "ws://localhost:8545")
要在Next.js应用程序中检测MetaMask钱包,我建议使用@MetaMask/detect provider包。
为了与区块链交互,我建议在web3.js
上使用ethers.js(请参阅以太坊StackExchange上的讨论(。它还有更好的工具,特别是hardhat
。