If either are used in the body of a Solidity function that may change the state of a contract (write call), what's the primary difference and/or benefit of using one over the other. For example:
function setOwner() {
owner = msg.sender;
}
vs.
function setOwner() {
owner = tx.origin;
}
What's the difference?
Best Answer
With
msg.sender
the owner can be a contract.With
tx.origin
the owner can never be a contract.In a simple call chain A->B->C->D, inside D
msg.sender
will be C, andtx.origin
will be A.msg.sender
is preferred for the flexibility it provides. Furthermore, for Serenity, even though it's a while out, Vitalik recommends avoidingtx.origin
: How do I make my DAPP "Serenity-Proof?"Carefully consider if you really ever need to use
tx.origin
. Remember, you may not be the only user of your contract. Other people may want to use your contract and want to interact with it via a contract they've been written.If the origin is really desired in D, then each of the functions in the contracts B, C, D could take an extra parameter to propagate the origin: A would pass its address (
this
) to B, B would pass the value to C, and C would pass it to D.EDIT: To emphasize the comment by @WBT below, a contract that uses a passed in value for the origin, must be very careful in how it uses the origin: anyone can pass in a value that is not the real origin.