¿Tiene algún sentido agregar msg.sender a un evento?

Se me pide que proporcione el valor de msg.sendercomo parte de un evento emitido en una función.

Es algo como:

contract MyContract {
    event MyEvent(address indexed sender, uint256 input, uint256 output);

    function func(uint256 input) external {
        verify(msg.sender);
        uint256 output = compute(input);
        emit MyEvent(msg.sender, input, output);
    }

    function verify(address sender) private view {
        // verify the sender...
        ...
    }

    function compute(uint256 input) private returns (uint256) {
        // compute the output...
    }
}

¿Tiene algún sentido hacer esto, o este valor siempre estará presente en el bloque de todos modos?

Para todo lo que importa, esta función se llama solo desde fuera de la cadena (es decir, no por ningún contrato).

Así msg.senderque siempre será igual a tx.origincuando se emite el evento.

¡Gracias!

Respuestas (1)

Todo se reduce a cómo está utilizando los datos y cuál es el método más eficiente para usted.

Es cierto que se puede obtener msg.senderdel bloque (o transacción) o de un evento. Si está creando un front-end y está completando la página con datos del evento, probablemente sería mejor incluirlo en el evento para obtener un código de front-end limpio y conciso. Si ya está almacenando cada bloque y sus datos en su propio explorador de bloques, también puede usar esos datos y obtendrá el mismo resultado.

Actualizar

Mirándolo desde la perspectiva del gas, terminará pagando más por agregarlo a los eventos. El LOGcosto (según el papel amarillo) es el siguiente:

k + unindexedBytes * a + indexedTopics * b

donde:

k = 375 (initial `LOG` cost)
a = 8
b = 375 (each additional indexed `LOG`)
Estaba pensando más en el aspecto del costo de la gasolina, ya que este parámetro adicional (indexado) cuesta un poco, entonces, ¿lo incluimos si ya está allí? Gracias.
Ya veo. Agregaré a la respuesta.