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

在Goerli测试网通过Hardhat进行集成测试时无法设置合约状态变量

本地Hardhat Node测试正常,Goerli测试网设置合约状态变量失败

我在本地Hardhat Node上运行单元测试时,合约状态变量能正常设置,但在Goerli测试网执行相同测试时失败。

测试代码

const { getNamedAccounts, deployments, ethers, network } = require("hardhat")
const { developmentChains, networkConfig } = require("../../helper-hardhat-config")
const { assert, expect } = require("chai")
const fs = require("fs")
const path = require("path")

developmentChains.includes(network.name)
    ? describe.skip
    : describe("Whoopy Staging Tests", function () {
          let whoopy,
              deployer,
              player,
              cloneAddress,
              clonedContract,
              txReceipt,
              tx,
              accountConnectedClone,
              manager,
              create

          const chainId = network.config.chainId

          beforeEach(async function () {

            accounts = await ethers.getSigners()
            deployer = accounts[0]
            player = accounts[1]
            await deployments.fixture(["all"])

            const dir = path.resolve(
                __dirname,
                "/Users/boss/hardhat-smartcontract-whoopy/artifacts/contracts/Whoopy.sol/Whoopy.json"
            )

            const file = fs.readFileSync(dir, "utf8")
            const json = JSON.parse(file)
            const abi = json.abi

            whoopy = await ethers.getContract("Whoopy", deployer)
            manager = await ethers.getContract("VRFv2SubscriptionManager", deployer)
            wf = await ethers.getContract("WhoopyFactory", deployer)

            tx = await (await wf.connect(player).createClone(player.address))
            txReceipt = await tx.wait(1)


            cloneAddress = await txReceipt.events[1].args._instance
            clonedContract = new ethers.Contract(cloneAddress, abi, player)
            accountConnectedClone = clonedContract.connect(player)
        })

        describe("Whoopy Tests", function () {
            beforeEach(async function () {
                create = await accountConnectedClone.createWhoopy(
                    "Test",
                    1,
                {
                    value: ethers.utils.parseUnits("10000000000000000", "wei"),
                    gasLimit: 3000000
                })
                console.log(create)
            })
            it("creates Whoopy correctly", async function () {

                const whoopyName = await accountConnectedClone.getWhoopyName()
                const num = await accountConnectedClone.getNum()

                expect(whoopyName).to.equal("Test")
                expect(num).to.equal(1)
            })
        })

合约函数

function createWhoopy( //to be created only once 
        string memory s_whoopyName,
        uint256 s_num,
    ) public payable restricted {
        whoopyName = s_whoopyName;
        num = s_num;
}

报错信息

AssertionError: expected '' to equal 'Test'
      + expected - actual

      +Test

账户拥有足够测试ETH,Hardhat的Goerli配置正确,但测试始终失败,求指导。


排查与解决方向

  • 等待交易上链确认
    本地Hardhat Node是瞬时出块,但Goerli测试网需要等待区块打包。当前代码发送createWhoopy交易后直接读取状态,可能交易还未上链。修改代码添加等待逻辑:

    create = await accountConnectedClone.createWhoopy(
        "Test",
        1,
        {
            value: ethers.utils.parseUnits("10000000000000000", "wei"),
            gasLimit: 3000000
        })
    await create.wait() // 新增该行,确保交易被区块确认
    
  • 校验restricted修饰器权限
    确认player地址在Goerli测试网的克隆合约中满足restricted修饰器的要求。如果修饰器内部使用return而非revert,交易不会报错但状态变量不会更新。检查修饰器逻辑,确保权限验证失败时会抛出异常。

  • 通过事件名称获取克隆地址
    代码中依赖txReceipt.events[1]获取克隆地址,不同链上的事件索引可能因合约日志输出差异变化。改用事件名称过滤更可靠:

    const cloneEvent = txReceipt.events.find(evt => evt.event === "CloneCreated") // 替换为实际事件名
    cloneAddress = cloneEvent.args._instance
    
  • 检查克隆合约初始化逻辑
    确认WhoopyFactory的createClone函数正确初始化了克隆合约的权限状态,比如将restricted修饰器依赖的地址设置为player。本地测试可能因环境默认值满足条件,但测试网中初始化逻辑可能未正确执行。

  • 查看链上交易详情
    在Goerli Etherscan搜索createWhoopy交易的哈希,检查交易状态、gas消耗、输入参数是否正确。若交易失败,Etherscan会显示具体失败原因,直接定位问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:42:51