Leer el libro mayor de la API de etherscan frente a la emisión de eventos

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í:

  1. Atrapa el UserLedgerUpdatedevento en el Dapp

  2. 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.toAsciipara 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 {@Shoesen lugar de 123Shoes. ¿Hay alguna manera de transmitir correctamente los datos hexadecimales que obtenemos de la API de ethrscan?

Respuestas (1)

  1. Sí, definitivamente estás ahorrando gasolina al no emitir eventos. Sin embargo, el costo es que luego depende de Etherscan para que su dapp funcione. Si Etherscan está inactivo, su dapp está inactivo. También perderá a todos los usuarios que usan multisigs, ya que sus llamadas a este contrato nunca se mostrarán en las transacciones de Etherscan (aunque Etherscan también sirve transacciones internas, por lo que es posible que pueda evitarlo). Definitivamente también pierde un aspecto de su "dappness", ya que ahora depende de un servicio centralizado para la lectura de datos. Si se limita a los eventos, los usuarios solo necesitan acceder a un nodo sincronizado. Esto podría ser de Infura, algún otro proveedor de nodos o un nodo local.
  2. Esto se debe a que el 123 (7b) es la pricevariable, 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.decodeParametersfunción después de eliminar la firma de la función (los primeros 4 bytes después de 0x). Esto devolverá los datos decodificados.
Estoy tomando prestado el término 'dappness' por el resto de mi vida :)
Entonces, ¿qué solución sería estable al usar la API de exploración de éter, subgráfico o infura? Tengo un contrato inteligente para emitir eventos.