抛出新错误'返回值无效,它是否耗尽了气体?

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

我收到这个错误:

错误:返回值无效,是不是没油了? 如果您没有为从中检索数据的合约使用正确的 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
6个回答
2
投票

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

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

1
投票

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

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


1
投票

我也遇到了这个错误。为了修复它,我使用了

truffle develop --log
,然后打开一个新的终端窗口并通过运行
truffle develop
连接到当前会话。


0
投票

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

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


  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)

0
投票

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

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

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


0
投票

这个错误最有可能出现在两种情况下:-

  1. 检查您是否使用了正确的地址和合同地址。
  2. 检查您是否连接到同一网络。
© www.soinside.com 2019 - 2024. All rights reserved.