我求之不得,最近我开始学习solidity,请帮助我理解下面的代码,下面代码中的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;
}
}**
发布于 2021-11-16 16:12:06
它们都是可靠的地址,但msg.sender
和address(this)
之间有很大的区别。
请允许我在下面使用一个简化的智能合约来强调其中的区别。所有屏幕截图都来自Remix-Ethereum (单击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
我们正在讨论从中调用智能合约中的函数的帐户地址。例如,假设在Remix Ethereum (IDE)中,从帐户地址部署了Escrow
智能合约:
0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
在这种情况下,状态变量owner
将具有上面提到的相同地址。这是因为constructor
函数是从该地址调用的。
现在,假设我们将帐户地址更改为:
0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2
然后,我们从前面部署的智能合约中调用函数depositNothing
。但是,您将看到以下错误:
这是因为depositNothing
函数中的msg.sender
等于第二个帐户地址。这显然不等同于第一个帐户地址- owner
。因此,require
函数中的第二个参数与错误一起返回。
address(this)
这与前面讨论的帐户地址不同。这严格指的是在将智能合约部署到以太区块链时为其提供的地址。
您可以在以下位置找到:
0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8
发布于 2021-11-15 09:59:58
msg.sender
是约定调用方的地址。
address(this)
是智能合约本身的地址。
https://stackoverflow.com/questions/69971218
复制相似问题