Emitir evento en función de vista o

¿Es posible emitir eventos en la función de vista (a través de eventos o logi)? ¿O es posible devolver valor a javascript sin (antes) minar en una función de transacción? Mi objetivo es evitar la espera debido a la minería con registro de eventos.

Respuestas (3)

¿Es posible emitir eventos en la función de vista (a través de eventos o logi)?

Dado que los registros de eventos se almacenan en recibos de transacciones, no creo que sea posible emitir un evento dentro de una función de visualización ya que no se produce ninguna transacción.

¿O es posible devolver valor a javascript sin (antes) minar en una función de transacción?

Tampoco creo que esto sea posible. El valor de retorno de una función que crea una transacción será el recibo de la transacción. Dentro del recibo, puede encontrar los eventos que se emitieron dentro de esa función.

Pero la recepción requerirá la extracción del bloque y, por lo tanto, debemos esperar. Estoy escribiendo una función de tiempo crítico con registros.
Puede ejecutar la función localmente usando Call en web3. Creo que la segunda parte de tu respuesta no es correcta. Vea mi respuesta a continuación.
Por lo que observé, el envío de la transacción devuelve el hash de la transacción y la confirmación de la transacción devuelve el recibo de la transacción con los detalles del evento emitido.

P1: Un evento es un cambio de estado. No es posible emitirlos desde viewo purefunciones, o constanten la sintaxis anterior.

P2: No es posible obtener valores de respuesta de una transacción firmada. Siempre obtendrá un recibo de la transacción.

Los patrones toman un tiempo para acostumbrarse. Creo firmemente en la emisión de registros de eventos auditables para cada cambio de estado importante. Cuando se minan las transacciones, la información pertinente llega con la confirmación como argumentos del registro de eventos. Esos son para clientes fuera de la cadena.

Los returnvalores o siguen siendo importantes. Son los valores de respuesta si la función es llamada desde otra función o contrato.

Por ejemplo:

bool result = myOtherContract.insertSomething(); // expecting "true"/success

Si eso es importante para un cliente, algo como:

emit LogResult(msg.sender, result);

Espero eso ayude.

La primera pregunta, no es posible porque el evento modifica el estado. En Remix verás una advertencia por hacer esto.

La segunda pregunta. Puede ejecutar las funciones localmente sin enviar una transacción a la red usando Call, no consumirá gas y se ejecutará de inmediato.

Sin embargo, si lo que pretende es que los usuarios de su sistema realicen transacciones antes de que se extraigan las transacciones, esto no es posible.

Espero que esto ayude