payable 修饰符的公有函数才能接受接收 Ether
如果你的合约通过一个没有 payable 修饰符的公有函数(包括构造函数和 fallback 函数)接收 Ether。将会产生一个 require 式异常
solidity 0.5将地址类型细分为address
和address payable
的目的:
它有助于强制智能合约开发人员认真考虑一个地址是否应当接收以太币,如果该地址根本不需要接收以太币,那么就应当使用
address
类型。当地址被声明为address
类型后,如果开发者试图向该地址转入以太币,就会导致编译时类型错误。
address
和address payable
类型都用来存储160位的以太坊地址,两者的区别仅在编译时存在,在编译后的合约代码中就没有区别了——也就是说,引入地址类型细分的唯一 目的:
就是帮助开发者在编译期理清一个地址的实际用途。
address payable
和address
类型的变量都表示以太坊地址,都可以使用底层的.call()
方法。从字面意思看,address payable
表示可用于支付的地址,因此在address payable
类型的变量上,你可以使用.transfer()
和.send()
方法,但是address
类型的变量则不能使用这些方法。
因此,addre