综合技术

Solidity 0.5 address payable和address的区别是什么?

微信扫一扫,分享到朋友圈

Solidity 0.5 address payable和address的区别是什么?
0

Solidity 0.5.x中,地址类型被细分为 addressaddress payable , 那么,这两种类型有什么区别?如何将 address 类型转换为 address paybale 类型, 或者反向转换?本文将给出这些问题,并指出Solidity进行地址类型细分的目的。

solidity 0.5将地址类型细分为 addressaddress payable 的目的在于, 它有助于强制智能合约开发人员认真考虑一个地址是否应当接收以太币,如果该地址 根本不需要接收以太币,那么就应当使用 address 类型。当地址被声明为 address 类型后,如果开发者试图向该地址转入以太币,就会导致编译时类型错误。

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

address payableaddress 类型的变量都表示以太坊地址,都可以使用底层的 .call() 方法。 从字面意思看, address payable 表示可用于支付的地址,因此在 address payable 类型 的变量上,你可以使用 .transfer().send() 方法,但是 address 类型的变量则不能使用这些方法。

因此, address payable 类型的功能要强于 address 类型,容易理解, address payableaddress 类型的转换要容易一些(降级使用),而从 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 payableaddress 类型的区别与相互转换。

汇智网原创,转载请标明出处。

阅读原文...


微信扫一扫,分享到朋友圈

Solidity 0.5 address payable和address的区别是什么?
0

学习软件编程

Three.js Fundamentals

上一篇

部分游戏发行商退出Epic特卖活动

下一篇

评论已经被关闭。

插入图片

热门分类

往期推荐

Solidity 0.5 address payable和address的区别是什么?

长按储存图像,分享给朋友