Zurückgeben von Strukturen in der neuen Version in Solidity

Ich habe über Solidity Release Version 0.4.17 gelesen. https://github.com/ethereum/solidity/releases

Eine der folgenden Aussagen war wirklich interessant:

Wir haben auch weiter am neuen ABI-Encoder gearbeitet: Funktionen können jetzt Structs zurückgeben. Schalten Sie es mit dem Pragma Experimental ABIEncoderV2 ein. Es sollte bereits funktionieren, generiert aber immer noch teureren Code.

Ich habe versucht, das in Remix zu simulieren, aber ohne Glück erhalte ich diesen Fehler:

"error": "Ausgabe konnte nicht dekodiert werden: Fehler: Nicht unterstützter oder ungültiger Typ: Tupel" Hier ist mein Code:

pragma solidity ^0.4.17;
pragma experimental ABIEncoderV2;
contract StructTest{
    struct someTestStruct {
        uint A;
        uint B;
        bytes32 C;
    }
    someTestStruct str;
    function StructTest(){
        str = someTestStruct({A: 5, B: 6, C: "Hi"});
    }
    // trying to get struct but getting "error": "Failed to decode output: Error: Unsupported or invalid type: tuple"
    function returnStruct() returns (someTestStruct){
        return str;
    }
}

Hat jemand das versucht? Was mache ich hier falsch? Danke im Voraus!

Antworten (3)

Ja, wir können Strukturen zurückgeben.

Aber nur bei internen Funktionsaufrufen .

pragma solidity ^0.4.19;

contract tester{

struct Person
{
    string name;
    uint age;
}

function getSome() public returns (Person a)
{
    Person memory p;
    p.name = "kashish";
    p.age =20;
    return p;
}

function wantSome() public returns (string,uint)
{
     Person memory p2 =getSome();
     return (p2.name,p2.age); // return multiple values like this
}
}

Es könnte sich lohnen, die Solidity-Compiler-Version im Menü "Einstellungen" von Remix zu überprüfen. Der Code scheint in meinem Test OK zu sein. Es könnte also sein, dass der Compiler nicht der neuste ist.

Das Ändern der Compiler-Version hat nicht geholfen. Bekommst du eine Struktur in "dekodierter Ausgabe".?
Anscheinend ist meine Antwort falsch. Ich habe auch einen Dekodierungsfehler erhalten, wenn die Details erweitert wurden. Es scheint, dass dies noch nicht viele ABIs unterstützen. Siehe github.com/ethereum/solidity/issues/2948 . Also scheint es zumindest nicht mit Remix zu funktionieren (zumindest vorerst)
Okay, danke für deine Antwort! Ich werde es dann mit Trüffel oder Meteor versuchen.

Mit dem neuen Solidity-Compiler ist dies möglich. Wahrscheinlich müssten Sie die Pragma-Deklaration für experimentellen ABIEncoderV2 am Anfang der Vertragsdefinitionsdatei hinzufügen. Ich verwende 0.5.9 und funktioniert gut.

pragma solidity ^0.5.9;
pragma experimental ABIEncoderV2;