Hardhat连接localhost报HH108、ECONNREFUSED错误问题问询
Hardhat localhost网络连接被拒绝(HH108、ECONNREFUSED 127.0.0.1:8545)修复方案
问题根因
操作时混淆了Hardhat两个完全独立的网络环境,二者数据、运行逻辑完全不互通:
- 执行
npx hardhat run xxx --network hardhat时调用的是Hardhat内置的临时内存测试网络:这个网络仅在单条命令执行周期内存在,命令运行结束就会直接销毁,所有部署的合约、链上数据全部清空,且默认不会对外监听8545端口。 - 执行带
--network localhost参数的命令时,Hardhat会默认通过HTTP请求连接127.0.0.1:8545端口的本地持久化节点,未提前启动这个节点就会触发端口连接拒绝的报错。
修复步骤
按顺序操作即可解决:
- 启动本地Hardhat节点
新开一个独立的终端窗口,进入twitter项目根目录,执行命令:
命令执行后会保持运行状态,默认监听8545端口,同时会输出10个预置了10000测试ETH的测试账户地址和私钥,操作全程不要关闭这个终端。npx hardhat node - 重新部署合约到本地节点
再新开第二个终端窗口,进入同一个项目目录,执行部署命令,这次指定网络为localhost:
部署成功后终端会输出新的合约地址,复制留存即可。npx hardhat run scripts/deploy.js --network localhost - 连接控制台调用合约
在第二个终端(或新开的第三个终端,只要不关闭运行node的第一个终端即可)执行控制台启动命令:
进入控制台后,用第二步拿到的新合约地址执行实例化代码即可正常运行:npx hardhat console --network localhostconst contract = await ethers.getContractAt("Decentratwitter","第二步复制的新部署地址")
常见踩坑排查
如果按上面步骤操作还是报错,逐一检查以下配置:
- 检查
hardhat.config.js中localhost网络的配置,默认配置如下,确认端口和chainId和启动节点时的输出一致(本地节点默认chainId为31337,默认端口8545):module.exports = { networks: { localhost: { url: "http://127.0.0.1:8545", chainId: 31337 } } } - 如果启动节点时提示8545端口被占用,要么杀掉占用8545端口的其他进程,要么启动节点时指定其他端口,比如
npx hardhat node --port 8546,同时把配置文件里localhost的url端口改成对应端口即可。 - 不要在临时内存网络(
--network hardhat)部署合约后,尝试在localhost网络读取合约数据,两个环境完全隔离,数据不会同步。
内容的提问来源于stack exchange,提问作者Avinash kumar Mahato
相关产品推荐
相关产品推荐

