Solidity this 和 msg.sender 的用法

Solidity 中 this 代表合约对象本身,可以通过 address(this) 获取合约地址。合约地址与合约创建者地址、合约调用者地址并不相同。

Solidity 中 msg.sender 代表合约调用者地址。一个智能合约既可以被合约创建者调用,也可以被其它人调用。

合约创建者,即合约拥有者,也就是指合约部署者,它的地址可以在合约的 constructor() 中,通过 msg.sender 获得。因为合约在部署的时候会首先调用 constructor()

 

1. 范例

// SPDX-License-Identifier: SimPL-3.0
pragma solidity ^0.7.0;

contract Hello {
    address public owner;
    constructor()  {
        owner = msg.sender;
        log0(bytes32(uint256(msg.sender)));
        log0(bytes32(uint256(address(this))));
    }
 
    function hello()  public pure returns (string memory) {
        return "name";
    }
}

owner 被赋值为合约部署者的地址。

log0(bytes32(uint256(msg.sender))) 在日志中输出了合约部署者的地址。

log0(bytes32(uint256(address(this)))) 在日志中输出了合约地址。

查看合约在部署时的日志结果:

[ 
{ 
"from": "0x625Ed43c9570cd11D30879E82f028635a639d14B", 
"data": "0x00000000000000000000000078731d3ca6b7e34ac0f824c42a7cc18a495cabab", 
"topics": [ "0x" ] 
}, 
{ "from": "0x625Ed43c9570cd11D30879E82f028635a639d14B", 
"data": "0x000000000000000000000000625ed43c9570cd11d30879e82f028635a639d14b", 
"topics": [ "0x" ] 
} 
] 

 以太坊中的地址 address 的长度为20字节,一字节等于8位,一共160位,所以 address 也可以用 uint160 来声明。我的以太坊钱包地址为 0xDF12793CA392f ...