Si cualquiera de los dos se usa en el cuerpo de una función de Solidity que puede cambiar el estado de un contrato (llamada de escritura), ¿cuál es la diferencia principal y/o el beneficio de usar uno sobre el otro? Por ejemplo:
function setOwner() {
owner = msg.sender;
}
contra
function setOwner() {
owner = tx.origin;
}
¿Cual es la diferencia?
Con msg.sender
el propietario puede ser un contrato.
Con tx.origin
el dueño nunca puede haber un contrato.
En una cadena de llamada simple A->B->C->D, dentro de D msg.sender
estará C y tx.origin
será A.
msg.sender
Se prefiere por la flexibilidad que proporciona. Además, para Serenity, aunque lleva un tiempo, Vitalik recomienda evitar tx.origin
: ¿Cómo hago que mi DAPP sea "a prueba de serenidad"?
Considere cuidadosamente si realmente alguna vez necesita usar tx.origin
. Recuerda, es posible que no seas el único usuario de tu contrato. Otras personas pueden querer usar su contrato y querer interactuar con él a través de un contrato que han escrito.
Si realmente se desea el origen en D, entonces cada una de las funciones en los contratos B, C, D podría tomar un parámetro extra para propagar el origen: A pasaría su dirección ( this
) a B, B pasaría el valor a C, y C se lo pasaría a D.
EDITAR: Para enfatizar el comentario de @WBT a continuación, un contrato que usa un valor pasado para el origen, debe tener mucho cuidado en cómo usa el origen: cualquiera puede pasar un valor que no es el origen real.
msg.sender
proporciona el remitente directo del mensaje, por ejemplo, un contrato que lo transmitió.
tx.origin
proporciona el origen de las transacciones, por lo que la dirección de usuario desde la que se envió originalmente. En la práctica, siempre será un usuario, por lo que la respuesta de eth es cierta.
pablo s
ética
Brusco
ética
WBT