下面代码中的 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.sender
和address(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发送给谁