【问题标题】:throw new Error 'Returned values aren't valid, did it run Out of Gas?throw new Error '返回的值无效,它是否用尽了 Gas?
【发布时间】:2022-07-16 02:32:18
【问题描述】:

我收到此错误:

错误:返回的值无效,它是否用尽了 Gas? 如果您没有为从中检索数据的合约使用正确的 ABI、从不存在的块号请求数据或查询未完全同步的节点,您也可能会看到此错误。

const Web3 = require("web3");
const MyContract = require("./build/contracts/MyContract.json");

const init = async () => {
  const web3 = new Web3("http://127.0.0.1:9545");

  const id = await web3.eth.net.getId();
  const deployedNetwork = MyContract.networks[id];
  const contract = new web3.eth.Contract(
    MyContract.abi,
    deployedNetwork.address
  );

  const addresses = await web3.eth.getAccounts();
   await contract.methods.setData(10).send({
      from: addresses[0]   
  });

  const data = await contract.methods.getData().call();
  console.log(data)
};

init();

【问题讨论】:

  • 在元掩码上,确保您连接到正确的网络

标签: solidity web3js


【解决方案1】:

可能有很多原因,但有两个最常见的原因。

  1. 如果您使用的是 abi 并且合约地址正确,则非常好。
  2. 如果您选择了正确的网络,例如,如果您的合约在 Rinkeby 上,您可以选择 Rinkeby,或者如果您的合约在 Mainnet 上,请选择 Mainnet。

【讨论】:

    【解决方案2】:

    原因可能是网络。如果你的 abi 属于主网上的合约,那么你的提供者必须是主网,如果它属于某个测试网,那么你必须使用相应的测试网提供者。

    这就是我解决问题的方法。

    【讨论】:

      【解决方案3】:

      您正在调用“发送”函数,该函数需要一个具有足够余额的“发件人”地址。

      所以,你应该确保:(我复制了你的代码)

      
        const addresses = await web3.eth.getAccounts();
         await contract.methods.setData(10).send({
            // MAKE SURE this account has enough balance
            from: addresses[0]     
        });
      

      另外,你通过“call()”调用了“getData()”方法, 如果此操作是在您的 Hardhat 环境中执行的, 我建议您切换到真正的测试网络,例如林克比

        const data = await contract.methods.getData().call();
        console.log(data)
      

      【讨论】:

        【解决方案4】:

        我弄错了...我使用的是“账户地址”,而不是“合约地址”!

        一旦使用了正确的“合约地址”,代码就可以工作。

        在remix ide中,从这里复制联系地址

        【讨论】:

          猜你喜欢
          • 2021-10-15
          • 2019-03-28
          • 2018-03-16
          • 2020-08-03
          • 2020-02-25
          • 2018-02-27
          • 1970-01-01
          • 2012-02-27
          相关资源
          最近更新 更多