【solidity必知】常见的address(this),tx.origin 和 msg.sender 语句解释

在Solidity编程里,address(this)、tx.origin和msg.sender是3个常用的与地址相关的语句,下面详细介绍一下它们的区别。

在 Solidity 编程里,address(this)tx.origin 和 msg.sender 是 3 个常用的与地址相关的语句,下面详细介绍一下它们的区别。

1. address(this)

  • address(this) 表示当前合约自身的地址。
  • 这个地址在合约部署时就已确定,并且在合约的整个生命周期内都不会改变。

用法

在合约内部,当需要引用合约自身地址时,就可以使用 address(this)。例如,在将合约的以太币余额发送到其他地址时,就会用到它。

contract ExampleContract {
    function getContractAddress() public view returns (address) {
        return address(this);
    }
}

2.tx.origin

  • tx.origin 指的是发起当前交易的原始外部账户地址。也就是最初在以太坊钱包(像 MetaMask)里点击发送交易的那个账户地址。

用法

一般用于检查交易的发起者是否为某个特定的外部账户。不过,要注意使用 tx.origin 存在安全风险,因为它可能会被恶意合约利用来进行重入攻击。

contract ExampleContract {
    function checkTxOrigin() public view returns (address) {
        return tx.origin;
    }
}

3. msg.sender

  • msg.sender 代表当前合约的调用者
  • 如果是外部账户直接调用合约函数,msg.sender 就是该外部账户的地址;要是合约 A 调用合约 B 的函数,那么在合约 B 里,msg.sender 就是合约 A 的地址。

用法

在合约中,msg.sender 常被用来识别调用者的身份,进而进行权限控制等操作。

contract ExampleContract {
    function checkMsgSender() public view returns (address) {
        return msg.sender;
    }
}

总结

  • address(this):当前合约的地址
  • tx.origin:合约调用源地址
  • msg.sender:合约的调用者

举例说明

image.png

  • address(this):当前合约的地址
  • tx.origin:合约调用源地址
  • msg.sender:合约的调用者
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
mengbuluo222
mengbuluo222
0x9Ff1...FaA5
前端开发求职中... 8年+开发经验,拥有丰富的开发经验,擅长VUE、React开发。