Ungültiges Solidity-Typ-Tupel[]

Ich habe einen Vertrag im Ropsten-Testnetzwerk und versuche, ein Array von Strukturen zurückzugeben, aber ich erhalte die folgende Fehlermeldung in meiner JS-Konsole.

Geben Sie hier die Bildbeschreibung ein

Ich füge das Folgende oben in meinen Vertrag ein

pragma solidity ^0.4.18;
pragma experimental ABIEncoderV2;

und das ist die Funktion, die ich aufrufe

 function getAllLand() external view returns (Land[]) {
        return landRegister;
    }

Ich weiß, dass diese spezielle Funktion experimentell ist, aber haben Sie eine Idee, warum dieser Fehler ausgelöst werden könnte?

Danke

Ich habe Probleme bei der Ausführung derselben Vertragsmethode mit web3js (1.0.0-beta.36). var abi = JSON.parse('[{"constant":false,"inputs":[{"name":"s","type":"string"},{"components":[{"name": "a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"b","type":"tuple"}], "name":"foo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[ ],"name":"y","outputs":[{"name":"","type":"string"}],"payable":false,"
Es wurde festgestellt, dass die web3js-Version nicht korrekt war. Das Problem wurde mit 1.0.0-beta.36 behoben.

Antworten (2)

Der Fehler liegt im web3-Objekt, nicht in Ihrem Smart Contract. Dort ist das struct-Feature noch nicht implementiert.

Siehe https://github.com/ethereum/web3.js/issues/1241 , wo dieses Problem beschrieben wird.

Grundsätzlich können Sie also mit Solidity-Strukturen arbeiten, wenn Sie mit Ihren Vertragsfunktionen innerhalb eines Vertrags oder mit einer Bibliothek interagieren, aber nicht, um Daten von web3 an Ihren Vertrag zu übergeben oder Daten aus dem Vertrag über web3 abzurufen.

https://github.com/ethereum/web3.js/issues/1241 ist gelöst und in der Version enthalten web3.js 1.0.0-beta.36. Jetzt können Sie Solidity-Funktionen mit Strukturparametern aufrufen.

Beispiel aus der Ausgabe:

Vertrag

pragma solidity ^0.4.24;
pragma experimental ABIEncoderV2;

contract Test {

    struct Bar {
        uint a;
        uint b;
    }

    Bar public z;
    string public y;

    function foo(string s, Bar b) public {
        y = s;
    }

}

Javascript-Aufruf

contract.methods.foo("hello", [ 1, 2 ]).send({ from: '0x...' })