在solidity中,Address(地址)是一种数据类型,代表着一个20个字节(1个字节占8位,一共占160位)的以太坊地址。它是用来存储智能合约地址或以太坊账户的地址,
可用于发送Ether或者调用合约函数等操作。地址是以太坊上的唯一标识符,可以用16进制表示,一个16进制数字占4个字节,前缀是0x,所以16进制钱包地址的长度是40(160/4=40).
地址类型就是uint160。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pragma solidity ^0.8.0;

contract AddressDemo{
address owner;
uint160 addrBits;

constructor() public{
owner = msg.sender;
}

function getOwner() view public returns (address){
return owner;
}

function addr2uint160(address addr) view public returns (uint160){
return uint160(addr);
}

function uint160ToAddress(uint160 addrBit) view public returns (address){
return address(addrBit);
}


}

msg.sender

msg.sender指当前合约调用的开发者地址。它是一个Address类型,可以用来验证交易的发送者身份或者执行权限相关的逻辑。与this.sender区别是,this.sender是在合约内部定义的一个变量,而msg.sender是在合约环境中默认可用的变量,两者指向相同。

1
require(msg.sender == this.sender)

在合约函数内部,可以直接使用msg.sender,而不需要定义。在合约外部,不能使用msg.sender.

合约地址

在以太坊中,合约地址是用来标识智能合约的唯一字符串。它是由40个16进制字符组成,前缀是0x.在部署合约时,讲部署合约时,将会分配一个唯一的地址,在进行交易时,使用这个地址调用合约中的函数。

1
2
3
function getContractAddress() public view returns (address){
return address(this);
}

balance

balance是一个关键字,用来标志某个地址的余额。返回的是uint256类型,表示以太币的数量(单位是wei)。

1
2
3
function getBalance(address addr) public view returns (uint256){
return addr.balance;
}

this

this是一个关键字,它表示当前合约的实例。通常使用它来访问当前合约中的存储变量和函数。在构造函数中使用this表示当前实例。

transfer

transfer()是一个函数,它可以用来在合约中向其他地址转移以太币。这个函数由ERC20标准定义,可以通过调用 address.transfer() 来使用。有2个参数:

  1. 要转移的地址
  2. 要转移的数量(单位是wei)。
    转移成功返回true,否则返回false.
    1
    2
    3
    4
    function transferEth(address payable _to,uint256 _value) public{
    require(msg.sender.balance >= _value, "not enough balance");
    _to.transfer(_value);
    }

send

send()是一个函数,它可以用来在合约中向其他地址转移以太币。这个函数由低级别的Ethereum API定义,调用 address.send().来使用。有2个参数:

  1. 要转移的地址
  2. 要转移的数量(单位是wei)。
    转移成功返回true,否则返回false.与 transfer() 不同的是,如果调用send()时,会在执行转账后立即退出,并且会消耗交易的gas。如果 transfer() 如果转账失败,会自动revert(回滚交易)。如果对gas费用有要求,或者需要再转账失败时执行特殊操作,应该使用transfer().
1
2
3
4
function transferEth(address payable _to,uint256 _value) public{
require(msg.sender.balance >= _value, "not enough balance");
_to.send(_value);
}