El método de llamada para devolver la cadena almacenada da como resultado un error: el valor devuelto no es una cadena convertible

Estoy probando un contrato muy simple en la red de prueba de Rinkeby. Bastante tan simple como se pone:

pragma solidity ^0.4.17;

contract Root {
    string rootHash;

    function set(string x) public {
        rootHash = x;
    }

    function get() public constant returns (string x) {
        return rootHash;
    }

}

Almacena un multihash ipfs y permite recuperarlo.

La parte de escritura parece funcionar, usando este código: https://gist.github.com/pwrstudio/6c95043ae3bb6a9aef9734a3fc8469e7

Puedo ver que el multihash se envía al contrato, codificado como hexadecimal: https://rinkeby.etherscan.io/tx/0x4d7b98cf577d580168d24b1f61bcbc60f3f919c751624793e83dd10191ebba98

Pero al llamar a la getfunción me sale este error:

ERROR: The returned value is not a convertible string

Código js relevante:

return new Promise((resolve, reject) => {
  const rootContract = new web3.eth.Contract(abi, CONTRACT_ADDRESS)
  rootContract.methods
    .get()
    .call()
    .then(res => console.log(res))
    .catch(e => console.log(e))
})

¡Cualquier sugerencia sobre lo que estoy haciendo mal es muy apreciada!

Respuestas (1)

Hay un pequeño error tipográfico en la definición de función get. Debe definir solo el tipo de valor devuelto stringen la definición de la función, pero no el nombre de la variable ( x). Esto debería hacer que funcione:

function get() public constant returns (string) {
    return rootHash;
}
¡Muchas gracias! Eso lo hizo. (Resultó que también había especificado un límite de gas bajo para la llamada de función establecida, lo que provocó que fallara, pero con esos dos problemas solucionados, todo funciona).