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

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网络是即时确认的,所以不会出现这个问题。

解决步骤

  1. 等待部署交易确认
    在部署合约后添加等待区块确认的代码,确保合约已被链上认可后再执行交互:

    console.log("Deploying contract...")
    const simpleStorage = await SimpleStorageFactory.deploy()
    // 等待1个区块确认,可根据情况调整为2-3个
    await simpleStorage.deploymentTransaction().wait(1)
    
  2. 检查合约ABI匹配性
    确保SimpleStorage合约的retrieve()函数签名与脚本调用完全一致,比如合约中函数应该是:

    function retrieve() public view returns (uint256) {
        return favoriteNumber;
    }
    

    返回类型、参数不匹配都会导致解码失败。

  3. 确认网络配置正确性
    检查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,提问作者丑熊君

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:47:13