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
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!