Análisis de la salida del método de contrato como una matriz de campos

Tengo un método constante en un contrato inteligente que devuelve esta matriz:

(uint256 _field1, uint256 _field2, uint256 _field3, address _field4, string _field5)

Al invocarlo obtuve este resultado hexadecimal:

0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058581b50000000000000000000000000f28dafbfeb41bf32869c9d498da0d651d0206ed400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000414869204a75616e2c2074686973206973206d61726b65747061792073656e64696e6720666972737420626c6f636b636861696e2065766572206d6573736167652100000000000000000000000000000000000000000000000000000000000000

¿Cómo puedo analizarlo? ¿Cómo puedo saber el relleno exacto para cada campo? ¡Gracias!

Respuestas (2)

Si desea hacerlo en NodeJs, puede crear un archivo llamado decodeParams.jsy que contiene:

#!/usr/bin/nodejs

const Web3 = requerir("web3");
const web3 = nuevo Web3();
const Coder = require("./node_modules/web3/lib/solidity/coder.js");

var resultado = Coder.decodeParams(
    [ "uint256", "uint256", "uint256", "dirección", "cadena" ],
    "000000000000000000000000000000000000000000000000000000000000000001" + // Dividir para legibilidad personal
    "0000000000000000000000000000000000000000000000000000000000000000" +
    "00000000000000000000000000000000000000000000000000000000058581b50" +
    "0000000000000000000000000000000f28dafbfeb41bf32869c9d498da0d651d0206ed4" +
    "00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000414869204a75616e2c2074686973206973206d61726b65747061792073656e64696e6720666972737420626c6f636b636861696e2065766572206d6573736167652100000000000000000000000000000000000000000000000000000000000000");

consola.log("0x" + resultado[0].toString(16));
consola.log("0x" + resultado[1].toString(16));
consola.log("0x" + resultado[2].toString(16));
consola.log("0x" + resultado[3]);
consola.log(web3.toUtf8(resultado[4]));

Entonces para hacer que esto funcione:

$ npm instalar web3
$ chmod u+x decodeParams.js
$ ./decodeParams.js
0x1
0x0
0x58581b50
0x0xf28dafbfeb41bf32869c9d498da0d651d0206ed4
...

Bueno, yo mismo encontré la respuesta... solo una yuxtaposición de campos como este, en código PHP:

list($_field1, $_field2, $_field3, $_zeros, $_field4, $_field5) = sscanf($output, "0x%64s%64s%64s%24s%40s%s");
$_field1 = hexdec($_field1);
$_field2 = hexdec($_field2);
$_field3 = hexdec($_field3);
$_field4 = '0x' . $_field4;
$_field5 = hexstr($_field5);
echo "\n<hr>list = ($_field1, $_field2, $_field3, $_field4, $_field5)";