You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ethers.js调用Hardhat部署的智能合约status()函数报错求助

问题分析与解决

核心原因

你遇到的两个提示指向同一个问题:你调用的目标地址 0x5fbdb2315678afecb367f032d93f642f64180aa3 不是合约账户,只是普通外部账户。因此调用 status() 时返回空数据 0x,导致 Ethers.js 无法完成解码,抛出 BAD_DATA 错误。

解决步骤

1. 确认合约地址正确性

检查 Hardhat 部署日志里的合约地址,确保代码中的 contractAdress 和部署成功后输出的地址完全一致。部署成功时 Hardhat 会打印类似 Contract deployed to: 0x... 的日志,直接复制该地址到代码中,避免手动输入出错。

2. 验证合约是否真的部署成功

用 Hardhat 控制台直接验证目标地址是否存在合约:

npx hardhat console --network localhost

在控制台中执行:

const ContractFactory = await ethers.getContractFactory("你的合约文件名");
const contract = await ContractFactory.attach("0x5fbdb2315678afecb367f032d93f642f64180aa3");
// 尝试调用status函数
await contract.status();

如果仍报错,说明该地址无合约,需重新部署合约,确保部署过程无报错。

3. 检查本地节点状态

Hardhat 默认使用临时节点,重启节点后链上数据会被清空。如果你重启过 Hardhat 节点,需要重新部署合约并更新代码中的合约地址。

4. 确认ABI正确性

确保代码中使用的 ABI 是对应合约的正确版本。如果从 Hardhat artifacts 中获取,要确认路径正确,例如:

const abi = require("./artifacts/contracts/你的合约.sol/合约名称.json").abi;

修正后的示例代码

const fetchRocketStatus = async () => {
  try {
    const provider = new ethers.JsonRpcProvider('http://127.0.0.1:8545/');
    // 替换为部署成功后的真实合约地址
    const contractAddress = "0x正确的合约地址";
    // 替换为你的合约完整ABI
    const abi = [
      "function status() public view returns (string memory)"
      // 其他合约方法的ABI片段
    ];
    const contract = new ethers.Contract(contractAddress, abi, provider);
    const rocketStatus = await contract.status();
    console.log("Rocket Status: ", rocketStatus);
  } catch (error) {
    console.error("Error fetching rocket status: ", error);
  }
}

内容的提问来源于stack exchange,提问作者Sahil Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:43:21