如果任意一个在solidity函数体内被使用都可能会改变一个合约的状态(写入调用),那么使用其中一个而不用另一个的本质区别和好处是什么呢?例如:

 function setOwner() {
      owner = msg.sender;
   }

对比

 function setOwner() {
      owner = tx.origin;
   }

两者区别是什么呢?

原文地址

2 人回答 0

2 个回答
投票数
最旧发布
最近发布

回答发布于 2018-09-05 16:20:01

使用msg.sender的所有者可能是一个合约。

使用tx.origin的所有者永远不可能是合约。

在简单的调用链A-> B-> C-> D中,内部D 的msg.sender为C,tx.origin为A.

就灵活性而言首选msg.sender。此外,对于Serenity,Vitalik建议避免使用tx.origin:How do I make my DAPP "Serenity-Proof?"

如果你真的需要使用tx.origin,请一定考虑仔细。请记住,你可能不是该合约的唯一用户。其他人也可能想要使用你的合约,并希望通过他们编写的合约与之进行互动。

如果在D中确实需要其来源origin,那么合约B,C,D中的每个函数都可以采用额外的参数来传播来源:A将其地址(this)传递给B,B将值传递给C ,C将它传递给D.

编注:强调一下下面@WBT的评论,为了来源origin使用传入值的合约必须非常注意它如何使用来源的:任何人都可以传入一个值——但不一定是真正来源。

||
||

回答发布于 2018-09-05 16:20:00

msg.sender给出了消息的直接发送者,例如传递它的一个合约。

tx.origin给出了交易的来源,因此它是最初发送的用户地址。 在实践中,这将始终是一个用户,所以上一个回答者eth给出的答案是正确的。

||
||

回答发布于 2018-09-05 16:20:00

msg.sender给出了消息的直接发送者,例如传递它的一个合约。

tx.origin给出了交易的来源,因此它是最初发送的用户地址。 在实践中,这将始终是一个用户,所以上一个回答者eth给出的答案是正确的。

||
||

回答发布于 2018-09-05 16:20:01

使用msg.sender的所有者可能是一个合约。

使用tx.origin的所有者永远不可能是合约。

在简单的调用链A-> B-> C-> D中,内部D 的msg.sender为C,tx.origin为A.

就灵活性而言首选msg.sender。此外,对于Serenity,Vitalik建议避免使用tx.origin:How do I make my DAPP "Serenity-Proof?"

如果你真的需要使用tx.origin,请一定考虑仔细。请记住,你可能不是该合约的唯一用户。其他人也可能想要使用你的合约,并希望通过他们编写的合约与之进行互动。

如果在D中确实需要其来源origin,那么合约B,C,D中的每个函数都可以采用额外的参数来传播来源:A将其地址(this)传递给B,B将值传递给C ,C将它传递给D.

编注:强调一下下面@WBT的评论,为了来源origin使用传入值的合约必须非常注意它如何使用来源的:任何人都可以传入一个值——但不一定是真正来源。

||
||

回答发布于 2018-09-05 16:20:01

使用msg.sender的所有者可能是一个合约。

使用tx.origin的所有者永远不可能是合约。

在简单的调用链A-> B-> C-> D中,内部D 的msg.sender为C,tx.origin为A.

就灵活性而言首选msg.sender。此外,对于Serenity,Vitalik建议避免使用tx.origin:How do I make my DAPP "Serenity-Proof?"

如果你真的需要使用tx.origin,请一定考虑仔细。请记住,你可能不是该合约的唯一用户。其他人也可能想要使用你的合约,并希望通过他们编写的合约与之进行互动。

如果在D中确实需要其来源origin,那么合约B,C,D中的每个函数都可以采用额外的参数来传播来源:A将其地址(this)传递给B,B将值传递给C ,C将它传递给D.

编注:强调一下下面@WBT的评论,为了来源origin使用传入值的合约必须非常注意它如何使用来源的:任何人都可以传入一个值——但不一定是真正来源。

||
||

回答发布于 2018-09-05 16:20:00

msg.sender给出了消息的直接发送者,例如传递它的一个合约。

tx.origin给出了交易的来源,因此它是最初发送的用户地址。 在实践中,这将始终是一个用户,所以上一个回答者eth给出的答案是正确的。

||
||