坚固性将结构添加到数组,并在web3不能正常显示的情况下显示它

问题描述

我想将结构添加到数组中并从其他函数获取一个条目,并且它不能与web3一起使用,但是如果我将结构添加到同一函数中的数组中,web3可以正常工作并返回符合预期

pragma solidity >=0.7.0;
pragma experimental ABIEncoderV2;

contract Payback {
    struct Address {
        uint256 id;
        string name;
        address _address;
    }

    Address[] addresses;

    function addAddress() external {
        Address memory newAddress = Address(
            1,"Test",0xDEE7796E89C82C36BAdd1375076f39D69FafE252
        );
        addresses.push(newAddress);
    }

    function getAddress() external view returns (Address memory) {
        return addresses[0];
    }
}

我的测试正在工作:

it('gets Address',async () => {
    await paybackInstance.addAddress()
    let value = await paybackInstance.getAddress()
    assert.equal(value[0],"1")
    assert.equal(value[1],"Test")
    assert.equal(value[2],"0xDEE7796E89C82C36BAdd1375076f39D69FafE252")
  });

但是如果我想用web3返回它,我会得到一个错误: “处理事务时VM异常:无效的操作码”

let addresses = await contract.methods.getAddress().call()
    console.log(addresses)

我想我在存储/内存上做错了一些事,但是由于我的测试通过了,所以并没有真正理解它。

解决方法

对于web3,您似乎没有将struct添加到数组中,并尝试访问索引0处的值,该值不存在,因为数组的长度为零。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...