博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Solidity 0.5 address payable和address的区别是什么?
阅读量:7209 次
发布时间:2019-06-29

本文共 1629 字,大约阅读时间需要 5 分钟。

hot3.png

在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 payableaddress 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

你可以使用在线的来测试本文中的Soldity代码,以便更好地理解在Soldity 0.5中的address payableaddress类型的区别与相互转换。


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

转载于:https://my.oschina.net/u/2472105/blog/3056460

你可能感兴趣的文章
乐视网称贾跃亭旗下资产世茂工三拍卖与上市公司无关
查看>>
专访网秦创始人林宇:我曾每天戴20公斤手铐 生不如死
查看>>
英国内政部启动遣返程序 数百非法入境者或遭驱逐
查看>>
当云海遇上日出光晕 安徽黄山风景美如画境
查看>>
「每天一道面试题」sleep方法和wait方法有什么区别?
查看>>
蒙牛与达沃斯建立战略合作伙伴关系助推乳业全球化
查看>>
“宫里过大年”数字沉浸体验展开幕 门神居然会动?
查看>>
最新版中国综合地层时间框架正式发布
查看>>
Python与人工智能间有什么关系?
查看>>
超窄边框主打游戏? 16英寸MacBook概念设计
查看>>
JavaScript 模块化解析
查看>>
UI设计师福利之零基础入门SVG路径动画(看最后的更正部分)
查看>>
springboot(十四):springboot整合shiro-登录认证和权限管理
查看>>
浏览器缓存和webpack缓存配置
查看>>
saiku+kettle整合(十四)saiku embed framework
查看>>
【教程】手把手教你使用 MTA 可视化埋点
查看>>
段友福利:Python爬取段友之家贴吧图片和小视频
查看>>
React全家桶写一个CNode社区,奉上心得与源码
查看>>
小心Nginx的add_header指令
查看>>
PHP是什么-PHP的架构及原理概述
查看>>