地址类型(Address)

地址类型address是一个值类型,

地址: 20字节(一个以太坊地址的长度),地址类型也有成员,地址是所有合约的基础
支持的运算符:

§  <=, <, ==, !=, >= 和 >

注意:从0.5.0开始,合约不再继承自地址类型,但仍然可以显式转换为地址。

地址类型的成员

§  balance 属性及transfer() 函数

这里是地址类型相关成员的快速索引
balance用来查询账户余额,transfer()用来发送以太币(以wei为单位)。
如:

1.      address x = 0x123;

2.      address myAddress = this;

3.      if (x.balance < 10 &&myAddress.balance >= 10) x.transfer(10);

注解:如果x是合约地址,合约的回退函数(fallback 函数)会随transfer调用一起执行(这个是EVM特性),如果因gas耗光或其他原因失败,转移交易会还原并且合约会抛异常停止。

关于回退函数(fallback 函数),简单来说它是合约中无函数名函数,下面代码事例中,进进一步讲解回退函数(fallback)的使用。

send() 函数

end 与transfer对应,但更底层。如果执行失败,transfer不会因异常停止,而send会返回false。

警告:send() 执行有一些风险:如果调用栈的深度超过1024或gas耗光,交易都会失败。因此,为了保证安全,必须检查send的返回值,如果交易失败,会回退以太币。如果用transfer会更好。

call(), callcode() 和delegatecall() 函数

为了和非ABI协议的合约进行交互,可以使用call() 函数, 它用来向另一个合约发送原始数据,支持任何类型任意数量的参数,每个参数会按规则(ABI协议)打包成32字节并一一拼接到一起。一个例外是:如果第一个参数恰好4个字节,在这种情况下,会被认为根据ABI协议定义的函数器指定的函数签名而直接使用。如果仅想发送消息体,需要避免第一个参数是4个字节。如下面的例子:

1.      address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;

2.      nameReg.call("register", "MyName");

3.      nameReg.call(bytes4(keccak256("fun(uint256)")), a);

call函数返回一个bool值,以表明执行成功与否。正常结束返回true,异常终止返回false。但无法获取到结果数据,因为需要提前知道返回的数据的编码和数据大小(因不知道对方使用的协议格式,所以也不会知道返回的结果如何解析)。还可以提供.gas()修饰器进行调用:

1.      namReg.call.gas(1000000)("register", "MyName");

类似还可以提供附带以太币:

1.      nameReg.call.value(1 ether)("register", "MyName");

修饰器可以混合使用,修饰器调用顺序无所谓。

1.      nameReg.call.gas(1000000).value(1 ether)("register", "MyName");

注解:目前还不能在重载函数上使用gas或value修饰符,A workaround isto introduce a special case for gas and value and just re-check whether theyare present at the point of overload resolution.(这句我怕翻译的不准确,引用原文)

同样我们也可以使用delegatecall(),它与call方法的区别在于,仅仅是代码会执行,而其它方面,如(存储,余额等)都是用的当前的合约的数据。delegatecall()方法的目的是用来执行另一个合约中的库代码。所以开发者需要保证两个合约中的存储变量能兼容,来保证delegatecall()能顺利执行。在homestead阶段之前,仅有一个受限的callcode()方法可用,但callcode未提供对msg.sender,msg.value的访问权限。

上面的这三个方法call(),delegatecall(),callcode()都是底层的消息传递调用,最好仅在万不得已才进行使用,因为他们破坏了Solidity的类型安全。

.gas() 在call(), callcode() 和 delegatecall() 函数下都可以使用, delegatecall()不支持.value()

注解:所有合约都继承了address的成员,因此可以使用this.balance查询余额。

callcode不鼓励使用,以后会移除。

警告:上述的函数都是底层的函数,使用时要异常小心。当调用一个未知的,可能是恶意的合约时,当你把控制权交给它,它可能回调回你的合约,所以要准备好在调用返回时,应对你的状态变量可能被恶意篡改的情况。

地址常量(Address Literals)

一个能通过地址合法性检查(address checksumtest)十六进制常量就会被认为是地址,如0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF。而不能通过地址合法性检查的39到41位长的十六进制常量,会提示一个警告,被视为普通的有理数常量。

地址合法性检查定义在EIP-55

合约实例讲解

合约代码

