天天看点

solidity 0.5中address payable和address的区别?

在Solidity 0.5.x中,地址类型被细分为

address

address payable

,那么,这两种类型有什么区别?如何将

address

类型转换为

address paybale

类型,或者反向转换?本文将给出这些问题,并指出Solidity进行地址类型细分的目的。

如果你希望快速掌握以太坊区块链的开发,可以看一下这些 智能合约与DApp开发教程

solidity 0.5将地址类型细分为

address

address payable

的目的在于,它有助于强制智能合约开发人员认真考虑一个地址是否应当接收以太币,如果该地址根本不需要接收以太币,那么就应当使用

address

类型。当地址被声明为

address

类型后,如果开发者试图向该地址转入以太币,就会导致编译时类型错误。

address

address payable

类型都用来存储160位的以太坊地址,两者的区别仅在编译时存在,在编译后的合约代码中就没有区别了 —— 也就是说,引入地址类型细分的唯一目的就是帮助开发者在编译期理清一个地址的实际用途。

address payable

address

类型的变量都表示以太坊地址,都可以使用底层的

.call()

方法。从字面意思看,

address payable

表示可用于支付的地址,因此在

address payable

类型的变量上,你可以使用

.transfer()

.send()

方法,但是

address

类型的变量则不能使用这些方法。

因此,

address payable

类型的功能要强于

address

类型,容易理解,

address payable

address

类型的转换要容易一些(降级使用),而从

address

类型向

address payable

类型的转换,则需要稍微转个弯。

1、address payable转换为address

address payable

类型的变量可以显式或隐式地转换为address类型:

address payable addr1 = msg.sender;
address addr2 = addr1; // 正确
address addr3 = address(addr1); // 正确           

2、address转换为address payable

address

类型的变量只能显式地转换为

address payable

,需要首先转换为整数类型(例如uint160),然后再将该整型值转换为address类型,就可以得到

address payable

address addr1 = msg.sender;
address payable addr2 = addr1; // 错误,address不能隐式地转换为address payable
address payable addr3 = address(uint160(addr1)); // 正确,先转换为uint160,然后转换为address payable           

3、address[]或address payable[]的转换

虽然单个

address payable

变量可以转换为

address

类型,或者反之,但是不能直接将整个数组进行转换。例如:

function testCast(address payable[] memory _addresses) returns (address[] memory)
{
    return _addresses; // 错误!
}           

4、内置的变量类型

在Solidity的内置变量中,以下几个变量的类型都是

address payable

  • msg.sender
  • tx.origin
  • block.coinbase

你可以使用在线的

Solidity IDE

来测试本文中的Soldity代码,以便更好地理解在Soldity 0.5中的

address payable

address

类型的区别与相互转换。

原文链接:

Solidity 0.5 address payable和address的区别是什么? - 汇智网