¿Cómo acceder a la matriz dentro de una estructura dentro de una matriz?

Tengo una matriz pública de estructuras. Cada estructura tiene una matriz de longitud fija dentro de ella. ¿Cómo hago para acceder al miembro de matriz de una estructura específica a través de web3? El contrato se está compilando, pero cuando uso la función getter de la matriz pública, deja fuera al miembro de la matriz.

Solidez:

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

web3:

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

Respuestas (1)

Una forma de resolver esto es crear una función captadora personalizada para exponer la matriz dentro de la estructura.

Solidez:

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

web3:

let bs = await foo.getBarBs(0);
assert.equal(bs, [1, 1, 2, 3, 5]); // succeeds!