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 houses
asignación:
error: Failed to decode output: Error: insufficient data for bytes32 type (arg="", coderType="bytes32", value="0x")
Sin embargo, si convierto la Garage
estructura 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 structs
se refiere.
¿Por qué funciona cuando la propiedad es una matriz y no cuando es simplemente una instancia?
¿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