首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在下面的代码中,msg.sender和address(这)有什么不同?

在下面的代码中,msg.sender和address(这)有什么不同?
EN

Stack Overflow用户
提问于 2021-11-15 08:13:15
回答 2查看 684关注 0票数 3

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

**杂注固体^0.8.0;

代码语言:javascript
运行
复制
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;
  }
}**
EN

回答 2

Stack Overflow用户

发布于 2021-11-16 16:12:06

它们都是可靠的地址,但msg.senderaddress(this)之间有很大的区别。

请允许我在下面使用一个简化的智能合约来强调其中的区别。所有屏幕截图都来自Remix-Ethereum (单击here)。

代码语言:javascript
运行
复制
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

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

0x5B38Da6a701c568545dCfcB03FcB875f56beddC4

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

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

0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2

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

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

address(this)

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

您可以在以下位置找到:

0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8

票数 4
EN

Stack Overflow用户

发布于 2021-11-15 09:59:58

msg.sender是约定调用方的地址。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69971218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档