Devolución de estructuras en nueva versión en Solidity

He estado leyendo sobre la versión de lanzamiento de Solidity 0.4.17. https://github.com/ethereum/solidity/releases

Una de las siguientes declaraciones fue realmente interesante:

También trabajamos más en el nuevo codificador ABI: las funciones ahora pueden devolver estructuras. Enciéndelo usando pragma experimental ABIEncoderV2. Ya debería funcionar, pero aún genera un código más costoso.

He estado tratando de simular eso en Remix pero sin suerte, recibo este error:

"error": "Error al decodificar la salida: Error: tipo no admitido o no válido: tupla" Aquí está mi código:

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;
    }
}

¿Alguien ha probado esto? ¿Qué estoy haciendo mal aquí? ¡Gracias por adelantado!

Respuestas (3)

Sí, podemos devolver estructuras.

Pero solo en llamadas a funciones internas .

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
}
}

Podría valer la pena comprobar la versión del compilador de Solidity en el menú "Configuración" de Remix. El código parece estar funcionando bien en mi prueba. Entonces podría ser que el compilador no sea el último.

Cambiar la versión del compilador no ayudó. ¿Obtienes una estructura en "salida decodificada"?
Parece que mi respuesta es incorrecta. También recibí un error de decodificación cuando se expandieron los detalles. Parece que no muchos ABI admiten esto todavía. Consulte github.com/ethereum/solidity/issues/2948 . Entonces parece que al menos no funcionará con Remix (al menos por ahora)
Ok, gracias por tu respuesta! Lo intentaré con Truffle o Meteor entonces.

Con el nuevo compilador solidity esto es posible. Probablemente tendría que terminar agregando la declaración pragma para ABIEncoderV2 experimental en la parte superior del archivo de definición del contrato. Estoy usando 0.5.9 y funciona bien.

pragma solidity ^0.5.9;
pragma experimental ABIEncoderV2;