Considere la siguiente función de un contrato de solidez:
function createProduct(uint _price, string memory _desc) public payable{
emit UserLedgerUpdated(_desc, -1*int(msg.value));
}
Quiero que mi Dapp muestre un libro de contabilidad simple como el siguiente:
Created Shoes priced at 100 Wei for a Total Cost of 2345 Wei
Tengo dos opciones aquí:
Atrapa el UserLedgerUpdated
evento en el Dapp
Use la API de etherscan para obtener los detalles de txn
Mis preguntas son:
a) Si elijo la opción 2 (es decir, leer los detalles de txn), entonces puedo evitar la emisión de eventos. Dado que los eventos se registran y ocupan espacio, costarían gasolina y, por lo tanto, serán más costosos que leer los detalles de txn de forma gratuita. ¿Es correcto mi entendimiento?
b) Mientras leo la API de ethscan, obtengo la entrada a la función como hexadecimal. Puedo usar web3.toAscii
para convertirlo en una cadena, pero observe que el primer argumento de la función es en realidad un número. Por lo tanto, cuando convierto datos de entrada en una transacción de muestra , obtengo {@Shoes
en lugar de 123Shoes
. ¿Hay alguna manera de transmitir correctamente los datos hexadecimales que obtenemos de la API de ethrscan?
price
variable, que es un número, no una cadena y 0x7B resulta ser { en ascii. Lo que puede hacer es pasar los datos abi y tx de la función a la web3.eth.abi.decodeParameters
función después de eliminar la firma de la función (los primeros 4 bytes después de 0x). Esto devolverá los datos decodificados.
Amarsh
Likicrus