solidity-08-地址-Address
在solidity中,Address(地址)是一种数据类型,代表着一个20个字节(1个字节占8位,一共占160位)的以太坊地址。它是用来存储智能合约地址或以太坊账户的地址,
可用于发送Ether或者调用合约函数等操作。地址是以太坊上的唯一标识符,可以用16进制表示,一个16进制数字占4个字节,前缀是0x,所以16进制钱包地址的长度是40(160/4=40).
地址类型就是uint160。
1 | pragma solidity ^0.8.0; |
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 | function getContractAddress() public view returns (address){ |
balance
balance是一个关键字,用来标志某个地址的余额。返回的是uint256类型,表示以太币的数量(单位是wei)。
1 | function getBalance(address addr) public view returns (uint256){ |
this
this是一个关键字,它表示当前合约的实例。通常使用它来访问当前合约中的存储变量和函数。在构造函数中使用this表示当前实例。
transfer
transfer()是一个函数,它可以用来在合约中向其他地址转移以太币。这个函数由ERC20标准定义,可以通过调用 address.transfer() 来使用。有2个参数:
- 要转移的地址
- 要转移的数量(单位是wei)。
转移成功返回true,否则返回false.1
2
3
4function 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个参数:
- 要转移的地址
- 要转移的数量(单位是wei)。
转移成功返回true,否则返回false.与 transfer() 不同的是,如果调用send()时,会在执行转账后立即退出,并且会消耗交易的gas。如果 transfer() 如果转账失败,会自动revert(回滚交易)。如果对gas费用有要求,或者需要再转账失败时执行特殊操作,应该使用transfer().
1 | function transferEth(address payable _to,uint256 _value) public{ |