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 ...