美文网首页
Solidity-函数可见性与修饰符

Solidity-函数可见性与修饰符

作者: 熊猫大盗 | 来源:发表于2018-05-10 09:57 被阅读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;

        }

    }

    相关文章

      网友评论

          本文标题:Solidity-函数可见性与修饰符

          本文链接:https://www.haomeiwen.com/subject/potzrftx.html