address payable"/>
address payable
2019独角兽企业重金招聘Python工程师标准>>>
在Solidity 0.5.x中,地址类型被细分为address
和address payable
,那么,这两种类型有什么区别?如何将address
类型转换为address paybale
类型,或者反向转换?本文将给出这些问题,并指出Solidity进行地址类型细分的目的。
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的区别是什么? - 汇智网
转载于:
更多推荐
address payable
发布评论