Se me pide que proporcione el valor de msg.sender
como 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.sender
que siempre será igual a tx.origin
cuando se emite el evento.
¡Gracias!
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.sender
del 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 LOG
costo (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`)
buena vibración
shane fontaine