Lectura de estructuras anidadas

Tengo este fragmento de código dentro de un contrato:

struct Brick {
    uint256 length;
    uint256 width;
    uint256 height;
}

struct Garage {
    uint256 length;
    uint256 width;
    uint256 height;
}

struct House {
    Brick[] bricks;
    Garage garage;
    bytes32 street;
    bytes32 city;
}

mapping(uint256 => House) public houses;

Sin configurar pragma experimental ABIEncoderV2, aparece el siguiente error cuando intento leer cualquier valor de la housesasignación:

error: Failed to decode output: Error: insufficient data for bytes32 type (arg="", coderType="bytes32", value="0x")

Sin embargo, si convierto la Garageestructura en una matriz, todo está bien:

0: bytes32: street 0x0000000000000000000000000000000000000000000000000000000000000000
1: bytes32: city 0x0000000000000000000000000000000000000000000000000000000000000000

Esta no es una pregunta sobre el ABIEncoderV2. Sé que cuando eso llegue, tendremos mucha más flexibilidad en lo que a eso structsse refiere.

¿Por qué funciona cuando la propiedad es una matriz y no cuando es simplemente una instancia?

Respuestas (1)

¿Por qué funciona cuando la propiedad es una matriz y no cuando es simplemente una instancia?

Funciona, porque las matrices dinámicas se manejan de manera muy similar a las asignaciones. La longitud se almacena en la posición del campo, pero el índice se maneja como un mapeo. Esa es también la razón por la que no lo verá como parte de su estructura de devolución (aunque esperaba ver al menos la longitud devuelta).

Para obtener más información, consulte https://solidity.readthedocs.io/en/develop/miscellaneous.html#layout-of-state-variables-in-storage