我有一份这样的合同:
contract Test
{
uint256 public delay;
uint256[] public timings;
}
现在我从 web3.js 与这样的合约进行交互
const contract = new Web3(window.ethereum).eth.Contract(ABI, address)
// works fine
const deley = await contract.methods.delay().call()
// fails with 'reverted' error
const deley = await contract.methods.timings(0).call()
如您所见,得到 2 个不同的结果。当我访问常规属性时,该值会正确返回,但是当我尝试访问数组时,我只会收到“已还原”错误:
{code: -32000, message: "execution reverted"}
知道如何从简单的 js 前端应用程序访问数组吗?
请注意,当我通过 truffle exec 执行以下构造时,它可以正常工作:
const contract = await Test.at(address);
const first = await contract.timings(0);
这让我更困惑!
答案 0 :(得分:0)
// fails with 'reverted' error
const deley = await contract.methods.timings(0).call()
您的代码段中的 timings
是一个 空 数组,它没有索引为 0 的项目。因此,当您从 web3 调用尝试访问(不存在的)索引 0,这是一个无效的调用。
const contract = await Test.at(address);
const first = await contract.timings(0);
Truffle 行为不同,对于调用(不是事务)忽略动态大小的数组(或映射)长度。然后在存储中查找值,因为该值没有设置,它总是(几乎总是,有一些边缘情况)0。