【Solidity智能合约开发第13篇】3分钟了解Solidity Types – 地址(Address)

以太坊钱包地址位数验证

以太坊中的地址的长度为20字节,一字节等于8位,一共160位,所以address其实亦可以用uint160来声明。

我的以太坊钱包的地址为0xF055775eBD516e7419ae486C1d50C682d41706450x代表十六进制,我们将F055775eBD516e7419ae486C1d50C682d4170645拷贝,如下图所示,将其进行二进制转换,不难发现,它的二进制刚好160位。

备注:以太坊钱包地址是以16进制的形式呈现,我们知道一个十六进制的数字等于4个字节,160 / 4 = 40,你自己验证一下,钱包地址F055775eBD516e7419ae486C1d50C682d4170645的长度为40。

【Solidity智能合约开发第13篇】3分钟了解Solidity Types – 地址(Address)

我的以太坊钱包地址:

0xF055775eBD516e7419ae486C1d50C682d4170645

对应的二进制为:

0b1111 0000 0101 0101 0111 0111 0101 1110 1011 1101 .....0100 0101

PS:通过工具进行转换完的二进制有问题,所以自己去计算一下即可。

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract AddressTest{

    address _owner;
    uint160 _ownerUint;
    constructor() public  {
        _owner = 0xF055775eBD516e7419ae486C1d50C682d4170645;
        _ownerUint = 1372063746939811866332913075223978746532890871365;
    }

    function owner() view public returns (address) {
        return _owner; //0xF055775eBD516e7419ae486C1d50C682d4170645;
    }

    function ownerUint160() view public  returns (uint160) {
        return uint160(_owner);
        // 1372063746939811866332913075223978746532890871365
    }

    function ownerUintToAddress() view public  returns (address) {
        return address(_ownerUint); //0xF055775eBD516e7419ae486C1d50C682d4170645;
    }

}

【Solidity智能合约开发第13篇】3分钟了解Solidity Types – 地址(Address)

// 0x 45
// 0b 0100 0101
// 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128
// 1 + 0 + 4 + 0 + 0 + 0 + 64 + 0 = 69

// 1 2 3 4 5 6 7 8 9 A B C D E F

// 0xF055775eBD516e7419ae486C1d50C682d4170645
// 1372063746939811866332913075223978746532890871365
// 0b1111 0000 0101 0101 0111 0111 0101 1110 1011 1101 .....0100 0101
// 

// 40 * 4 = 160

// uint160

// address   
// uint160

由上不难看出addressuint160之间可以来回相互转换,其实address本身就不是一个什么新的特殊类型,它其实就是uint160的别名或者变体,相互等价。

不可不知的几个常识

  • msg.sender是什么?

当前哪个地址身份在操作或者调用合约,谁就是当前的msg.sender,我们来测试一下。

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract Msg_Sender_Test{

    function msgSenderAddress() view public returns (address) {
        return msg.sender;
    }

}

【Solidity智能合约开发第13篇】3分钟了解Solidity Types – 地址(Address)

  • 合约地址
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract ContractAddress{

    function msgSenderAddress() view public returns (address) {
        return msg.sender;
    }

    function returnContractAddress() view public returns (ContractAddress) {
        return this;
    }

}

【Solidity智能合约开发第13篇】3分钟了解Solidity Types – 地址(Address)

msg.sender等价于from,而this就是当前合约实例对象的地址,通过合约地址,可以调用合约对象的相关行为和方法。

支持的运算符

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract ContractAddress{

    address address1;
    address address2;

    // <=,<,==,!=,>=和>

    constructor() public {
        address1 = 0xF055775eBD516e7419ae486C1d50C682d4170645;
        address2 = 0xEAEC9B481c60e8cDc3cdF2D342082C349E5D6318;
    }

    // <=
    function test1() view public returns (bool) {
        return address1 <= address2; //0: bool: false
    }

    // <
    function test2() view public returns (bool) {
        return address1 < address2; //0: bool: false
    }

    //  != 
    function test3() view public returns (bool) {
        return address1 != address2; //0: bool: true
    }

    // >=
    function test4() view public returns (bool) {
        return address1 >= address2; //0: bool: true
    }

    // >
    function test5() view public returns (bool) {
        return address1 > address2; //0: bool: true
    }

}

