Cover photo

solidity-08-地址-Address

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

pragma solidity >=0.7.0 <0.9.0;

contract AddressDemo{
    address owner;
    uint160 addrBits;

    function setOwner() public{
        owner = msg.sender;
    }

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

    function addr2Uint160() public returns (uint160){
        addrBits=uint160(owner);
        return  addrBits;
    }

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

}

msg.sender

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

require(msg.sender == this.sender)

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

合约地址

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

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

balance

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

    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.

    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()在约不足时,会抛出异常。如果对gas费用有要求,或者需要再转账失败时执行特殊操作,应该使用transfer().

    function transferEth(address payable _to,uint256 _value) public{
        require(msg.sender.balance >= _value, "not enough balance");
        _to.send(_value);
    }