下面代码中的 msg.sender 和 address(this) 有啥区别?

Posted

技术标签:

【中文标题】下面代码中的 msg.sender 和 address(this) 有啥区别?【英文标题】:what is the differnce between msg.sender and address(this) in below code?下面代码中的 msg.sender 和 address(this) 有什么区别? 【发布时间】:2021-12-26 11:20:20 【问题描述】:

我是初学者,最近我开始学习solidity,请帮助我理解以下代码 下面代码中的 msg.sender 和 address(this ) 有什么区别

**pragma solidity ^0.8.0;

contract Escrow
  address public payer;
  address payable public payee;
  address public lawyer;
  uint public amount;
  
  constructor(
    address _payer, 
    address payable _payee, 
    uint _amount) 
    payer = _payer;
    payee = _payee;
    lawyer = msg.sender; 
    amount = _amount;
  

  function deposit() payable public 
    require(msg.sender == payer, 'Sender must be the payer');
    require(address(this).balance <= amount, 'Cant send more than escrow amount');
  

  function release() public 
    require(address(this).balance == amount, 'cannot release funds before full amount is sent');
    require(msg.sender == lawyer, 'only lawyer can release funds');
    payee.transfer(amount);
  
  
  function balanceOf() view public returns(uint) 
    return address(this).balance;
  
**

【问题讨论】:

【参考方案1】:

msg.sender是合约调用者的地址。

address(this) 是智能合约本身的地址。

【讨论】:

【参考方案2】:

它们都是Solidity中的地址,但是msg.senderaddress(this)有很大区别。

请允许我使用下面的简化智能合约来突出差异。所有截图均来自 Remix-Ethereum IDE(点击here)。

pragma solidity ^0.8.0;

contract Escrow 
    
    address public owner;
    
    constructor() 
        owner = msg.sender;
    
    
    function depositNothing() public view 
        require(msg.sender == owner, 'You are not the owner!');
    
    
    function balanceOf() view public returns(uint) 
        return address(this).balance;
    

msg.sender

我们谈论的是调用智能合约中的函数的 ACCOUNT 地址。例如,假设在 Remix Ethereum (IDE) 中,Escrow 智能合约是从 ACCOUNT 地址部署的:

0x5B38Da6a701c568545dCfcB03FcB875f56beddC4

在这种情况下,状态变量owner 将具有上述相同的地址。这是因为 constructor 函数是从该地址调用的。

现在,假设我们将 ACCOUNT 地址更改为:

0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2

然后我们从之前部署的智能合约中调用函数depositNothing。但是,您将收到以下错误:

这是因为depositNothing 函数中的msg.sender 等同于第二个ACCOUNT 地址。这显然不等于第一个帐户地址 - owner。因此,require 函数中的第二个参数与错误一起返回。

地址(这个)

这与前面讨论的帐户地址不同。这严格指智能合约在部署到以太坊区块链时的地址。

可以在这里找到:

0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8

【讨论】:

非常感谢您的回复,我明白了

以上是关于下面代码中的 msg.sender 和 address(this) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

solidity msg.sender.transfer发送给谁

solidity msg.sender.transfer发送给谁

Solidity 基础知识:“msg.sender”代表啥

区块链 以太坊 多层调用,获取调用者 msg.sender

如何在solidity 0.5.0中将etherenum发送到msg.sender

actor中!(tell)与forward的差别