msg.sender和address(this)有什么区别?

Yad*_*ash 5 ethereum solidity web3js

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

**编译指示可靠性^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;
  }
}**
Run Code Online (Sandbox Code Playgroud)

Mik*_*maa 9

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

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


小智 7

msg.sender它们都是Solidity中的地址,但是和之间有很大的区别address(this)

请允许我使用下面的简化智能合约来强调其中的差异。所有屏幕截图均来自 Remix-Ethereum IDE(点击此处)。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

消息发送者

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

0x5B38Da6a701c568545dCfcB03FcB875f56beddC4

在此输入图像描述

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

在此输入图像描述

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

0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2

在此输入图像描述

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

在此输入图像描述

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

地址(这个)

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

这可以在这里找到:

在此输入图像描述

0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8