🧠简单理解msg.sender:当前调用该函数的直接调用者的地址。tx.origin:最初发起这笔交易的外部账户(通常是用户的钱包地址)。📌举个例子假设有以下调用链:用户钱包(地址为0xUser)调用了合约A的函数,合约A又调用了合约B的函数,合约B再调用了
msg.sender
:当前调用该函数的直接调用者的地址。tx.origin
:最初发起这笔交易的外部账户(通常是用户的钱包地址)。假设有以下调用链:
用户钱包(地址为 0xUser
)调用了合约 A 的函数,合约 A 又调用了合约 B 的函数,合约 B 再调用了合约 C 的函数。
调用链如下:
0xUser
→ 合约 A → 合约 B → 合约 C
在合约 C 中:
msg.sender
是谁?是合约 B 的地址,因为是 B 直接调用了 C。tx.origin
是谁?是 0xUser
,因为是用户最初发起了这笔交易。场景 | msg.sender |
tx.origin |
---|---|---|
用户 → 合约 A | 0xUser |
0xUser |
合约 A → 合约 B | 合约 A 的地址 | 0xUser |
合约 B → 合约 C | 合约 B 的地址 | 0xUser |
如果在合约中使用 tx.origin
进行权限验证,攻击者可能会利用这一点进行钓鱼攻击。例如,攻击者创建一个恶意合约,诱导用户调用它,然后该合约调用你的合约中的敏感函数。如果你的合约仅通过 tx.origin
验证权限,攻击者就可能绕过验证。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!