【问题标题】: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;
  }
}**

【问题讨论】:

    标签: ethereum solidity web3


    【解决方案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

      【讨论】:

      • 非常感谢您的回复,我明白了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      相关资源
      最近更新 更多