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)
小智 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
归档时间: |
|
查看次数: |
3291 次 |
最近记录: |