Hardhat部署Sepolia网络时retrieve()出现BAD_DATA解码错误求助
部署Hardhat合约到Sepolia测试网时调用
retrieve()出现BAD_DATA错误 问题描述
我用Hardhat编写的合约部署脚本在本地Hardhat网络运行完全正常,但部署到Sepolia测试网时,执行第20行const currentValue = await simpleStorage.retrieve()时触发错误,错误信息显示Error: could not decode result data (value="0x", info={ "method": "retrieve", "signature": "retrieve()" }, code=BAD_DATA, version=6.11.1),完整错误栈见下文。
部署脚本代码
const { ethers, run, network } = require("hardhat") require("dotenv").config() async function main() { const SimpleStorageFactory = await ethers.getContractFactory( "SimpleStorage" ) console.log("Deploying contract...") const simpleStorage = await SimpleStorageFactory.deploy() const simpleStoragetrans = await SimpleStorageFactory.getDeployTransaction() console.log("simpleStorage:sss:", simpleStorage) console.log("simpleStoragetrans:sss:", simpleStoragetrans) const contractAddress = await simpleStorage.getAddress() console.log("contractAddress:sss:", contractAddress) console.log("network.name:sss", network.name) if (network.name == "sepolia" && process.env.ETHERSCAN_API_KEY) { // await verify(contractAddress, []) } const currentValue = await simpleStorage.retrieve() const sendValue = ethers.parseEther("800") //updatevalue await simpleStorage.store(sendValue) const newValue = await simpleStorage.retrieve() console.log(newValue) } async function verify(contractAddress, args) { console.log("verify Contract") // npx hardhat verify --network sepolia 0xxxxxxxxx8EbEf80F0008c16b0ABFc4D6a try { await hre.run("verify:verify", { address: contractAddress, constructorArguments: args, }) } catch (error) { console.log("Contract verify error:", error) } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error) process.exit(1) })
错误详情
Error: could not decode result data (value="0x", info={ "method": "retrieve", "signature": "retrieve()" }, code=BAD_DATA, version=6.11.1) at makeError (/Users/daiwenxiong/BEAR_FILE/PROJECT/WEB3_PROJECT/LEARN_CHAINLINK_HARDHAT/node_modules/ethers/src.ts/utils/errors.ts:694:21) at assert (/Users/daiwenxiong/BEAR_FILE/PROJECT/WEB3_PROJECT/LEARN_CHAINLINK_HARDHAT/node_modules/ethers/src.ts/utils/errors.ts:715:25) at Interface.decodeFunctionResult (/Users/daiwenxiong/BEAR_FILE/PROJECT/WEB3_PROJECT/LEARN_CHAINLINK_HARDHAT/node_modules/ethers/src.ts/abi/interface.ts:916:15) at staticCallResult (/Users/daiwenxiong/BEAR_FILE/PROJECT/WEB3_PROJECT/LEARN_CHAINLINK_HARDHAT/node_modules/ethers/src.ts/contract/contract.ts:346:35) at processTicksAndRejections (node:internal/process/task_queues:95:5) at staticCall (/Users/daiwenxiong/BEAR_FILE/PROJECT/WEB3_PROJECT/LEARN_CHAINLINK_HARDHAT/node_modules/ethers/src.ts/contract/contract.ts:303:24) at Proxy.retrieve (/Users/daiwenxiong/BEAR_FILE/PROJECT/WEB3_PROJECT/LEARN_CHAINLINK_HARDHAT/node_modules/ethers/src.ts/contract/contract.ts:351:41) at main (/Users/daiwenxiong/BEAR_FILE/PROJECT/WEB3_PROJECT/LEARN_CHAINLINK_HARDHAT/scripts/deploy.js:20:26) { code: 'BAD_DATA', value: '0x', info: { method: 'retrieve', signature: 'retrieve()' }, shortMessage: 'could not decode result data' }
问题原因与解决方法
核心原因
Sepolia这类公共测试网的交易需要等待区块确认后才能生效,你当前的代码在部署合约后立即调用retrieve(),此时部署交易还没被链上确认,导致调用返回空数据0x,无法通过ABI解码,触发BAD_DATA错误。本地Hardhat网络是即时确认的,所以不会出现这个问题。
解决步骤
等待部署交易确认
在部署合约后添加等待区块确认的代码,确保合约已被链上认可后再执行交互:console.log("Deploying contract...") const simpleStorage = await SimpleStorageFactory.deploy() // 等待1个区块确认,可根据情况调整为2-3个 await simpleStorage.deploymentTransaction().wait(1)检查合约ABI匹配性
确保SimpleStorage合约的retrieve()函数签名与脚本调用完全一致,比如合约中函数应该是:function retrieve() public view returns (uint256) { return favoriteNumber; }返回类型、参数不匹配都会导致解码失败。
确认网络配置正确性
检查hardhat.config.js中Sepolia网络的RPC URL、私钥配置是否有效,确保网络连接正常。
修改后的完整脚本示例
const { ethers, run, network } = require("hardhat") require("dotenv").config() async function main() { const SimpleStorageFactory = await ethers.getContractFactory("SimpleStorage") console.log("Deploying contract...") const simpleStorage = await SimpleStorageFactory.deploy() // 等待部署交易确认 await simpleStorage.deploymentTransaction().wait(1) const contractAddress = await simpleStorage.getAddress() console.log("Contract deployed to:", contractAddress) console.log("Network:", network.name) if (network.name == "sepolia" && process.env.ETHERSCAN_API_KEY) { // 验证前多等几个区块,确保链上数据同步 await simpleStorage.deploymentTransaction().wait(5) await verify(contractAddress, []) } const currentValue = await simpleStorage.retrieve() console.log("Current value:", currentValue.toString()) const sendValue = ethers.parseEther("800") await simpleStorage.store(sendValue) const newValue = await simpleStorage.retrieve() console.log("New value:", newValue.toString()) } async function verify(contractAddress, args) { console.log("Verifying contract...") try { await run("verify:verify", { address: contractAddress, constructorArguments: args, }) console.log("Contract verified successfully!") } catch (error) { if (error.message.includes("already verified")) { console.log("Contract is already verified.") } else { console.log("Verification error:", error) } } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error) process.exit(1) })
内容的提问来源于stack exchange,提问作者丑熊君
相关产品推荐
相关产品推荐

