Decodificación de la salida del contrato de la llamada web3 eth

He escrito datos en un contrato usando sendRawTransaction y estoy tratando de obtenerlos usando web3.eth.call para la función:
function checkRecord(uint id, bytes email) constant returns (uint id2, bytes email2, bytes hash) {..}

I create call data as
var callData = contract.checkRecord.getData(id, email)
to get
'0xf1e8a43c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000156d617467656f2e3230303840676d61696c2e636f6d0000000000000000000000'

y obtenga el resultado como
resultado = web3.eth.call({'a': dirección, 'de': cuenta, 'datos': callData})

where result is
'0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000156d617467656f2e3230303840676d61696c2e636f6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000'

¿Cómo decodifico el resultado de nuevo a (uint, bytes, bytes)?

Respuestas (3)

puede usar la funcionalidad integrada de web3:

web3.eth.abi.decodeParameters(typesArray, hexString);

ver enlace

La forma más fácil es usar " abi-decoder ". Bifurqué el repositorio y creé index.html para facilitar su uso.

Puede descargarlo y usarlo desde: https://github.com/Muhammad-Altabba/abi-decoder (más tarde puede consultarlo en https://github.com/ConsenSys/abi-decoder una vez que acepten mi solicitud de extracción )

Para descargar y ejecutar usando NPM:

npm install abi-decoder
bower install abi-decoder

Luego descargue https://github.com/Muhammad-Altabba/abi-decoder/index.html en el mismo directorio. Luego abra el archivo "index.html" en el navegador.

Conseguirás:

abi-decodificador index.html

Como señala la documentación de web3, web3.eth.call devuelve un String, que son los datos devueltos de la llamada, por ejemplo, un valor de retorno de funciones de códigos. En su caso, la cadena de resultados contiene un uint(que es un alias para uint256) y dos matrices de bytes de tamaño dinámico.

Divida el resultado en fragmentos de 32 bytes y luego aplique una toAscii(hexString)función en los fragmentos.

Con este método obtendrás que uintes el número 2 rellenado con ceros, se ve así: 0x0000000000000000000000000000000000000000000000000000000000000002. La primera matriz de bytes es {96,160,21,matgeo.2008@gmail.com}. La segunda matriz de bytes contiene solo ceros.

toAsciies obsoleto. Usar hexToAsciien web3 v1.web3.utils.hexToAscii(0x....)