Web3.js 视图方法 call() 错误,因为返回值无效,是不是耗尽了气体

Posted

技术标签:

【中文标题】Web3.js 视图方法 call() 错误,因为返回值无效,是不是耗尽了气体【英文标题】:Web3.js view method call() errors out as Returned values aren't valid, did it run out of gasWeb3.js 视图方法 call() 错误,因为返回值无效,是否耗尽了气体 【发布时间】:2020-02-10 23:32:05 【问题描述】:

我正在尝试调用我的合约的视图方法,该方法在内部调用另一个合约的视图方法。

合同:

//In Contract A (imports Contract B)
function getContractData() public view returns(string memory data)
  ContractB instance = ContractB(<address where ContractB is available>));
  return instance.getData();


//In Contract B
function getData() public view returns(string memory data)
  return "Hello";

JS:

//Calling function
instance = await new web3.eth.Contract(JSON.parse(<ContractA ABI>, <ContractA Address>);
console.log(await instance.methods.getContractData().call());

我的方法在 Remix 浏览器中按预期工作,但是当使用 Web3 在 geth 上的网络上运行时,我收到错误 Returned Values are not valid, 难道它用尽了 Gas?

我发现了一些更改 web3 版本的解决方案,它们对我不起作用,我尝试添加 from 帐户和 gas,即使它对视图方法没有意义,但没有任何效果。

我似乎在哪里出错了?

【问题讨论】:

作为附加信息,不引用另一个方法实例的视图方法按预期工作。如果我试图引用另一个合约的实例,是否意味着它现在需要 gas? 我猜instance 没有正确声明。缺少)。如果ContractA ABI 已经在 J​​SON 中,那么您不必解析它。 这是我在这里犯的一个错误。该实例确实已正确声明,我通过调用仅从 ContractA 返回消息的视图方法确保了这一点。 代码在我这边运行良好,智能合约也可以在 remix 上运行。你的 web3 版本是什么,我的是 "web3": "^1.2.1"。我正在使用solidity版本0.5.1 你试过 ethers.js 吗?它有效吗? github.com/ethers-io/ethers.js 【参考方案1】:

在 Github 上查看 the issue。此类错误可能是由 solc 编译器引起的,升级有助于解决。

【讨论】:

以上是关于Web3.js 视图方法 call() 错误,因为返回值无效,是不是耗尽了气体的主要内容,如果未能解决你的问题,请参考以下文章

web3.js查询方法的调用方式汇总

如何检测 web3.js 中的错误

web3.js 有 TypeScript 类型定义吗?

使用 web3.js 获取钱包地址拥有的所有 NFT

javascript web3.js 库错误

jquery ajax get call 上的 django 视图呈现的错误 html 模板