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!
Si desea hacerlo en NodeJs, puede crear un archivo llamado decodeParams.js
y 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)";