Solidity-函数可见性与修饰符

2018-05-10  本文已影响0人  熊猫大盗

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;

    }

}

上一篇下一篇

猜你喜欢

热点阅读