web3.js 如何访问合约数组属性

时间:2021-05-01 11:26:46

标签: solidity web3 web3js

我有一份这样的合同:

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);

这让我更困惑!

1 个答案:

答案 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。