无法从安全帽中部署的合约中检索正确的值

问题描述 投票:0回答:1

我创建了一个简单的存储合约并使用安全帽部署它,一切正常,但有一个存储函数可以更改变量的值。执行后,当我检索值时,它没有给我更新的值,而是给我默认值。

这是我的合同

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
    //this line defines the start of a contract
    uint256 favouriteNumber = 7;
    People[] public people;

    mapping(string => uint256) public nametonum;

    struct People {
        uint256 favouriteNumber;
        string name;
    }

    function store(uint256 _favouriteNumber) public virtual {
        favouriteNumber = _favouriteNumber;
    }

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

    function addperson(string memory _name, uint256 _favouriteNumber) public {
        people.push(People(_favouriteNumber, _name)); //push function of array, creating struct without{}
        nametonum[_name] = _favouriteNumber;
    }
}

这是我的部署脚本

const { ethers, run, network } = require("hardhat")

async function main() {
    const simpleStorageFactory = await ethers.getContractFactory(
        "SimpleStorage"
    )
    console.log("Deploying... Please wait")
    const simpleStorageContract = await simpleStorageFactory.deploy()
    await simpleStorageContract.waitForDeployment()
    console.log(
        `Deployed contract to: ${(
            await simpleStorageContract.getAddress()
        ).toString()}`
    )
    if (network.config.chainId === 11155111 && process.env.ETHERSCAN_API_KEY)
        await simpleStorageContract.deploymentTransaction().wait(6)
    await verify((await simpleStorageContract.getAddress()).toString(), [])

    const currentValue = await simpleStorageContract.retrieve()
    console.log(currentValue.toString())

    const changeNumberResponse = await simpleStorageContract.store("10")
    changeNumberResponse.wait()
    const updatedValue = await simpleStorageContract.retrieve()
    console.log(updatedValue.toString())
}

async function verify(contractAddress, args) {
    console.log("Verifying Contract...")
    try {
        await run("verify:verify", {
            address: contractAddress,
            constructorArguments: args,
        })
    } catch (error) {
        if (error.message.toLowerCase().includes("already been verified")) {
            console.log("Already verified!")
        } else {
            console.error(error)
        }
    }
}

main()
    .then(() => process.exit(0))
    .catch((eroor) => {
        console.error(eroor)
        process.exit(1)
    })

更新的值在存储函数调用后没有获得更改的值 回复--

Deploying... Please wait
Deployed contract to: 0xDA63Fc7a82d1eD19b8cC301206AaFC4e56Fd9C75
Verifying Contract...
Successfully submitted source code for contract
contracts/SimpleStorage.sol:SimpleStorage at 0xDA63Fc7a82d1eD19b8cC301206AaFC4e56Fd9C75
for verification on the block explorer. Waiting for verification result...

Successfully verified contract SimpleStorage on the block explorer.
https://sepolia.etherscan.io/address/0xDA63Fc7a82d1eD19b8cC301206AaFC4e56Fd9C75#code

7
7

请帮忙!

javascript solidity hardhat
1个回答
0
投票

在当前脚本中,您正在调用changeNumberResponse.wait(),但您并不等待此操作完成。这意味着脚本不会等待交易被确认,而是立即尝试检索该值,这会导致获取旧值。

要解决此问题,您应该像这样等待 wait() 调用:

const changeNumberResponse = await simpleStorageContract.store("10");
await changeNumberResponse.wait();  // Ensure this line has 'await'
const updatedValue = await simpleStorageContract.retrieve();
console.log(updatedValue.toString());


© www.soinside.com 2019 - 2024. All rights reserved.