Solidity 中的 msg.sender 和 tx.origin 的区别

🧠简单理解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 验证权限,攻击者就可能绕过验证。

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
suiceber
suiceber
江湖只有他的大名,没有他的介绍。