成员变量(属性)和行为(函数)

一、 balance

如果我们需要查看一个地址的余额,我们可以使用balance属性进行查看。

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract addressBalance{

    function getBalance(address addr) view public returns (uint){
        return addr.balance;
    }

}

//0x1be305609d44753B8e333dc72B8EF002832e4EAd
//99999999999999587411

//0xC370B1f39b2A0eb55dEA03f5db0bb2658422c876
//100000000000000000000

【Solidity智能合约开发第13篇】3分钟了解Solidity Types – 地址(Address)

99999999999999587411 wei => 99.999999999999587411 ether
100000000000000000000 wei => 100 ether

二、this 查看当前合约地址余额

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract addressBalance{

    function getBalance() view public returns (uint){
        return address(this).balance; // 1. 直接通过this查看当前合约地址余额
    }

    function getContractAddrees() view public returns (addressBalance){
        return this; //2. 查看当前合约地址
    }

    function getBalance(address addr) view public returns (uint){
        return addr.balance; // 3. 传入合约地址查看合约地址的余额
    }
}

【Solidity智能合约开发第13篇】3分钟了解Solidity Types – 地址(Address)

三、transfer

transfer:从合约发起方向某个地址转入以太币(单位是wei),地址无效或者合约发起方余额不足时,代码将抛出异常并停止转账。

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract PayableKeyword{ 

    // 从合约发起方向 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E 地址转入 msg.value 个以太币,单位是 wei
    function deposit() payable public {

        address payable Account2 = 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E;
        Account2.transfer(msg.value);
    }

    // 读取 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E 地址的余额
    function getAccount2Balance() view public returns (uint) {

        address Account2 = 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E;

        return Account2.balance;
    }  

    // 读取合约发起方的余额
    function getOwnerBalance() view public returns (uint) {

        address Owner = msg.sender;
        return Owner.balance;
    } 

}

【Solidity智能合约开发第13篇】3分钟了解Solidity Types – 地址(Address)

演示步骤:

  1. 查看当前msg.sender地址余额
  2. 查看0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E地址余额
  3. wei切换为ether
  4. 输入转账数量
  5. 调用deposit()方法发起转账
  6. 再次查看0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E地址余额
  7. 再次查看当前msg.sender地址余额

四、send

send:send相对transfer方法较底层,不过使用方法和transfer相同,都是从合约发起方向某个地址转入以太币(单位是wei),地址无效或者合约发起方余额不足时,send不会抛出异常,而是直接返回false

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract PayableKeyword{ 

    // 从合约发起方向 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E 地址转入 msg.value 个以太币,单位可选 
    function deposit() payable public returns(bool) {

        address payable Account2 = 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E;
        return Account2.send(msg.value);
    }

    // 读取 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E 地址的余额
    function getAccount2Balance() view public returns (uint) {

        address Account2 = 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E;

        return Account2.balance;
    }  

    // 读取合约发起方的余额
    function getOwnerBalance() view public returns (uint) {

        address Owner = msg.sender;
        return Owner.balance;
    } 

}

【Solidity智能合约开发第13篇】3分钟了解Solidity Types – 地址(Address)

演示步骤:

  1. 查看当前msg.sender地址余额
  2. 查看0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E地址余额
  3. wei切换为ether
  4. 输入转账数量
  5. 调用deposit()方法发起转账
  6. 再次查看0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E地址余额
  7. 再次查看当前msg.sender地址余额

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/25003

联系我们

aliyinhang@gmail.com