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

126 阅读1分钟

🧠 简单理解

  • msg.sender:当前调用该函数的直接调用者的地址。
  • tx.origin:最初发起这笔交易的外部账户(通常是用户的钱包地址)。

📌 举个例子

假设有以下调用链:

用户钱包(地址为 0xUser)调用了合约 A 的函数,合约 A 又调用了合约 B 的函数,合约 B 再调用了合约 C 的函数。

调用链如下:

0xUser → 合约 A → 合约 B → 合约 C

在合约 C 中:

  • msg.sender 是谁?是合约 B 的地址,因为是 B 直接调用了 C。
  • tx.origin 是谁?是 0xUser,因为是用户最初发起了这笔交易。

✅ 总结对比

场景msg.sendertx.origin
用户 → 合约 A0xUser0xUser
合约 A → 合约 B合约 A 的地址0xUser
合约 B → 合约 C合约 B 的地址0xUser

⚠️ 为什么这很重要?

如果在合约中使用 tx.origin 进行权限验证,攻击者可能会利用这一点进行钓鱼攻击。例如,攻击者创建一个恶意合约,诱导用户调用它,然后该合约调用你的合约中的敏感函数。如果你的合约仅通过 tx.origin 验证权限,攻击者就可能绕过验证。

因此,建议始终使用 msg.sender 进行权限验证