问题描述
我想将结构添加到数组中并从其他函数获取第一个条目,并且它不能与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处的值,该值不存在,因为数组的长度为零。