У меня есть публичный массив структур. Внутри каждой структуры находится массив фиксированной длины. Как мне получить доступ к члену массива определенной структуры через web3? Контракт компилируется, но когда я использую функцию получения общедоступного массива, он пропускает член массива.
Прочность:
pragma solidity ^0.4.21;
contract Foo {
struct Bar {
bytes32 a;
uint8[9] b;
}
Bar[] public bars;
function add(bytes32 _a, uint8[9] _b) public {
bars.push(Bar(_a, _b));
}
}
веб3:
let foo = await Foo.new();
await foo.add("banana", [1, 1, 2, 3, 5]);
let bar = await foo.bars(0);
assert.equal(foo[0], "banana");
assert.equal(foo[1], [1, 1, 2, 3, 5]); // fails, returns undefined
Один из способов решить эту проблему — создать пользовательскую функцию получения для предоставления массива внутри структуры.
Прочность:
pragma solidity ^0.4.21;
contract Foo {
struct Bar {
bytes32 a;
uint8[9] b;
}
Bar[] public bars;
function add(bytes32 _a, uint8[9] _b) public {
bars.push(Bar(_a, _b));
}
function getBarBs(uint256 _index) public returns (uint8[9]) {
return bars[_index].b;
}
}
веб3:
let bs = await foo.getBarBs(0);
assert.equal(bs, [1, 1, 2, 3, 5]); // succeeds!