许多合同使用要求(msg.sender == tx.origin)
它的目的是什么?
什么时候应该添加这段代码?
如果msg.sender不是tx.origin,会有什么不同?在哪些情况下,msg.sender和tx.origin不是相同的地址?
这会在什么时候构成安全风险?或者使用msg.sender == tx.origin的原因是什么?在某些情况下,这不妨碍与智能契约的互操作性吗(您不能在以前需要msg.sender == tx.origin的契约的基础上构建智能契约)?
发布于 2021-11-20 15:52:47
正如您可能知道的,智能合同不能发送已签署的事务,它们只能对它们作出反应。智能合同代码由外部拥有的帐户(EOA)发起的事务触发。
tx.origin是事务的始发地EOA的地址。而msg.sender是当前呼叫来自的帐户的地址,该帐户可以是EOA或合同帐户(CA)。
它的目的是什么?
确保当前调用方是EOA,而不是CA。
什么时候应该添加这段代码?
这可能是一种安全机制,以确保如果稍后调用msg.sender,任何契约都不会试图利用漏洞。但它也阻止了每一个CA与你的合同互动.不确定它是否还有其他用途。
如果msg.sender不是tx.origin,会有什么不同?在哪些情况下,msg.sender和tx.origin不是相同的地址?
如果msg.sender不是tx.origin,那么直接调用者无疑是一个聪明的契约。
如果用户A发送一个tx调用智能契约B,则msg.sender == tx.origin ==用户A地址。如果合同B对合同C进行外部调用,则msg.sender ==合同B,而tx.origin仍然是用户A。
这会在什么时候构成安全风险?
我看不出有什么安全风险,但也许有人知道?这至少是一个非常严重的限制。正如您所指出的,调用代码的任何智能契约都会立即恢复,因为msg.sender不等于tx.origin。
https://ethereum.stackexchange.com/questions/113962
复制相似问题