Как получить доступ к массиву внутри структуры внутри массива?

У меня есть публичный массив структур. Внутри каждой структуры находится массив фиксированной длины. Как мне получить доступ к члену массива определенной структуры через 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

Ответы (1)

Один из способов решить эту проблему — создать пользовательскую функцию получения для предоставления массива внутри структуры.

Прочность:

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!