地址型

本章学习 Solidity 数据类型中的地址型,以及地址型的相关运算和操作方法。

视频Bilibili  |  Youtube
官网binschool.app
推特@BinSchool    DiscordBinDAO   微信:bkra50 

地址型Solidity 中常用的数据类型之一,用来存储以太坊中的账户地址。

它使用关键字 address 来声明。

地址型 变量的内部存储长度为160位,也就是20个字节,通常使用一个十六进制字符串来表示,并以前缀 0x 开头。

例如:

address account = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db;

地址的生成原理

以太坊的账户地址是通过该账户的公钥,按照一定的算法计算得出的。

具体计算过程如下:

  • 首先,将未压缩格式的公钥作为输入值,使用 keccak-256 哈希算法,生成了一个256位的哈希值。
  • 然后,截取256位哈希值右边的160位作为账户地址。
  • 最后,为了便于显示,账户地址使用十六进制字符串来表示,这个字符串的长度为40( 1个字节由两个16进制字符来表示),并以前缀 0x 开头。

地址的比较运算

地址 可以进行比较运算,可以使用的操作符有:==!=<=<>=>

例如,判断两个地址是否相等:

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.0; 

contract AddressCompare {
    address address1 = 0xB2D02Ac73b98DA8baF7B8FD5ACA31430Ec7D4429;
    address address2 = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db;
    
    function compareAddresses() public view returns (bool) {
        return (address1 == address2);
    }
}

地址的属性和方法

地址 具有 .balance 属性,用于返回该账户中以太坊的余额,这也是 地址 最常用的方法。例如:

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.0; 

contract AddressBalance { 
    address account = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db;

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

另外,地址 也经常用于转账,我们可以使用地址的 .transfer() 和 .send() 方法进行转账。

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.0; 

contract AddressTransfer { 
    address account = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db;

    function transferETH() public {
        payable(account).transfer(1 ether);
    }
}

关于更为详细的转账方法,以及 transfer 与 send 有什么区别,我们在后面的章节中再详细讲解。