Lesen von verschachtelten Strukturen

Ich habe dieses Code-Snippet in einem Vertrag:

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;

Ohne Einstellung pragma experimental ABIEncoderV2erhalte ich die folgende Fehlermeldung, wenn ich versuche, einen Wert aus dem housesMapping zu lesen:

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

Wenn ich die GarageStruktur jedoch zu einem Array mache, ist alles in Ordnung:

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

Es geht hier nicht um die ABIEncoderV2. Ich weiß, dass wir dann viel flexibler sein structswerden, was das betrifft.

Warum funktioniert es, wenn die Eigenschaft ein Array ist und nicht, wenn es sich nur um eine Instanz handelt?

Antworten (1)

Warum funktioniert es, wenn die Eigenschaft ein Array ist und nicht, wenn es sich nur um eine Instanz handelt?

Es funktioniert, weil dynamische Arrays sehr ähnlich wie Mappings gehandhabt werden. Die Länge wird an der Position des Feldes gespeichert, aber Index wird wie eine Zuordnung behandelt. Das ist auch der Grund, warum Sie es nicht als Teil Ihrer Rückgabestruktur sehen werden (obwohl ich erwartet hatte, zumindest die zurückgegebene Länge zu sehen).

Einzelheiten finden Sie unter https://solidity.readthedocs.io/en/develop/miscellaneous.html#layout-of-state-variables-in-storage