Solidity-Einheitentests für Verträge mit einem dynamischen Array-Rückgabetyp

Ich schreibe einen einfachen Smart Contract, um ein Array von Bytes32 zu speichern, darauf zu pushen und es abzurufen:

contract SimpleStorage {
    bytes32[] public items;

    event ItemAdded(bytes32 contents);

    function addItem(bytes32 contents) public returns(bool) {
        items.push(contents);
        emit ItemAdded(contents);
        return true;
    }

    function getAllItems() public constant returns(bytes32[]) {
        return items;
    }
}

Dies lässt sich gut kompilieren, aber wenn ich versuche, einen Solidity-Test für diesen Vertrag zu schreiben, kann ich das Ergebnis von nicht speichern getAllItems.

Betreffende Zeile:

bytes32[] result = simpleStorage.getAllItems();

Der Fehler, den ich bekomme, ist:Type inaccessible dynamic type is not implicitly convertible to expected type bytes32[] storage pointer.

Aus diesem Github-Problem sehe ich, dass es bekannt ist (und in Ethereum 2.0 behoben werden soll), dass wir derzeit einfach keine Funktionen aufrufen können, die dynamische Arrays aus einem anderen Vertrag zurückgeben. Wir können diese Funktionen jedoch von der ABI aus nutzen.

Bedeutet dies, dass es derzeit im Wesentlichen unmöglich ist, Solidity-Tests für diese Art von Funktionen zu schreiben (da die Unit-Tests selbst Verträge sind)? Ist jemand anderes auf dieses Problem gestoßen und hat einen Weg gefunden, es zu umgehen?

Ich weiß, dass ich beim Schreiben von JS-Tests bleiben kann, aber ich bin neugierig, ob es eine Möglichkeit gibt, diese Art von Verträgen mit Solidity zu testen.

Antworten (1)

Welche Version des Solidity-Compilers verwenden Sie? Ich kann deinen Fehler nicht reproduzieren.

Bei der letzten Version von solc (0.4.24) müssen Sie jedoch das memorySchlüsselwort hinzufügen, da standardmäßig ein bytes32 [] im Speicher gespeichert wird und Sie dem Speicher keinen dynamischen Größentyp zuweisen können.

bytes32[] memory result = simpleStorage.getAllItems();
Danke! Es stellte sich heraus, dass ich die von Truffle verwendete Solc-Version nicht aktualisiert hatte.