Solidity-函数可见性与修饰符
Solidity提供了四种可见性 . 分别是external,public,internal,private . 其中函数默认是public . 状态变量默认的可见性是internal .
function () { public| private | internal | external } [ pure | constant | view | payable ] [ returns () ]
一 . 可见性
1 . public
使函数和状态变量 , 在当前合约内和被继承的合约内都可以访问 . 并且使函数和状态变量成为合约对外接口.
2 . private
使函数和状态变量 , 仅在当前合约内可以访问 . 在继承的合约内不可访问 .
3 . external
外部函数是合约接口的一部分 , 所以我们可以从其它合约或通过交易来发起调用 . 一个外部函数f , 不能通过内部的方式来发起调用 , (如f()不可以,但可以通过this.f()) . 外部函数在接收大的数组数据时更加有效。
4 . internal
这样声明的函数和状态变量只能通过内部(internal)访问 . 如在当前合约中调用 , 或继承的合约里调用 . 需要注意的是不能加前缀this , 前缀this是表示通过外部(external)方式访问 .
二 . 修饰符
1 . pure
函数指定view,代表函数不能读取或修改区块链状态 .
下列操作被认为是读取区块链状态 :
获取状态变量 .
访问this.balance或.balance .
访问任何block , tx , msg的成员 . (除了msg.sig和msg.data以外)
调用任何未标记为pure的函数 .
使用包含特定操作码的内联程序集 .
2 . view
函数指定view,代表函数可以读取区块链状态 , 但不能修改区块链的状态.
下列操作被认为是修改区块链状态 :
状态变量赋值 .
触发事件 .
创建其他合同 .
使用selfdestruct .
通过调用发送Ether .
调用任何未标记的view或pure的函数 .
使用低级调用 .
使用包含特定操作码的内联程序集 .
3 . constant
函数指定constant , 与指定view是一个意思 . constant 被称为view的别名.
状态变量被指定constant ,代表它必须在编译时被赋值 .
4 . payable
函数指定了payable才能拿获取msg.value , 接收以太币 .
三 . 自定义修饰符
modifier可以用来轻易的改变一个函数的行为.可被继承,同时还可被派生的合约重写(override)
脑洞自制实例, 仅供娱乐:
pragma solidity ^0.4.21;
contract OneNightInSupermarket{
address admin; // 管理员
uint minimumCharge; // 最低消费标准
function OneNightInSupermarket(uint _initialMinimum)public{
admin= msg.sender;
minimumCharge= _initialMinimum;
}
// 发送交易的是管理员吗?
modifier AdminIsSender {
require(admin==msg.sender);
_;
}
// 消费是否高于最低消费
modifier MinimumCharge(uint _price){
require(msg.value >= _price);
_;
}
// 谁是管理员
function IamAdmin() public view AdminIsSender returns(address) {
return msg.sender;
}
// 普通用户消费,有最低消费标准
function AverageConsumption() public payable AdminIsSender MinimumCharge(minimumCharge) returns(uint,uint) {
return (msg.value, minimumCharge);
}
// 管理员随便花,没有最低消费标准
function AdminConsumption() public payable AdminIsSender returns(uint) {
return msg.value;
}
}