使用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
相关产品推荐
相关产品推荐