pragma solidity ^0.4.0;contract AddrTest{event logdata(bytes data);function() payable {logdata(msg.data);}function getBalance() returns (uint) {return this.balance;}uint score = 0;function setScore(uint s) public {score = s;}function getScore() returns ( uint){return score;}}contract CallTest{function deposit() payable {}event logSendEvent(address to, uint value);function transferEther(address towho) payable {towho.transfer(10);logSendEvent(towho, 10);}function callNoFunc(address addr) returns (bool){return addr.call("tinyxiong", 1234);}function callfunc(address addr) returns (bool){bytes4 methodId = bytes4(keccak256("setScore(uint256)"));return addr.call(methodId, 100);}  function getBalance() returns (uint) {return this.balance;//0}  }

代码运行及讲解

和类型介绍篇一样,打开Remix - Solidity IDE,帖入代码,依次创建合约AddrTest及CallTest,如图:

创建合约后,可以看到,AddrTest合约内没有命令的函数,显示fallback。

AddrTest合约主要是用来说明转入以太币及调用函数式回退函数的调用情况,CallTest合约是作为AddrTest合约的调用者。
CallTest合约的函数说明:

§  transferEther(address towho): 用来给指定合约地址转账(如果一个函数需要进行货币操作,必须要带上payable关键字),转账时填入AddrTest的地址(加双引号)作为参数

§  deposit(): 函数上增加payable标识,可接收ether,并会把ether存在当前合约,(transferEther转账前需要先存款)。

§  callfunc() : 调用函数,使用指定的是函数签名。

§  callNoFunc(): 调用不存在的函数,这时被调用的合约的fallback函数会执行。

关于fallback函数用法可进一步参考这一篇:Ethereum-Development-Best-Practices及问答

下面截图演示下,存款和转账,其他的调用请读者动手练习。

存款操作如图:

完成后,可以在左下角区域查看日志Details->value。

然后进行转账,如图:

完成后,可以在左下角区域查看日志Details->logs数据,可以看到fallback函数被调用。

还可以调用AddrTest的getBalance查看余额数据。

参考文档

Solidity官方文档-类型

Solidity 教程系列2 - 地址类型介绍相关推荐

  1. 智能合约语言 Solidity 教程系列9 - 错误处理

    这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文 ...

  2. 智能合约语言 Solidity 教程系列8 - Solidity API

    这是Solidity教程系列文章第8篇介绍Solidity API,它们主要表现为内置的特殊的变量及函数,存在于全局命名空间里. <!-- more --> 写在前面 Solidity 是 ...

  3. 智能合约语言 Solidity 教程系列9 - 错误处理 1

    什么是错误处理 错误处理是指在程序发生错误时的处理方式,Solidity处理错误和我们常见的语言不一样,Solidity是通过回退状态的方式来处理错误.发生异常时会撤消当前调用(及其所有子调用)所改变 ...

  4. 无涯教程- Java 14 – Record类型介绍

    Java中Record类型是Java 14中的预览函数引入的,并且应作为普通的 不可变 数据类,用于在类和应用程序之间进行数据传输. 像Enum 一样,Record也是一个特殊的类输入Java.它旨在 ...

  5. 黑鹰红客基地VIP美工教程系列

    黑鹰红客基地VIP美工教程系列 黑鹰红客基地VIP美工教程系列 下载地址: http://down.evilarea.com/donghua/freevip/3800hk/ps/no.1.rar 中间 ...

  6. 智能合约语言Solidity 类型介绍

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 智能合约语言Solidity 类型介绍11 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合 ...

  7. WPF入门教程系列四——Dispatcher介绍

    WPF入门教程系列四--Dispatcher介绍 一.Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还 ...

  8. [Mysql教程系列]介绍一下MySQL语句设计规范以及其他规范

    点击上方"Coder编程",选择"置顶公众号" 技术文章第一时间送达! mysql.jpg 语句设计规范 1.使用预编译语句 只传参数,比传递SQL语句更高效 ...

  9. WPF入门教程系列三——Application介绍(续)

    接上文WPF入门教程系列二--Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...

  10. XAML实例教程系列 - 类型转换器(Type Converter)

    在XAML中每一个对象元素映射一个实例,而实例属性可以通过特性(Attributes)进行赋值.在实际项目开发中,对象元素的属性值可以是不同数据类型,根据需求不同,经常需要对数据类型进行转换,就需要使 ...

最新文章

  1. beego学习笔记(4):开发文档阅读(3)
  2. java中如果写设置密码,在java中编写一个多字母换位密码[关闭]
  3. Struts2国际化文件乱码解决
  4. python matplotlab.pyplot.pcolormesh() 函数,以及如何自定义画色彩图 (pcolormesh()与pcolor()的区别)
  5. JAVA中char占用多少字节_Java中char占用几个字节
  6. 在 wxWidgets 中播放声音的示例
  7. AOP 在Spring 中的应用
  8. python preference界面设置_偏好设置如何更改Preference的样式
  9. java 解密后为空_java RSA加密解密
  10. maven依赖 spark sql_Spark开发实例
  11. IDEA下的第一个springBoot
  12. 提款机转账多久到账?
  13. 在linux用sfdisk和parted 来 进行分区
  14. C# 在采集数据时的验证与登录处理
  15. SqlServer之xp_cmdshell_使用以及配置(转)
  16. 用友u8怎么导出凭证_用友U8V10.1ERP怎么生成期间损益结转凭证的图文操作教程
  17. linux系统安装详细教程
  18. 根据CTP接口计算现手、增仓、开平、对手盘 (2)
  19. 物理木板过河问题java_抖音捡木板过河
  20. 亲测UEFI启动模式的电脑安装Win10和Ubuntu双系统

热门文章

  1. [论文总结] 深度学习在农业领域应用论文笔记2
  2. 阿里巴巴Java编程规范考试
  3. 无法读源文件或磁盘_持久化(3):磁盘阵列
  4. 你需要知道的关于铁氧体磁珠的一切
  5. mysql数据库更新数据库语句_MySQL数据库之UPDATE更新语句精解
  6. excel 通用进销存(由excel+VBA+MSSQL制作)
  7. 如何使用串口来给STM32下载程序
  8. Xposed框架安装失败
  9. 三菱Q系列PLC大型程序Q01U伺服12轴 实际使用中程序
  10. 禁忌搜索算法(Tabu Search)